From 5ed4537979e05ee22727371393dcc7efda551ef4 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 19 May 2021 12:11:54 -0400 Subject: [PATCH] Turn on `noUnusedLocals`, `noImplicitReturns`, `importsNotUsedAsValues: error`, and `isolatedModules` (#2777) --- __mocks__/@linguiMacro.ts | 2 +- __mocks__/electron.ts | 2 +- __mocks__/imageMock.ts | 3 +- __mocks__/styleMock.ts | 2 +- integration/__tests__/app.tests.ts | 2 +- integration/__tests__/cluster-pages.tests.ts | 9 ++- .../__tests__/command-palette.tests.ts | 3 +- integration/helpers/minikube.ts | 2 +- src/common/__tests__/search-store.test.ts | 6 ++ src/common/base-store.ts | 2 +- src/common/catalog/catalog-entity-registry.ts | 2 +- src/common/cluster-ipc.ts | 17 +++--- src/common/cluster-store.ts | 4 +- src/common/event-emitter.ts | 9 ++- src/common/ipc/type-enforced-ipc.ts | 4 +- src/common/ipc/update-available.ipc.ts | 2 +- src/common/k8s/resource-stack.ts | 2 +- src/common/kube-helpers.ts | 2 +- src/common/protocol-handler/error.ts | 4 +- src/common/protocol-handler/router.ts | 6 +- src/common/utils/delay.ts | 2 +- src/common/utils/iter.ts | 36 +++++++++++- src/common/utils/saveToAppFiles.ts | 2 +- .../__tests__/extension-loader.test.ts | 2 + src/extensions/extension-loader.ts | 2 + src/extensions/extension-store.ts | 2 +- src/extensions/ipc-store.ts | 2 +- src/extensions/lens-extension.ts | 2 +- src/extensions/lens-main-extension.ts | 4 +- src/extensions/lens-renderer-extension.ts | 4 +- src/extensions/main-ipc-store.ts | 2 +- .../registries/entity-setting-registry.ts | 2 +- .../registries/kube-object-detail-registry.ts | 2 +- .../registries/kube-object-menu-registry.ts | 2 +- .../registries/kube-object-status-registry.ts | 2 +- src/extensions/registries/page-registry.ts | 6 +- .../registries/status-bar-registry.ts | 2 +- src/extensions/renderer-api/k8s-api.ts | 14 +++-- src/extensions/renderer-api/navigation.ts | 2 +- src/extensions/renderer-ipc-store.ts | 2 +- src/main/__test__/kube-auth-proxy.test.ts | 8 ++- src/main/__test__/kubeconfig-manager.test.ts | 14 ++++- src/main/catalog-pusher.ts | 4 +- .../__test__/kubeconfig-sync.test.ts | 4 +- src/main/catalog-sources/kubeconfig-sync.ts | 4 +- .../base-cluster-detector.ts | 4 +- .../cluster-detectors/detector-registry.ts | 6 +- src/main/cluster-manager.ts | 2 +- src/main/context-handler.ts | 11 ++-- src/main/extension-filesystem.ts | 2 +- src/main/helm/__mocks__/helm-chart-manager.ts | 2 +- src/main/helm/helm-release-manager.ts | 2 +- src/main/helm/helm-service.ts | 4 +- src/main/k8s-request.ts | 4 +- src/main/kubeconfig-manager.ts | 3 +- src/main/lens-binary.ts | 4 +- src/main/menu.ts | 2 +- src/main/prometheus/helm.ts | 6 +- src/main/prometheus/lens.ts | 8 +-- src/main/prometheus/operator.ts | 8 +-- src/main/prometheus/provider-registry.ts | 6 +- src/main/prometheus/stacklight.ts | 8 +-- src/main/protocol-handler/router.ts | 2 +- src/main/proxy/index.ts | 2 + src/main/proxy/lens-proxy.ts | 8 +-- src/main/proxy/ws-upgrade.ts | 4 +- src/main/resource-applier.ts | 2 +- src/main/router.ts | 4 +- src/main/routes/helm-route.ts | 2 +- src/main/routes/kubeconfig-route.ts | 4 +- src/main/routes/metrics-route.ts | 4 +- src/main/routes/port-forward-route.ts | 2 +- src/main/routes/resource-applier-route.ts | 2 +- src/main/routes/version-route.ts | 2 +- src/main/shell-session/node-shell-session.ts | 6 +- src/main/shell-session/shell-session.ts | 4 +- src/main/tray.ts | 2 +- src/main/utils/get-port.ts | 2 +- src/main/utils/http-responses.ts | 2 +- src/migrations/cluster-store/snap.ts | 2 +- src/migrations/hotbar-store/5.0.0-alpha.0.ts | 2 +- src/migrations/hotbar-store/5.0.0-alpha.2.ts | 2 +- src/migrations/migration-wrapper.ts | 2 +- src/renderer/api/__tests__/crd.test.ts | 2 +- src/renderer/api/catalog-entity.ts | 9 ++- src/renderer/api/endpoints/configmap.api.ts | 2 +- src/renderer/api/endpoints/cron-job.api.ts | 2 +- src/renderer/api/endpoints/daemon-set.api.ts | 2 +- .../api/endpoints/helm-releases.api.ts | 4 +- src/renderer/api/endpoints/job.api.ts | 10 +--- src/renderer/api/endpoints/metrics.api.ts | 6 +- .../endpoints/persistent-volume-claims.api.ts | 2 +- .../api/endpoints/persistent-volume.api.ts | 6 +- src/renderer/api/endpoints/replica-set.api.ts | 2 +- .../api/endpoints/resource-applier.api.ts | 2 +- .../api/endpoints/resource-quota.api.ts | 2 +- src/renderer/api/endpoints/secret.api.ts | 2 +- .../api/endpoints/stateful-set.api.ts | 2 +- src/renderer/api/kube-api.ts | 4 +- src/renderer/api/kube-object.ts | 6 +- src/renderer/api/kube-watch-api.ts | 4 +- src/renderer/api/terminal-api.ts | 2 +- .../+apps-helm-charts/helm-charts.tsx | 4 +- .../+apps-releases/release-menu.tsx | 4 +- .../+apps-releases/release.store.ts | 4 +- .../components/+apps-releases/releases.tsx | 4 +- .../+catalog/catalog-add-button.tsx | 2 +- .../+catalog/catalog-entity.store.ts | 2 +- .../components/+cluster/cluster-issues.tsx | 2 +- .../components/+cluster/cluster-metrics.tsx | 2 +- .../+config-autoscalers/hpa-details.tsx | 2 +- .../components/+config-autoscalers/hpa.tsx | 6 +- .../limit-range-details.tsx | 2 +- .../+config-limit-ranges/limit-ranges.tsx | 6 +- .../+config-maps/config-map-details.tsx | 6 +- .../components/+config-maps/config-maps.tsx | 6 +- .../pod-disruption-budgets-details.tsx | 4 +- .../pod-disruption-budgets.tsx | 2 +- .../resource-quota-details.tsx | 4 +- .../resource-quotas.tsx | 6 +- .../+config-secrets/add-secret-dialog.tsx | 2 +- .../+config-secrets/secret-details.tsx | 4 +- .../components/+config-secrets/secrets.tsx | 6 +- .../components/+config/config.route.ts | 4 +- .../+custom-resources/crd-details.tsx | 4 +- .../components/+custom-resources/crd-list.tsx | 2 +- .../crd-resource-details.tsx | 4 +- .../+custom-resources/crd-resource.store.ts | 2 +- .../+custom-resources/crd-resources.tsx | 8 +-- .../components/+custom-resources/crd.store.ts | 6 +- .../+entity-settings/entity-settings.tsx | 6 +- .../components/+events/event-details.tsx | 4 +- .../components/+events/event.store.ts | 4 +- src/renderer/components/+events/events.tsx | 6 +- .../components/+events/kube-event-details.tsx | 2 +- .../components/+events/kube-event-icon.tsx | 4 +- .../+extensions/extension-install.store.ts | 3 +- .../+extensions/extensions.route.ts | 2 +- .../components/+extensions/extensions.tsx | 2 +- .../+namespaces/add-namespace-dialog.tsx | 2 +- .../+namespaces/namespace-details.tsx | 4 +- .../+namespaces/namespace-select-filter.tsx | 2 +- .../components/+namespaces/namespaces.tsx | 4 +- .../+network-endpoints/endpoint-details.tsx | 6 +- .../+network-endpoints/endpoints.tsx | 6 +- .../+network-ingresses/ingress-charts.tsx | 4 +- .../+network-ingresses/ingress-details.tsx | 4 +- .../+network-ingresses/ingresses.tsx | 6 +- .../+network-policies/network-policies.tsx | 6 +- .../network-policy-details.tsx | 13 ++--- .../service-details-endpoint.tsx | 2 +- .../+network-services/service-details.tsx | 6 +- .../service-port-component.tsx | 2 +- .../components/+network-services/services.tsx | 6 +- .../components/+network/network.route.ts | 4 +- .../components/+nodes/node-charts.tsx | 4 +- .../components/+nodes/node-details.tsx | 6 +- src/renderer/components/+nodes/nodes.store.ts | 2 +- src/renderer/components/+nodes/nodes.tsx | 10 ++-- .../pod-security-policies.tsx | 2 +- .../pod-security-policy-details.tsx | 6 +- .../storage-class-details.tsx | 4 +- .../+storage-classes/storage-classes.tsx | 6 +- .../volume-claim-details.tsx | 2 +- .../volume-claim-disk-chart.tsx | 2 +- .../+storage-volume-claims/volume-claims.tsx | 4 +- .../+storage-volumes/volume-details-list.tsx | 2 +- .../+storage-volumes/volumes.store.ts | 2 +- .../components/+storage-volumes/volumes.tsx | 4 +- .../components/+storage/storage.route.ts | 4 +- .../add-role-binding-dialog.tsx | 2 +- .../role-binding-details.tsx | 4 +- .../role-bindings.tsx | 6 +- .../+user-management-roles/role-details.tsx | 6 +- .../+user-management-roles/roles.tsx | 6 +- .../service-accounts-secret.tsx | 2 +- .../service-accounts.tsx | 8 +-- .../+workloads-cronjobs/cronjob-details.tsx | 2 +- .../+workloads-cronjobs/cronjobs.tsx | 6 +- .../daemonset-details.tsx | 4 +- .../+workloads-daemonsets/daemonsets.tsx | 6 +- .../deployment-details.tsx | 4 +- .../deployment-replicasets.tsx | 2 +- .../+workloads-deployments/deployments.tsx | 6 +- .../+workloads-jobs/job-details.tsx | 2 +- .../components/+workloads-jobs/jobs.tsx | 6 +- .../overview-workload-status.tsx | 2 +- .../+workloads-overview/overview.tsx | 4 +- .../__tests__/pod-tolerations.test.tsx | 8 ++- .../+workloads-pods/container-charts.tsx | 2 +- .../components/+workloads-pods/pod-charts.tsx | 4 +- .../+workloads-pods/pod-container-env.tsx | 18 +++--- .../+workloads-pods/pod-container-port.tsx | 2 +- .../pod-details-affinities.tsx | 2 +- .../+workloads-pods/pod-details-container.tsx | 6 +- .../+workloads-pods/pod-details-list.tsx | 4 +- .../+workloads-pods/pod-details-statuses.tsx | 2 +- .../pod-details-tolerations.tsx | 2 +- .../+workloads-pods/pod-details.tsx | 2 +- .../+workloads-pods/pod-tolerations.tsx | 2 +- .../components/+workloads-pods/pods.store.ts | 4 +- .../components/+workloads-pods/pods.tsx | 4 +- .../replicaset-details.tsx | 4 +- .../+workloads-replicasets/replicasets.tsx | 8 +-- .../statefulset-details.tsx | 4 +- .../+workloads-statefulsets/statefulsets.tsx | 8 +-- .../components/+workloads/workloads.route.ts | 2 +- .../components/+workloads/workloads.stores.ts | 4 +- src/renderer/components/app.tsx | 4 ++ src/renderer/components/button/button.tsx | 7 +-- src/renderer/components/chart/bar-chart.tsx | 2 +- .../components/chart/zebra-stripes.plugin.ts | 4 +- .../cluster-manager/bottom-bar.test.tsx | 6 ++ .../components/cluster-manager/bottom-bar.tsx | 4 +- .../cluster-manager/cluster-status.tsx | 2 +- .../cluster-manager/cluster-view.tsx | 6 +- .../cluster-settings/cluster-settings.tsx | 2 +- .../cluster-accessible-namespaces.tsx | 2 +- .../components/cluster-home-dir-setting.tsx | 2 +- .../components/cluster-kubeconfig.tsx | 2 +- .../components/cluster-metrics-setting.tsx | 2 +- .../components/cluster-name-setting.tsx | 2 +- .../components/cluster-prometheus-setting.tsx | 2 +- .../components/cluster-proxy-setting.tsx | 2 +- .../components/show-metrics.tsx | 2 +- .../dock/__test__/dock-tabs.test.tsx | 6 ++ .../__test__/log-resource-selector.test.tsx | 8 ++- .../dock/__test__/log-tab.store.test.ts | 5 ++ .../components/dock/create-resource.store.ts | 4 -- .../components/dock/create-resource.tsx | 15 +++-- src/renderer/components/dock/dock-tabs.tsx | 36 +++++------- src/renderer/components/dock/dock.store.ts | 2 +- src/renderer/components/dock/dock.tsx | 40 ++++++++----- .../components/dock/edit-resource.store.ts | 8 +-- .../components/dock/edit-resource.tsx | 6 +- src/renderer/components/dock/editor-panel.tsx | 2 +- src/renderer/components/dock/info-panel.tsx | 2 +- .../components/dock/install-chart.store.ts | 12 ++-- src/renderer/components/dock/log-controls.tsx | 2 +- src/renderer/components/dock/log-list.tsx | 2 +- .../components/dock/log-resource-selector.tsx | 2 +- src/renderer/components/dock/log-tab.store.ts | 6 +- src/renderer/components/dock/log.store.ts | 6 +- src/renderer/components/dock/logs.tsx | 2 +- .../components/dock/terminal-window.tsx | 4 +- .../components/dock/terminal.store.ts | 20 ++----- src/renderer/components/dock/terminal.ts | 2 +- .../components/dock/upgrade-chart.store.ts | 25 +++----- .../components/dock/upgrade-chart.tsx | 8 +-- .../components/hotbar/hotbar-entity-icon.tsx | 2 +- .../components/hotbar/hotbar-icon.tsx | 2 +- src/renderer/components/icon/icon.tsx | 2 +- .../components/input/drop-file-input.tsx | 5 +- src/renderer/components/input/input.tsx | 5 +- .../components/input/input_validators.ts | 2 +- .../components/input/search-input-url.tsx | 2 +- .../item-object-list/item-list-layout.tsx | 16 ++--- .../kube-object-status-icon.tsx | 2 +- .../kube-object/kube-object-details.tsx | 2 +- .../kube-object/kube-object-list-layout.tsx | 4 +- .../kube-object/kube-object-menu.tsx | 4 +- .../kube-object/kube-object-meta.tsx | 2 +- .../kubeconfig-dialog/kubeconfig-dialog.tsx | 2 +- .../components/layout/main-layout-header.tsx | 2 +- .../components/layout/sidebar-item.tsx | 2 +- src/renderer/components/layout/sidebar.tsx | 2 +- src/renderer/components/menu/menu-actions.tsx | 2 +- .../notifications/notifications.store.tsx | 4 +- .../resource-metrics-text.tsx | 2 +- .../resource-metrics/resource-metrics.tsx | 2 +- .../components/scroll-spy/scroll-spy.tsx | 2 +- src/renderer/components/table/table-cell.tsx | 4 +- src/renderer/components/table/table-row.tsx | 2 +- .../components/table/table.storage.ts | 2 +- src/renderer/components/table/table.tsx | 58 ++++++++++--------- .../components/virtual-list/virtual-list.tsx | 4 +- src/renderer/components/wizard/wizard.tsx | 2 +- src/renderer/hooks/useMutationObserver.ts | 2 + src/renderer/hooks/useStorage.ts | 2 +- src/renderer/kube-object.store.ts | 12 ++-- src/renderer/navigation/page-param.ts | 2 +- src/renderer/utils/display-booleans.ts | 2 +- src/renderer/utils/prevDefault.ts | 2 +- src/renderer/utils/rbac.ts | 2 +- tsconfig.json | 6 +- webpack.extensions.ts | 2 +- webpack.main.ts | 2 +- 287 files changed, 704 insertions(+), 628 deletions(-) diff --git a/__mocks__/@linguiMacro.ts b/__mocks__/@linguiMacro.ts index 88be664f85..35fca119d9 100644 --- a/__mocks__/@linguiMacro.ts +++ b/__mocks__/@linguiMacro.ts @@ -18,7 +18,7 @@ * 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. */ -module.exports = { +export default { Trans: ({ children }: { children: React.ReactNode }) => children, t: (message: string) => message }; diff --git a/__mocks__/electron.ts b/__mocks__/electron.ts index 8a8408db88..0a369eea4e 100644 --- a/__mocks__/electron.ts +++ b/__mocks__/electron.ts @@ -18,7 +18,7 @@ * 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. */ -module.exports = { +export default { require: jest.fn(), match: jest.fn(), app: { diff --git a/__mocks__/imageMock.ts b/__mocks__/imageMock.ts index 31effc071f..f80e118413 100644 --- a/__mocks__/imageMock.ts +++ b/__mocks__/imageMock.ts @@ -18,4 +18,5 @@ * 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. */ -module.exports = {}; + +export default {}; diff --git a/__mocks__/styleMock.ts b/__mocks__/styleMock.ts index 31effc071f..375355db28 100644 --- a/__mocks__/styleMock.ts +++ b/__mocks__/styleMock.ts @@ -18,4 +18,4 @@ * 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. */ -module.exports = {}; +export default {}; diff --git a/integration/__tests__/app.tests.ts b/integration/__tests__/app.tests.ts index c3a93200d2..d433513f1e 100644 --- a/integration/__tests__/app.tests.ts +++ b/integration/__tests__/app.tests.ts @@ -25,7 +25,7 @@ TEST_NAMESPACE namespace. This is done to minimize destructive impact of the cluster tests on an existing minikube cluster and vice versa. */ -import { Application } from "spectron"; +import type { Application } from "spectron"; import * as utils from "../helpers/utils"; import { listHelmRepositories } from "../helpers/utils"; import { fail } from "assert"; diff --git a/integration/__tests__/cluster-pages.tests.ts b/integration/__tests__/cluster-pages.tests.ts index e0afc15c4c..ca5e2aaad3 100644 --- a/integration/__tests__/cluster-pages.tests.ts +++ b/integration/__tests__/cluster-pages.tests.ts @@ -18,7 +18,14 @@ * 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. */ -import { Application } from "spectron"; + +/* + Cluster tests are run if there is a pre-existing minikube cluster. Before running cluster tests the TEST_NAMESPACE + namespace is removed, if it exists, from the minikube cluster. Resources are created as part of the cluster tests in the + TEST_NAMESPACE namespace. This is done to minimize destructive impact of the cluster tests on an existing minikube + cluster and vice versa. +*/ +import type { Application } from "spectron"; import * as utils from "../helpers/utils"; import { minikubeReady, waitForMinikubeDashboard } from "../helpers/minikube"; import { exec } from "child_process"; diff --git a/integration/__tests__/command-palette.tests.ts b/integration/__tests__/command-palette.tests.ts index 118897b842..03ef6e23ae 100644 --- a/integration/__tests__/command-palette.tests.ts +++ b/integration/__tests__/command-palette.tests.ts @@ -18,7 +18,8 @@ * 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. */ -import { Application } from "spectron"; + +import type { Application } from "spectron"; import * as utils from "../helpers/utils"; jest.setTimeout(60000); diff --git a/integration/helpers/minikube.ts b/integration/helpers/minikube.ts index 50e325ccf0..c94b31aa93 100644 --- a/integration/helpers/minikube.ts +++ b/integration/helpers/minikube.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { spawnSync } from "child_process"; -import { Application } from "spectron"; +import type { Application } from "spectron"; export function minikubeReady(testNamespace: string): boolean { // determine if minikube is running diff --git a/src/common/__tests__/search-store.test.ts b/src/common/__tests__/search-store.test.ts index ac5f13e7cf..b4c99b7e19 100644 --- a/src/common/__tests__/search-store.test.ts +++ b/src/common/__tests__/search-store.test.ts @@ -23,6 +23,12 @@ import { SearchStore } from "../search-store"; import { Console } from "console"; import { stdout, stderr } from "process"; +jest.mock("electron", () => ({ + app: { + getPath: () => "/foo", + }, +})); + console = new Console(stdout, stderr); let searchStore: SearchStore = null; diff --git a/src/common/base-store.ts b/src/common/base-store.ts index f30a7c7bad..608862c2af 100644 --- a/src/common/base-store.ts +++ b/src/common/base-store.ts @@ -21,7 +21,7 @@ import path from "path"; import Config from "conf"; -import { Options as ConfOptions } from "conf/dist/source/types"; +import type { Options as ConfOptions } from "conf/dist/source/types"; import { app, ipcMain, IpcMainEvent, ipcRenderer, IpcRendererEvent, remote } from "electron"; import { IReactionOptions, observable, reaction, runInAction, when } from "mobx"; import Singleton from "./utils/singleton"; diff --git a/src/common/catalog/catalog-entity-registry.ts b/src/common/catalog/catalog-entity-registry.ts index 7438a43949..80a6c66a4c 100644 --- a/src/common/catalog/catalog-entity-registry.ts +++ b/src/common/catalog/catalog-entity-registry.ts @@ -20,7 +20,7 @@ */ import { action, computed, observable, IComputedValue, IObservableArray } from "mobx"; -import { CatalogEntity } from "./catalog-entity"; +import type { CatalogEntity } from "./catalog-entity"; import { iter } from "../utils"; export class CatalogEntityRegistry { diff --git a/src/common/cluster-ipc.ts b/src/common/cluster-ipc.ts index 863ddafcd0..718151c3ed 100644 --- a/src/common/cluster-ipc.ts +++ b/src/common/cluster-ipc.ts @@ -35,11 +35,9 @@ export const clusterKubectlDeleteAllHandler = "cluster:kubectl-delete-all"; if (ipcMain) { handleRequest(clusterActivateHandler, (event, clusterId: ClusterId, force = false) => { - const cluster = ClusterStore.getInstance().getById(clusterId); - - if (cluster) { - return cluster.activate(force); - } + return ClusterStore.getInstance() + .getById(clusterId) + ?.activate(force); }); handleRequest(clusterSetFrameIdHandler, (event: IpcMainInvokeEvent, clusterId: ClusterId) => { @@ -47,15 +45,14 @@ if (ipcMain) { if (cluster) { clusterFrameMap.set(cluster.id, { frameId: event.frameId, processId: event.processId }); - - return cluster.pushState(); + cluster.pushState(); } }); handleRequest(clusterRefreshHandler, (event, clusterId: ClusterId) => { - const cluster = ClusterStore.getInstance().getById(clusterId); - - if (cluster) return cluster.refresh({ refreshMetadata: true }); + return ClusterStore.getInstance() + .getById(clusterId) + ?.refresh({ refreshMetadata: true }); }); handleRequest(clusterDisconnectHandler, (event, clusterId: ClusterId) => { diff --git a/src/common/cluster-store.ts b/src/common/cluster-store.ts index 40c2168818..89c71255c2 100644 --- a/src/common/cluster-store.ts +++ b/src/common/cluster-store.ts @@ -30,9 +30,9 @@ import logger from "../main/logger"; import { appEventBus } from "./event-bus"; import { dumpConfigYaml } from "./kube-helpers"; import { saveToAppFiles } from "./utils/saveToAppFiles"; -import { KubeConfig } from "@kubernetes/client-node"; +import type { KubeConfig } from "@kubernetes/client-node"; import { handleRequest, requestMain, subscribeToBroadcast, unsubscribeAllFromBroadcast } from "./ipc"; -import { ResourceType } from "../renderer/components/cluster-settings/components/cluster-metrics-setting"; +import type { ResourceType } from "../renderer/components/cluster-settings/components/cluster-metrics-setting"; import { disposer, noop } from "./utils"; export interface ClusterIconUpload { diff --git a/src/common/event-emitter.ts b/src/common/event-emitter.ts index 628a37d44a..5ff785d431 100644 --- a/src/common/event-emitter.ts +++ b/src/common/event-emitter.ts @@ -53,12 +53,11 @@ export class EventEmitter { emit(...data: D) { [...this.listeners].every(([callback, options]) => { - if (options.once) this.removeListener(callback); - const result = callback(...data); + if (options.once) { + this.removeListener(callback); + } - if (result === false) return; // break cycle - - return true; + return callback(...data) !== false; }); } } diff --git a/src/common/ipc/type-enforced-ipc.ts b/src/common/ipc/type-enforced-ipc.ts index 035ffcd77e..a490b1d384 100644 --- a/src/common/ipc/type-enforced-ipc.ts +++ b/src/common/ipc/type-enforced-ipc.ts @@ -19,10 +19,10 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +import type { EventEmitter } from "events"; import { ipcMain } from "electron"; -import { EventEmitter } from "events"; import logger from "../../main/logger"; -import { Disposer } from "../utils"; +import type { Disposer } from "../utils"; export type ListenerEvent = Parameters[1]>[0]; export type ListVerifier = (args: unknown[]) => args is T; diff --git a/src/common/ipc/update-available.ipc.ts b/src/common/ipc/update-available.ipc.ts index 5fc1a17954..87ec740f44 100644 --- a/src/common/ipc/update-available.ipc.ts +++ b/src/common/ipc/update-available.ipc.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { UpdateInfo } from "electron-updater"; +import type { UpdateInfo } from "electron-updater"; export const UpdateAvailableChannel = "update-available"; export const AutoUpdateLogPrefix = "[UPDATE-CHECKER]"; diff --git a/src/common/k8s/resource-stack.ts b/src/common/k8s/resource-stack.ts index 01c7ee84b8..9ea9d2609f 100644 --- a/src/common/k8s/resource-stack.ts +++ b/src/common/k8s/resource-stack.ts @@ -22,7 +22,7 @@ import fse from "fs-extra"; import path from "path"; import hb from "handlebars"; import { ResourceApplier } from "../../main/resource-applier"; -import { KubernetesCluster } from "../catalog-entities"; +import type { KubernetesCluster } from "../catalog-entities"; import logger from "../../main/logger"; import { app } from "electron"; import { requestMain } from "../ipc"; diff --git a/src/common/kube-helpers.ts b/src/common/kube-helpers.ts index 0c2bde47e6..737c767cf2 100644 --- a/src/common/kube-helpers.ts +++ b/src/common/kube-helpers.ts @@ -230,7 +230,7 @@ export function getNodeWarningConditions(node: V1Node) { * * Note: This function returns an error instead of throwing it, returning `undefined` if the validation passes */ -export function validateKubeConfig(config: KubeConfig, contextName: string, validationOpts: KubeConfigValidationOpts = {}): Error | undefined { +export function validateKubeConfig(config: KubeConfig, contextName: string, validationOpts: KubeConfigValidationOpts = {}): Error | void { try { // we only receive a single context, cluster & user object here so lets validate them as this // will be called when we add a new cluster to Lens diff --git a/src/common/protocol-handler/error.ts b/src/common/protocol-handler/error.ts index c36106ae7a..c08d867766 100644 --- a/src/common/protocol-handler/error.ts +++ b/src/common/protocol-handler/error.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import Url from "url-parse"; +import type Url from "url-parse"; export enum RoutingErrorType { INVALID_PROTOCOL = "invalid-protocol", @@ -52,6 +52,8 @@ export class RoutingError extends Error { return "no extension ID"; case RoutingErrorType.MISSING_EXTENSION: return "extension not found"; + default: + return `unknown error: ${this.type}`; } } } diff --git a/src/common/protocol-handler/router.ts b/src/common/protocol-handler/router.ts index 30facd7649..59101b5aa7 100644 --- a/src/common/protocol-handler/router.ts +++ b/src/common/protocol-handler/router.ts @@ -24,12 +24,12 @@ import { countBy } from "lodash"; import { Singleton } from "../utils"; import { pathToRegexp } from "path-to-regexp"; import logger from "../../main/logger"; -import Url from "url-parse"; +import type Url from "url-parse"; import { RoutingError, RoutingErrorType } from "./error"; import { ExtensionsStore } from "../../extensions/extensions-store"; import { ExtensionLoader } from "../../extensions/extension-loader"; -import { LensExtension } from "../../extensions/lens-extension"; -import { RouteHandler, RouteParams } from "../../extensions/registries/protocol-handler-registry"; +import type { LensExtension } from "../../extensions/lens-extension"; +import type { RouteHandler, RouteParams } from "../../extensions/registries/protocol-handler-registry"; // IPC channel for protocol actions. Main broadcasts the open-url events to this channel. export const ProtocolHandlerIpcPrefix = "protocol-handler"; diff --git a/src/common/utils/delay.ts b/src/common/utils/delay.ts index c79d616dfe..409daca125 100644 --- a/src/common/utils/delay.ts +++ b/src/common/utils/delay.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { AbortController } from "abort-controller"; +import type { AbortController } from "abort-controller"; /** * Return a promise that will be resolved after at least `timeout` ms have diff --git a/src/common/utils/iter.ts b/src/common/utils/iter.ts index 5a7daaaecb..277c58213e 100644 --- a/src/common/utils/iter.ts +++ b/src/common/utils/iter.ts @@ -19,6 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +export type Falsey = false | 0 | "" | null | undefined; + /** * Create a new type safe empty Iterable * @returns An `Iterable` that yields 0 items @@ -57,6 +59,36 @@ export function* map(src: Iterable, fn: (from: T) => U): Iterable { } } +/** + * The single layer flattening of an iterator, discarding `Falsey` values. + * @param src A type that can be iterated over + * @param fn The function that returns either an iterable over items that should be filtered out or a `Falsey` value indicating that it should be ignored + */ +export function* filterFlatMap(src: Iterable, fn: (from: T) => Iterable | Falsey): Iterable { + for (const from of src) { + if (!from) { + continue; + } + + const mapping = fn(from); + + if (!mapping) { + continue; + } + + for (const mapped of mapping) { + if (mapped) { + yield mapped; + } + } + } +} + +/** + * Returns a new iterator that yields the items that each call to `fn` would produce + * @param src A type that can be iterated over + * @param fn A function that returns an iterator + */ export function* flatMap(src: Iterable, fn: (from: T) => Iterable): Iterable { for (const from of src) { yield* fn(from); @@ -83,7 +115,7 @@ export function* filter(src: Iterable, fn: (from: T) => any): Iterable * @param src A type that can be iterated over * @param fn The function that is called for each value */ -export function* filterMap(src: Iterable, fn: (from: T) => U): Iterable { +export function* filterMap(src: Iterable, fn: (from: T) => U | Falsey): Iterable { for (const from of src) { const res = fn(from); @@ -99,7 +131,7 @@ export function* filterMap(src: Iterable, fn: (from: T) => U): Iterable * @param src A type that can be iterated over * @param fn The function that is called for each value */ -export function* filterMapStrict(src: Iterable, fn: (from: T) => U): Iterable { +export function* filterMapStrict(src: Iterable, fn: (from: T) => U | null | undefined): Iterable { for (const from of src) { const res = fn(from); diff --git a/src/common/utils/saveToAppFiles.ts b/src/common/utils/saveToAppFiles.ts index f5e1710379..b957cdb38e 100644 --- a/src/common/utils/saveToAppFiles.ts +++ b/src/common/utils/saveToAppFiles.ts @@ -23,7 +23,7 @@ import path from "path"; import { app, remote } from "electron"; import { ensureDirSync, writeFileSync } from "fs-extra"; -import { WriteFileOptions } from "fs"; +import type { WriteFileOptions } from "fs"; export function saveToAppFiles(filePath: string, contents: any, options?: WriteFileOptions): string { const absPath = path.resolve((app || remote.app).getPath("userData"), filePath); diff --git a/src/extensions/__tests__/extension-loader.test.ts b/src/extensions/__tests__/extension-loader.test.ts index f0a631c2ee..5e0844d02d 100644 --- a/src/extensions/__tests__/extension-loader.test.ts +++ b/src/extensions/__tests__/extension-loader.test.ts @@ -77,6 +77,8 @@ jest.mock( ], ]; } + + return []; }), on: jest.fn( (channel: string, listener: (event: any, ...args: any[]) => void) => { diff --git a/src/extensions/extension-loader.ts b/src/extensions/extension-loader.ts index bbb62aec87..b024ddd761 100644 --- a/src/extensions/extension-loader.ts +++ b/src/extensions/extension-loader.ts @@ -325,6 +325,8 @@ export class ExtensionLoader extends Singleton { } catch (error) { logger.error(`${logModule}: can't load extension main at ${extAbsolutePath}: ${error}`, { extension, error }); } + + return null; } getExtension(extId: LensExtensionId): InstalledExtension { diff --git a/src/extensions/extension-store.ts b/src/extensions/extension-store.ts index 7317706691..2c5eb44262 100644 --- a/src/extensions/extension-store.ts +++ b/src/extensions/extension-store.ts @@ -21,7 +21,7 @@ import { BaseStore } from "../common/base-store"; import * as path from "path"; -import { LensExtension } from "./lens-extension"; +import type { LensExtension } from "./lens-extension"; export abstract class ExtensionStore extends BaseStore { protected extension: LensExtension; diff --git a/src/extensions/ipc-store.ts b/src/extensions/ipc-store.ts index 541f7b2914..275522338c 100644 --- a/src/extensions/ipc-store.ts +++ b/src/extensions/ipc-store.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Singleton } from "../common/utils"; -import { LensExtension } from "./lens-extension"; +import type { LensExtension } from "./lens-extension"; import { createHash } from "crypto"; import { broadcastMessage } from "../common/ipc"; diff --git a/src/extensions/lens-extension.ts b/src/extensions/lens-extension.ts index d9df2c9993..b6faf2e491 100644 --- a/src/extensions/lens-extension.ts +++ b/src/extensions/lens-extension.ts @@ -23,7 +23,7 @@ import type { InstalledExtension } from "./extension-discovery"; import { action, observable, reaction } from "mobx"; import { FilesystemProvisionerStore } from "../main/extension-filesystem"; import logger from "../main/logger"; -import { ProtocolHandlerRegistration } from "./registries"; +import type { ProtocolHandlerRegistration } from "./registries"; import { disposer } from "../common/utils"; export type LensExtensionId = string; // path to manifest (package.json) diff --git a/src/extensions/lens-main-extension.ts b/src/extensions/lens-main-extension.ts index b02456c6d4..7e0ac71707 100644 --- a/src/extensions/lens-main-extension.ts +++ b/src/extensions/lens-main-extension.ts @@ -23,8 +23,8 @@ import { LensExtension } from "./lens-extension"; import { WindowManager } from "../main/window-manager"; import { getExtensionPageUrl } from "./registries/page-registry"; import { CatalogEntity, catalogEntityRegistry } from "../common/catalog"; -import { IObservableArray } from "mobx"; -import { MenuRegistration } from "./registries"; +import type { IObservableArray } from "mobx"; +import type { MenuRegistration } from "./registries"; export class LensMainExtension extends LensExtension { appMenus: MenuRegistration[] = []; diff --git a/src/extensions/lens-renderer-extension.ts b/src/extensions/lens-renderer-extension.ts index 232040ac9f..520ffae05b 100644 --- a/src/extensions/lens-renderer-extension.ts +++ b/src/extensions/lens-renderer-extension.ts @@ -26,8 +26,8 @@ import type { import type { Cluster } from "../main/cluster"; import { LensExtension } from "./lens-extension"; import { getExtensionPageUrl } from "./registries/page-registry"; -import { CommandRegistration } from "./registries/command-registry"; -import { EntitySettingRegistration } from "./registries/entity-setting-registry"; +import type { CommandRegistration } from "./registries/command-registry"; +import type { EntitySettingRegistration } from "./registries/entity-setting-registry"; export class LensRendererExtension extends LensExtension { globalPages: PageRegistration[] = []; diff --git a/src/extensions/main-ipc-store.ts b/src/extensions/main-ipc-store.ts index 1f9241a8b1..664fc0d965 100644 --- a/src/extensions/main-ipc-store.ts +++ b/src/extensions/main-ipc-store.ts @@ -21,7 +21,7 @@ import { ipcMain } from "electron"; import { IpcPrefix, IpcStore } from "./ipc-store"; import { Disposers } from "./lens-extension"; -import { LensMainExtension } from "./lens-main-extension"; +import type { LensMainExtension } from "./lens-main-extension"; export abstract class MainIpcStore extends IpcStore { constructor(extension: LensMainExtension) { diff --git a/src/extensions/registries/entity-setting-registry.ts b/src/extensions/registries/entity-setting-registry.ts index 4854b97006..80b20196c3 100644 --- a/src/extensions/registries/entity-setting-registry.ts +++ b/src/extensions/registries/entity-setting-registry.ts @@ -20,7 +20,7 @@ */ import type React from "react"; -import { CatalogEntity } from "../../common/catalog"; +import type { CatalogEntity } from "../../common/catalog"; import { BaseRegistry } from "./base-registry"; export interface EntitySettingViewProps { diff --git a/src/extensions/registries/kube-object-detail-registry.ts b/src/extensions/registries/kube-object-detail-registry.ts index 87e2338725..7cc17bbc7e 100644 --- a/src/extensions/registries/kube-object-detail-registry.ts +++ b/src/extensions/registries/kube-object-detail-registry.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import React from "react"; +import type React from "react"; import { BaseRegistry } from "./base-registry"; export interface KubeObjectDetailComponents { diff --git a/src/extensions/registries/kube-object-menu-registry.ts b/src/extensions/registries/kube-object-menu-registry.ts index c5606c3566..414d55db59 100644 --- a/src/extensions/registries/kube-object-menu-registry.ts +++ b/src/extensions/registries/kube-object-menu-registry.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import React from "react"; +import type React from "react"; import { BaseRegistry } from "./base-registry"; export interface KubeObjectMenuComponents { diff --git a/src/extensions/registries/kube-object-status-registry.ts b/src/extensions/registries/kube-object-status-registry.ts index 406b4b05f7..85373a25fd 100644 --- a/src/extensions/registries/kube-object-status-registry.ts +++ b/src/extensions/registries/kube-object-status-registry.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { KubeObject, KubeObjectStatus } from "../renderer-api/k8s-api"; +import type { KubeObject, KubeObjectStatus } from "../renderer-api/k8s-api"; import { BaseRegistry } from "./base-registry"; export interface KubeObjectStatusRegistration { diff --git a/src/extensions/registries/page-registry.ts b/src/extensions/registries/page-registry.ts index 6173527a3e..cff1c2d474 100644 --- a/src/extensions/registries/page-registry.ts +++ b/src/extensions/registries/page-registry.ts @@ -25,7 +25,7 @@ import React from "react"; import { observer } from "mobx-react"; import { BaseRegistry } from "./base-registry"; import { LensExtension, sanitizeExtensionName } from "../lens-extension"; -import { PageParam, PageParamInit } from "../../renderer/navigation/page-param"; +import type { PageParam, PageParamInit } from "../../renderer/navigation/page-param"; import { createPageParam } from "../../renderer/navigation/helpers"; export interface PageRegistration { @@ -119,9 +119,9 @@ export class PageRegistry extends BaseRegistry return components; } - protected normalizeParams(params?: PageParams): PageParams { + protected normalizeParams(params?: PageParams): PageParams | undefined { if (!params) { - return; + return undefined; } Object.entries(params).forEach(([name, value]) => { const paramInit: PageParamInit = typeof value === "object" diff --git a/src/extensions/registries/status-bar-registry.ts b/src/extensions/registries/status-bar-registry.ts index 3b91946988..0814f9cc7a 100644 --- a/src/extensions/registries/status-bar-registry.ts +++ b/src/extensions/registries/status-bar-registry.ts @@ -21,7 +21,7 @@ // Extensions API -> Status bar customizations -import React from "react"; +import type React from "react"; import { BaseRegistry } from "./base-registry"; interface StatusBarComponents { diff --git a/src/extensions/renderer-api/k8s-api.ts b/src/extensions/renderer-api/k8s-api.ts index 511597ba57..d16dbe83f5 100644 --- a/src/extensions/renderer-api/k8s-api.ts +++ b/src/extensions/renderer-api/k8s-api.ts @@ -23,9 +23,9 @@ export { isAllowedResource } from "../../common/rbac"; export { ResourceStack } from "../../common/k8s/resource-stack"; export { apiManager } from "../../renderer/api/api-manager"; export { KubeObjectStore } from "../../renderer/kube-object.store"; -export { KubeApi, forCluster, IKubeApiCluster } from "../../renderer/api/kube-api"; +export { KubeApi, forCluster } from "../../renderer/api/kube-api"; export { KubeObject } from "../../renderer/api/kube-object"; -export { Pod, podsApi, PodsApi, IPodContainer, IPodContainerStatus } from "../../renderer/api/endpoints"; +export { Pod, podsApi, PodsApi } from "../../renderer/api/endpoints"; export { Node, nodesApi, NodesApi } from "../../renderer/api/endpoints"; export { Deployment, deploymentApi, DeploymentApi } from "../../renderer/api/endpoints"; export { DaemonSet, daemonSetApi } from "../../renderer/api/endpoints"; @@ -33,7 +33,7 @@ export { StatefulSet, statefulSetApi } from "../../renderer/api/endpoints"; export { Job, jobApi } from "../../renderer/api/endpoints"; export { CronJob, cronJobApi } from "../../renderer/api/endpoints"; export { ConfigMap, configMapApi } from "../../renderer/api/endpoints"; -export { Secret, secretsApi, ISecretRef } from "../../renderer/api/endpoints"; +export { Secret, secretsApi } from "../../renderer/api/endpoints"; export { ReplicaSet, replicaSetApi } from "../../renderer/api/endpoints"; export { ResourceQuota, resourceQuotaApi } from "../../renderer/api/endpoints"; export { LimitRange, limitRangeApi } from "../../renderer/api/endpoints"; @@ -54,7 +54,13 @@ export { RoleBinding, roleBindingApi } from "../../renderer/api/endpoints"; export { ClusterRole, clusterRoleApi } from "../../renderer/api/endpoints"; export { ClusterRoleBinding, clusterRoleBindingApi } from "../../renderer/api/endpoints"; export { CustomResourceDefinition, crdApi } from "../../renderer/api/endpoints"; -export { KubeObjectStatus, KubeObjectStatusLevel } from "./kube-object-status"; +export { KubeObjectStatusLevel } from "./kube-object-status"; + +// types +export type { IKubeApiCluster } from "../../renderer/api/kube-api"; +export type { IPodContainer, IPodContainerStatus } from "../../renderer/api/endpoints"; +export type { ISecretRef } from "../../renderer/api/endpoints"; +export type { KubeObjectStatus } from "./kube-object-status"; // stores export type { EventStore } from "../../renderer/components/+events/event.store"; diff --git a/src/extensions/renderer-api/navigation.ts b/src/extensions/renderer-api/navigation.ts index f0a279227d..f8a338ac3f 100644 --- a/src/extensions/renderer-api/navigation.ts +++ b/src/extensions/renderer-api/navigation.ts @@ -25,7 +25,7 @@ import { navigation } from "../../renderer/navigation"; export type { PageParamInit, PageParam } from "../../renderer/navigation/page-param"; export { navigate, isActiveRoute } from "../../renderer/navigation/helpers"; export { hideDetails, showDetails, getDetailsUrl } from "../../renderer/components/kube-object/kube-object-details"; -export { IURLParams } from "../../common/utils/buildUrl"; +export type { IURLParams } from "../../common/utils/buildUrl"; // exporting to extensions-api version of helper without `isSystem` flag export function createPageParam(init: PageParamInit) { diff --git a/src/extensions/renderer-ipc-store.ts b/src/extensions/renderer-ipc-store.ts index 930027d0e2..75824fece7 100644 --- a/src/extensions/renderer-ipc-store.ts +++ b/src/extensions/renderer-ipc-store.ts @@ -21,7 +21,7 @@ import { ipcRenderer } from "electron"; import { IpcPrefix, IpcStore } from "./ipc-store"; import { Disposers } from "./lens-extension"; -import { LensRendererExtension } from "./lens-renderer-extension"; +import type { LensRendererExtension } from "./lens-renderer-extension"; export abstract class RendererIpcStore extends IpcStore { constructor(extension: LensRendererExtension) { diff --git a/src/main/__test__/kube-auth-proxy.test.ts b/src/main/__test__/kube-auth-proxy.test.ts index 080fd84c45..5006859637 100644 --- a/src/main/__test__/kube-auth-proxy.test.ts +++ b/src/main/__test__/kube-auth-proxy.test.ts @@ -44,6 +44,12 @@ jest.mock("winston", () => ({ } })); +jest.mock("electron", () => ({ + app: { + getPath: () => "/foo", + }, +})); + jest.mock("../../common/ipc"); jest.mock("child_process"); jest.mock("tcp-port-used"); @@ -56,7 +62,7 @@ import { ChildProcess, spawn } from "child_process"; import { bundledKubectlPath, Kubectl } from "../kubectl"; import { mock, MockProxy } from "jest-mock-extended"; import { waitUntilUsed } from "tcp-port-used"; -import { Readable } from "stream"; +import type { Readable } from "stream"; import { UserStore } from "../../common/user-store"; import { Console } from "console"; import { stdout, stderr } from "process"; diff --git a/src/main/__test__/kubeconfig-manager.test.ts b/src/main/__test__/kubeconfig-manager.test.ts index 011d0097d1..0d0bab04ad 100644 --- a/src/main/__test__/kubeconfig-manager.test.ts +++ b/src/main/__test__/kubeconfig-manager.test.ts @@ -28,6 +28,12 @@ const logger = { crit: jest.fn(), }; +jest.mock("electron", () => ({ + app: { + getPath: () => `/tmp`, + }, +})); + jest.mock("winston", () => ({ format: { colorize: jest.fn(), @@ -47,7 +53,7 @@ jest.mock("winston", () => ({ import { KubeconfigManager } from "../kubeconfig-manager"; import mockFs from "mock-fs"; import { Cluster } from "../cluster"; -import { ContextHandler } from "../context-handler"; +import type { ContextHandler } from "../context-handler"; import fse from "fs-extra"; import { loadYaml } from "@kubernetes/client-node"; import { Console } from "console"; @@ -91,7 +97,9 @@ describe("kubeconfig manager tests", () => { contextName: "minikube", kubeConfigPath: "minikube-config.yml", }); - contextHandler = jest.fn() as any; + contextHandler = { + ensureServer: () => Promise.resolve(), + } as any; jest.spyOn(KubeconfigManager.prototype, "resolveProxyUrl", "get").mockReturnValue("http://127.0.0.1:9191/foo"); }); @@ -103,7 +111,7 @@ describe("kubeconfig manager tests", () => { const kubeConfManager = new KubeconfigManager(cluster, contextHandler); expect(logger.error).not.toBeCalled(); - expect(await kubeConfManager.getPath()).toBe(`tmp${path.sep}kubeconfig-foo`); + expect(await kubeConfManager.getPath()).toBe(`${path.sep}tmp${path.sep}kubeconfig-foo`); // this causes an intermittent "ENXIO: no such device or address, read" error // const file = await fse.readFile(await kubeConfManager.getPath()); const file = fse.readFileSync(await kubeConfManager.getPath()); diff --git a/src/main/catalog-pusher.ts b/src/main/catalog-pusher.ts index 8d0b750ec6..362ba9a770 100644 --- a/src/main/catalog-pusher.ts +++ b/src/main/catalog-pusher.ts @@ -21,9 +21,9 @@ import { reaction, toJS } from "mobx"; import { broadcastMessage, subscribeToBroadcast, unsubscribeFromBroadcast } from "../common/ipc"; -import { CatalogEntityRegistry} from "../common/catalog"; +import type { CatalogEntityRegistry} from "../common/catalog"; import "../common/catalog-entities/kubernetes-cluster"; -import { Disposer } from "../common/utils"; +import type { Disposer } from "../common/utils"; export class CatalogPusher { static init(catalog: CatalogEntityRegistry) { diff --git a/src/main/catalog-sources/__test__/kubeconfig-sync.test.ts b/src/main/catalog-sources/__test__/kubeconfig-sync.test.ts index 80d7392eed..6f89e12c46 100644 --- a/src/main/catalog-sources/__test__/kubeconfig-sync.test.ts +++ b/src/main/catalog-sources/__test__/kubeconfig-sync.test.ts @@ -20,9 +20,9 @@ */ import { ObservableMap } from "mobx"; -import { CatalogEntity } from "../../../common/catalog"; +import type { CatalogEntity } from "../../../common/catalog"; import { loadFromOptions } from "../../../common/kube-helpers"; -import { Cluster } from "../../cluster"; +import type { Cluster } from "../../cluster"; import { computeDiff, configToModels } from "../kubeconfig-sync"; import mockFs from "mock-fs"; import fs from "fs"; diff --git a/src/main/catalog-sources/kubeconfig-sync.ts b/src/main/catalog-sources/kubeconfig-sync.ts index ee22a748d9..c4a8b0a514 100644 --- a/src/main/catalog-sources/kubeconfig-sync.ts +++ b/src/main/catalog-sources/kubeconfig-sync.ts @@ -24,10 +24,10 @@ import { CatalogEntity, catalogEntityRegistry } from "../../common/catalog"; import { watch } from "chokidar"; import fs from "fs"; import fse from "fs-extra"; -import stream from "stream"; +import type stream from "stream"; import { Disposer, ExtendedObservableMap, iter, Singleton } from "../../common/utils"; import logger from "../logger"; -import { KubeConfig } from "@kubernetes/client-node"; +import type { KubeConfig } from "@kubernetes/client-node"; import { loadConfigFromString, splitConfig, validateKubeConfig } from "../../common/kube-helpers"; import { Cluster } from "../cluster"; import { catalogEntityFromCluster } from "../cluster-manager"; diff --git a/src/main/cluster-detectors/base-cluster-detector.ts b/src/main/cluster-detectors/base-cluster-detector.ts index 4f01698968..1edd971cfd 100644 --- a/src/main/cluster-detectors/base-cluster-detector.ts +++ b/src/main/cluster-detectors/base-cluster-detector.ts @@ -19,8 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { RequestPromiseOptions } from "request-promise-native"; -import { Cluster } from "../cluster"; +import type { RequestPromiseOptions } from "request-promise-native"; +import type { Cluster } from "../cluster"; import { k8sRequest } from "../k8s-request"; export type ClusterDetectionResult = { diff --git a/src/main/cluster-detectors/detector-registry.ts b/src/main/cluster-detectors/detector-registry.ts index ba49d10f9e..82a09059e3 100644 --- a/src/main/cluster-detectors/detector-registry.ts +++ b/src/main/cluster-detectors/detector-registry.ts @@ -20,9 +20,9 @@ */ import { observable } from "mobx"; -import { ClusterMetadata } from "../../common/cluster-store"; -import { Cluster } from "../cluster"; -import { BaseClusterDetector, ClusterDetectionResult } from "./base-cluster-detector"; +import type { ClusterMetadata } from "../../common/cluster-store"; +import type { Cluster } from "../cluster"; +import type { BaseClusterDetector, ClusterDetectionResult } from "./base-cluster-detector"; import { ClusterIdDetector } from "./cluster-id-detector"; import { DistributionDetector } from "./distribution-detector"; import { LastSeenDetector } from "./last-seen-detector"; diff --git a/src/main/cluster-manager.ts b/src/main/cluster-manager.ts index 0d8cd3535c..211172a2a6 100644 --- a/src/main/cluster-manager.ts +++ b/src/main/cluster-manager.ts @@ -24,7 +24,7 @@ import type http from "http"; import { ipcMain } from "electron"; import { action, autorun, reaction, toJS } from "mobx"; import { ClusterStore, getClusterIdFromHost } from "../common/cluster-store"; -import { Cluster } from "./cluster"; +import type { Cluster } from "./cluster"; import logger from "./logger"; import { apiKubePrefix } from "../common/vars"; import { Singleton } from "../common/utils"; diff --git a/src/main/context-handler.ts b/src/main/context-handler.ts index f122c68e7c..6fa7ca1ef5 100644 --- a/src/main/context-handler.ts +++ b/src/main/context-handler.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import type { PrometheusProvider, PrometheusService } from "./prometheus/provider-registry"; +import type { PrometheusService } from "./prometheus/provider-registry"; import type { ClusterPrometheusPreferences } from "../common/cluster-store"; import type { Cluster } from "./cluster"; import type httpProxy from "http-proxy"; @@ -75,16 +75,15 @@ export class ContextHandler { return prometheusProviders.find(p => p.id === this.prometheusProvider); } - async getPrometheusService(): Promise { + async getPrometheusService(): Promise { const providers = this.prometheusProvider ? prometheusProviders.filter(provider => provider.id == this.prometheusProvider) : prometheusProviders; - const prometheusPromises: Promise[] = providers.map(async (provider: PrometheusProvider): Promise => { + const prometheusPromises: Promise[] = providers.map(async provider => { const apiClient = (await this.cluster.getProxyKubeconfig()).makeApiClient(CoreV1Api); - return await provider.getPrometheusService(apiClient); + return provider.getPrometheusService(apiClient); }); - const resolvedPrometheusServices = await Promise.all(prometheusPromises); - return resolvedPrometheusServices.filter(n => n)[0]; + return (await Promise.all(prometheusPromises)).find(Boolean); } async getPrometheusPath(): Promise { diff --git a/src/main/extension-filesystem.ts b/src/main/extension-filesystem.ts index 87aa67c435..5321bc791e 100644 --- a/src/main/extension-filesystem.ts +++ b/src/main/extension-filesystem.ts @@ -26,7 +26,7 @@ import fse from "fs-extra"; import { action, observable, toJS } from "mobx"; import path from "path"; import { BaseStore } from "../common/base-store"; -import { LensExtensionId } from "../extensions/lens-extension"; +import type { LensExtensionId } from "../extensions/lens-extension"; interface FSProvisionModel { extensions: Record; // extension names to paths diff --git a/src/main/helm/__mocks__/helm-chart-manager.ts b/src/main/helm/__mocks__/helm-chart-manager.ts index 8cc43e1172..7d4a5e2a65 100644 --- a/src/main/helm/__mocks__/helm-chart-manager.ts +++ b/src/main/helm/__mocks__/helm-chart-manager.ts @@ -22,7 +22,7 @@ import { HelmRepo, HelmRepoManager } from "../helm-repo-manager"; export class HelmChartManager { - private cache: any = {}; + cache: any = {}; private repo: HelmRepo; constructor(repo: HelmRepo){ diff --git a/src/main/helm/helm-release-manager.ts b/src/main/helm/helm-release-manager.ts index e35fc23b10..852c649ede 100644 --- a/src/main/helm/helm-release-manager.ts +++ b/src/main/helm/helm-release-manager.ts @@ -24,7 +24,7 @@ import fse from "fs-extra"; import * as yaml from "js-yaml"; import { promiseExec} from "../promise-exec"; import { helmCli } from "./helm-cli"; -import { Cluster } from "../cluster"; +import type { Cluster } from "../cluster"; import { toCamelCase } from "../../common/utils/camelCase"; export async function listReleases(pathToKubeconfig: string, namespace?: string) { diff --git a/src/main/helm/helm-service.ts b/src/main/helm/helm-service.ts index 2af6e7a347..73e93e5ac1 100644 --- a/src/main/helm/helm-service.ts +++ b/src/main/helm/helm-service.ts @@ -20,11 +20,11 @@ */ import semver from "semver"; -import { Cluster } from "../cluster"; +import type { Cluster } from "../cluster"; import logger from "../logger"; import { HelmRepoManager } from "./helm-repo-manager"; import { HelmChartManager } from "./helm-chart-manager"; -import { HelmChartList, RepoHelmChartList } from "../../renderer/api/endpoints/helm-charts.api"; +import type { HelmChartList, RepoHelmChartList } from "../../renderer/api/endpoints/helm-charts.api"; import { deleteRelease, getHistory, getRelease, getValues, installChart, listReleases, rollback, upgradeRelease } from "./helm-release-manager"; class HelmService { diff --git a/src/main/k8s-request.ts b/src/main/k8s-request.ts index 3206d6fca4..b501bd5ce1 100644 --- a/src/main/k8s-request.ts +++ b/src/main/k8s-request.ts @@ -21,9 +21,9 @@ import request, { RequestPromiseOptions } from "request-promise-native"; import { apiKubePrefix } from "../common/vars"; -import { IMetricsReqParams } from "../renderer/api/endpoints/metrics.api"; +import type { IMetricsReqParams } from "../renderer/api/endpoints/metrics.api"; import { LensProxy } from "./proxy/lens-proxy"; -import { Cluster } from "./cluster"; +import type { Cluster } from "./cluster"; export async function k8sRequest(cluster: Cluster, path: string, options: RequestPromiseOptions = {}): Promise { const kubeProxyUrl = `http://localhost:${LensProxy.getInstance().port}${apiKubePrefix}`; diff --git a/src/main/kubeconfig-manager.ts b/src/main/kubeconfig-manager.ts index 4332b69325..f06ee014c7 100644 --- a/src/main/kubeconfig-manager.ts +++ b/src/main/kubeconfig-manager.ts @@ -71,6 +71,7 @@ export class KubeconfigManager { await this.contextHandler.ensureServer(); this.tempFile = await this.createProxyKubeconfig(); } catch (err) { + console.log(err); logger.error(`Failed to created temp config for auth-proxy`, { err }); } } @@ -86,7 +87,7 @@ export class KubeconfigManager { protected async createProxyKubeconfig(): Promise { const { configDir, cluster } = this; const { contextName, kubeConfigPath, id } = cluster; - const tempFile = path.join(configDir, `kubeconfig-${id}`); + const tempFile = path.normalize(path.join(configDir, `kubeconfig-${id}`)); const kubeConfig = loadConfig(kubeConfigPath); const proxyConfig: Partial = { currentContext: contextName, diff --git a/src/main/lens-binary.ts b/src/main/lens-binary.ts index f989b780be..d5e9b943a7 100644 --- a/src/main/lens-binary.ts +++ b/src/main/lens-binary.ts @@ -25,7 +25,7 @@ import request from "request"; import { ensureDir, pathExists } from "fs-extra"; import * as tar from "tar"; import { isWindows } from "../common/vars"; -import winston from "winston"; +import type winston from "winston"; export type LensBinaryOpts = { version: string; @@ -204,7 +204,7 @@ export class LensBinary { throw(error); }); - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { file.on("close", () => { this.logger.debug(`${this.originalBinaryName} binary download closed`); if (!this.tarPath) fs.chmod(binaryPath, 0o755, (err) => { diff --git a/src/main/menu.ts b/src/main/menu.ts index 36dc088328..7070470679 100644 --- a/src/main/menu.ts +++ b/src/main/menu.ts @@ -21,7 +21,7 @@ import { app, BrowserWindow, dialog, ipcMain, IpcMainEvent, Menu, MenuItem, MenuItemConstructorOptions, webContents, shell } from "electron"; import { autorun } from "mobx"; -import { WindowManager } from "./window-manager"; +import type { WindowManager } from "./window-manager"; import { appName, isMac, isWindows, isTestEnv, docsUrl, supportUrl, productName } from "../common/vars"; import { addClusterURL } from "../renderer/components/+add-cluster/add-cluster.route"; import { preferencesURL } from "../renderer/components/+preferences/preferences.route"; diff --git a/src/main/prometheus/helm.ts b/src/main/prometheus/helm.ts index a4cb4b7921..0317b8499f 100644 --- a/src/main/prometheus/helm.ts +++ b/src/main/prometheus/helm.ts @@ -20,8 +20,8 @@ */ import { PrometheusLens } from "./lens"; -import { CoreV1Api } from "@kubernetes/client-node"; -import { PrometheusService } from "./provider-registry"; +import type { CoreV1Api } from "@kubernetes/client-node"; +import type { PrometheusService } from "./provider-registry"; import logger from "../logger"; export class PrometheusHelm extends PrometheusLens { @@ -29,7 +29,7 @@ export class PrometheusHelm extends PrometheusLens { name = "Helm"; rateAccuracy = "5m"; - public async getPrometheusService(client: CoreV1Api): Promise { + public async getPrometheusService(client: CoreV1Api): Promise { const labelSelector = "app=prometheus,component=server,heritage=Helm"; try { diff --git a/src/main/prometheus/lens.ts b/src/main/prometheus/lens.ts index 7b79b915c5..18c4763dc9 100644 --- a/src/main/prometheus/lens.ts +++ b/src/main/prometheus/lens.ts @@ -19,8 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { PrometheusProvider, PrometheusQueryOpts, PrometheusQuery, PrometheusService } from "./provider-registry"; -import { CoreV1Api } from "@kubernetes/client-node"; +import type { PrometheusProvider, PrometheusQueryOpts, PrometheusQuery, PrometheusService } from "./provider-registry"; +import type { CoreV1Api } from "@kubernetes/client-node"; import logger from "../logger"; export class PrometheusLens implements PrometheusProvider { @@ -28,7 +28,7 @@ export class PrometheusLens implements PrometheusProvider { name = "Lens"; rateAccuracy = "1m"; - public async getPrometheusService(client: CoreV1Api): Promise { + public async getPrometheusService(client: CoreV1Api): Promise { try { const resp = await client.readNamespacedService("prometheus", "lens-metrics"); const service = resp.body; @@ -44,7 +44,7 @@ export class PrometheusLens implements PrometheusProvider { } } - public getQueries(opts: PrometheusQueryOpts): PrometheusQuery { + public getQueries(opts: PrometheusQueryOpts): PrometheusQuery | void { switch(opts.category) { case "cluster": return { diff --git a/src/main/prometheus/operator.ts b/src/main/prometheus/operator.ts index d3338ce856..dead850056 100644 --- a/src/main/prometheus/operator.ts +++ b/src/main/prometheus/operator.ts @@ -19,8 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { PrometheusProvider, PrometheusQueryOpts, PrometheusQuery, PrometheusService } from "./provider-registry"; -import { CoreV1Api, V1Service } from "@kubernetes/client-node"; +import type { PrometheusProvider, PrometheusQueryOpts, PrometheusQuery, PrometheusService } from "./provider-registry"; +import type { CoreV1Api, V1Service } from "@kubernetes/client-node"; import logger from "../logger"; export class PrometheusOperator implements PrometheusProvider { @@ -28,7 +28,7 @@ export class PrometheusOperator implements PrometheusProvider { id = "operator"; name = "Prometheus Operator"; - public async getPrometheusService(client: CoreV1Api): Promise { + public async getPrometheusService(client: CoreV1Api): Promise { try { let service: V1Service; @@ -54,7 +54,7 @@ export class PrometheusOperator implements PrometheusProvider { } } - public getQueries(opts: PrometheusQueryOpts): PrometheusQuery { + public getQueries(opts: PrometheusQueryOpts): PrometheusQuery | void { switch(opts.category) { case "cluster": return { diff --git a/src/main/prometheus/provider-registry.ts b/src/main/prometheus/provider-registry.ts index 47c570d67e..db40ec460b 100644 --- a/src/main/prometheus/provider-registry.ts +++ b/src/main/prometheus/provider-registry.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { CoreV1Api } from "@kubernetes/client-node"; +import type { CoreV1Api } from "@kubernetes/client-node"; export type PrometheusClusterQuery = { memoryUsage: string; @@ -83,8 +83,8 @@ export type PrometheusService = { export interface PrometheusProvider { id: string; name: string; - getQueries(opts: PrometheusQueryOpts): PrometheusQuery; - getPrometheusService(client: CoreV1Api): Promise; + getQueries(opts: PrometheusQueryOpts): PrometheusQuery | void; + getPrometheusService(client: CoreV1Api): Promise; } export type PrometheusProviderList = { diff --git a/src/main/prometheus/stacklight.ts b/src/main/prometheus/stacklight.ts index ecb2467d88..0bdda6b96e 100644 --- a/src/main/prometheus/stacklight.ts +++ b/src/main/prometheus/stacklight.ts @@ -19,8 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { PrometheusProvider, PrometheusQueryOpts, PrometheusQuery, PrometheusService } from "./provider-registry"; -import { CoreV1Api } from "@kubernetes/client-node"; +import type { PrometheusProvider, PrometheusQueryOpts, PrometheusQuery, PrometheusService } from "./provider-registry"; +import type { CoreV1Api } from "@kubernetes/client-node"; import logger from "../logger"; export class PrometheusStacklight implements PrometheusProvider { @@ -28,7 +28,7 @@ export class PrometheusStacklight implements PrometheusProvider { name = "Stacklight"; rateAccuracy = "1m"; - public async getPrometheusService(client: CoreV1Api): Promise { + public async getPrometheusService(client: CoreV1Api): Promise { try { const resp = await client.readNamespacedService("prometheus-server", "stacklight"); const service = resp.body; @@ -44,7 +44,7 @@ export class PrometheusStacklight implements PrometheusProvider { } } - public getQueries(opts: PrometheusQueryOpts): PrometheusQuery { + public getQueries(opts: PrometheusQueryOpts): PrometheusQuery | void { switch(opts.category) { case "cluster": return { diff --git a/src/main/protocol-handler/router.ts b/src/main/protocol-handler/router.ts index 3142afd4ed..afc0d063b6 100644 --- a/src/main/protocol-handler/router.ts +++ b/src/main/protocol-handler/router.ts @@ -22,7 +22,7 @@ import logger from "../logger"; import * as proto from "../../common/protocol-handler"; import Url from "url-parse"; -import { LensExtension } from "../../extensions/lens-extension"; +import type { LensExtension } from "../../extensions/lens-extension"; import { broadcastMessage } from "../../common/ipc"; import { observable, when } from "mobx"; diff --git a/src/main/proxy/index.ts b/src/main/proxy/index.ts index 7c8da355d1..def9c80b5a 100644 --- a/src/main/proxy/index.ts +++ b/src/main/proxy/index.ts @@ -21,3 +21,5 @@ // Don't export the contents here // It will break the extension webpack + +export default {}; diff --git a/src/main/proxy/lens-proxy.ts b/src/main/proxy/lens-proxy.ts index 578c3bf3d3..199d48398b 100644 --- a/src/main/proxy/lens-proxy.ts +++ b/src/main/proxy/lens-proxy.ts @@ -20,13 +20,13 @@ */ import net from "net"; -import http from "http"; +import type http from "http"; import spdy from "spdy"; import httpProxy from "http-proxy"; import url from "url"; import { apiPrefix, apiKubePrefix } from "../../common/vars"; import { Router } from "../router"; -import { ContextHandler } from "../context-handler"; +import type { ContextHandler } from "../context-handler"; import logger from "../logger"; import { Singleton } from "../../common/utils"; import { ClusterManager } from "../cluster-manager"; @@ -205,13 +205,13 @@ export class LensProxy extends Singleton { return proxy; } - protected async getProxyTarget(req: http.IncomingMessage, contextHandler: ContextHandler): Promise { + protected async getProxyTarget(req: http.IncomingMessage, contextHandler: ContextHandler): Promise { if (req.url.startsWith(apiKubePrefix)) { delete req.headers.authorization; req.url = req.url.replace(apiKubePrefix, ""); const isWatchRequest = req.url.includes("watch="); - return await contextHandler.getApiTarget(isWatchRequest); + return contextHandler.getApiTarget(isWatchRequest); } } diff --git a/src/main/proxy/ws-upgrade.ts b/src/main/proxy/ws-upgrade.ts index a16bb9aad0..595b05430d 100644 --- a/src/main/proxy/ws-upgrade.ts +++ b/src/main/proxy/ws-upgrade.ts @@ -26,8 +26,8 @@ */ import * as WebSocket from "ws"; -import http from "http"; -import net from "net"; +import type http from "http"; +import type net from "net"; import url from "url"; import { NodeShellSession, LocalShellSession } from "../shell-session"; import { ClusterManager } from "../cluster-manager"; diff --git a/src/main/resource-applier.ts b/src/main/resource-applier.ts index f1c64f388c..5dd02cc617 100644 --- a/src/main/resource-applier.ts +++ b/src/main/resource-applier.ts @@ -20,7 +20,7 @@ */ import type { Cluster } from "./cluster"; -import { KubernetesObject } from "@kubernetes/client-node"; +import type { KubernetesObject } from "@kubernetes/client-node"; import { exec } from "child_process"; import fs from "fs"; import * as yaml from "js-yaml"; diff --git a/src/main/router.ts b/src/main/router.ts index d5fb3c7056..33e8b39ec9 100644 --- a/src/main/router.ts +++ b/src/main/router.ts @@ -21,10 +21,10 @@ import Call from "@hapi/call"; import Subtext from "@hapi/subtext"; -import http from "http"; +import type http from "http"; import path from "path"; import { readFile } from "fs-extra"; -import { Cluster } from "./cluster"; +import type { Cluster } from "./cluster"; import { apiPrefix, appName, publicPath, isDevelopment, webpackDevServerPort } from "../common/vars"; import { HelmApiRoute, KubeconfigRoute, MetricsRoute, PortForwardRoute, ResourceApplierApiRoute, VersionRoute } from "./routes"; import logger from "./logger"; diff --git a/src/main/routes/helm-route.ts b/src/main/routes/helm-route.ts index 4e6f0df6d2..7a4033d4f0 100644 --- a/src/main/routes/helm-route.ts +++ b/src/main/routes/helm-route.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { LensApiRequest } from "../router"; +import type { LensApiRequest } from "../router"; import { helmService } from "../helm/helm-service"; import { respondJson, respondText } from "../utils/http-responses"; import logger from "../logger"; diff --git a/src/main/routes/kubeconfig-route.ts b/src/main/routes/kubeconfig-route.ts index ecc6ecd720..f4bd7f038e 100644 --- a/src/main/routes/kubeconfig-route.ts +++ b/src/main/routes/kubeconfig-route.ts @@ -19,9 +19,9 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { LensApiRequest } from "../router"; +import type { LensApiRequest } from "../router"; import { respondJson } from "../utils/http-responses"; -import { Cluster } from "../cluster"; +import type { Cluster } from "../cluster"; import { CoreV1Api, V1Secret } from "@kubernetes/client-node"; function generateKubeConfig(username: string, secret: V1Secret, cluster: Cluster) { diff --git a/src/main/routes/metrics-route.ts b/src/main/routes/metrics-route.ts index 16293ad931..0599114219 100644 --- a/src/main/routes/metrics-route.ts +++ b/src/main/routes/metrics-route.ts @@ -20,10 +20,10 @@ */ import _ from "lodash"; -import { LensApiRequest } from "../router"; +import type { LensApiRequest } from "../router"; import { respondJson } from "../utils/http-responses"; import { Cluster, ClusterMetadataKey } from "../cluster"; -import { ClusterPrometheusMetadata } from "../../common/cluster-store"; +import type { ClusterPrometheusMetadata } from "../../common/cluster-store"; import logger from "../logger"; import { getMetrics } from "../k8s-request"; diff --git a/src/main/routes/port-forward-route.ts b/src/main/routes/port-forward-route.ts index 843f9ee527..cfd88e771f 100644 --- a/src/main/routes/port-forward-route.ts +++ b/src/main/routes/port-forward-route.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { LensApiRequest } from "../router"; +import type { LensApiRequest } from "../router"; import { spawn, ChildProcessWithoutNullStreams } from "child_process"; import { Kubectl } from "../kubectl"; import { shell } from "electron"; diff --git a/src/main/routes/resource-applier-route.ts b/src/main/routes/resource-applier-route.ts index 7119e30dc8..cb716cf1f5 100644 --- a/src/main/routes/resource-applier-route.ts +++ b/src/main/routes/resource-applier-route.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { LensApiRequest } from "../router"; +import type { LensApiRequest } from "../router"; import { respondJson, respondText } from "../utils/http-responses"; import { ResourceApplier } from "../resource-applier"; diff --git a/src/main/routes/version-route.ts b/src/main/routes/version-route.ts index f90c0929cb..14a1624489 100644 --- a/src/main/routes/version-route.ts +++ b/src/main/routes/version-route.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { LensApiRequest } from "../router"; +import type { LensApiRequest } from "../router"; import { respondJson } from "../utils/http-responses"; import { getAppVersion } from "../../common/utils"; diff --git a/src/main/shell-session/node-shell-session.ts b/src/main/shell-session/node-shell-session.ts index 92831939ed..a3cc918371 100644 --- a/src/main/shell-session/node-shell-session.ts +++ b/src/main/shell-session/node-shell-session.ts @@ -19,11 +19,11 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import * as WebSocket from "ws"; +import type * as WebSocket from "ws"; import { v4 as uuid } from "uuid"; import * as k8s from "@kubernetes/client-node"; -import { KubeConfig } from "@kubernetes/client-node"; -import { Cluster } from "../cluster"; +import type { KubeConfig } from "@kubernetes/client-node"; +import type { Cluster } from "../cluster"; import { ShellOpenError, ShellSession } from "./shell-session"; export class NodeShellSession extends ShellSession { diff --git a/src/main/shell-session/shell-session.ts b/src/main/shell-session/shell-session.ts index 3b6885592a..eaa95f0fd8 100644 --- a/src/main/shell-session/shell-session.ts +++ b/src/main/shell-session/shell-session.ts @@ -19,9 +19,9 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { Cluster } from "../cluster"; +import type { Cluster } from "../cluster"; import { Kubectl } from "../kubectl"; -import * as WebSocket from "ws"; +import type * as WebSocket from "ws"; import shellEnv from "shell-env"; import { app } from "electron"; import { clearKubeconfigEnvVars } from "../utils/clear-kube-env-vars"; diff --git a/src/main/tray.ts b/src/main/tray.ts index 90eaf9d15e..cca3090828 100644 --- a/src/main/tray.ts +++ b/src/main/tray.ts @@ -25,7 +25,7 @@ import { Menu, Tray } from "electron"; import { autorun } from "mobx"; import { showAbout } from "./menu"; import { checkForUpdates, isAutoUpdateEnabled } from "./app-updater"; -import { WindowManager } from "./window-manager"; +import type { WindowManager } from "./window-manager"; import { preferencesURL } from "../renderer/components/+preferences/preferences.route"; import logger from "./logger"; import { isDevelopment, isWindows, productName } from "../common/vars"; diff --git a/src/main/utils/get-port.ts b/src/main/utils/get-port.ts index 2f354f13e3..cdce0ce740 100644 --- a/src/main/utils/get-port.ts +++ b/src/main/utils/get-port.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { Readable } from "stream"; +import type { Readable } from "stream"; import URLParse from "url-parse"; interface GetPortArgs { diff --git a/src/main/utils/http-responses.ts b/src/main/utils/http-responses.ts index 9a1debe36f..36287806f1 100644 --- a/src/main/utils/http-responses.ts +++ b/src/main/utils/http-responses.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import http from "http"; +import type http from "http"; export function respondJson(res: http.ServerResponse, content: any, status = 200) { respond(res, JSON.stringify(content), "application/json", status); diff --git a/src/migrations/cluster-store/snap.ts b/src/migrations/cluster-store/snap.ts index c0a0430603..3dcf998f1c 100644 --- a/src/migrations/cluster-store/snap.ts +++ b/src/migrations/cluster-store/snap.ts @@ -22,7 +22,7 @@ // Fix embedded kubeconfig paths under snap config import { migration } from "../migration-wrapper"; -import { ClusterModel } from "../../common/cluster-store"; +import type { ClusterModel } from "../../common/cluster-store"; import { getAppVersion } from "../../common/utils/app-version"; import fs from "fs"; diff --git a/src/migrations/hotbar-store/5.0.0-alpha.0.ts b/src/migrations/hotbar-store/5.0.0-alpha.0.ts index 2e666fe54c..461d6e1886 100644 --- a/src/migrations/hotbar-store/5.0.0-alpha.0.ts +++ b/src/migrations/hotbar-store/5.0.0-alpha.0.ts @@ -20,7 +20,7 @@ */ // Cleans up a store that had the state related data stored -import { Hotbar } from "../../common/hotbar-store"; +import type { Hotbar } from "../../common/hotbar-store"; import { ClusterStore } from "../../common/cluster-store"; import { migration } from "../migration-wrapper"; import { v4 as uuid } from "uuid"; diff --git a/src/migrations/hotbar-store/5.0.0-alpha.2.ts b/src/migrations/hotbar-store/5.0.0-alpha.2.ts index 57459de8c8..83696d01b0 100644 --- a/src/migrations/hotbar-store/5.0.0-alpha.2.ts +++ b/src/migrations/hotbar-store/5.0.0-alpha.2.ts @@ -20,7 +20,7 @@ */ // Cleans up a store that had the state related data stored -import { Hotbar } from "../../common/hotbar-store"; +import type { Hotbar } from "../../common/hotbar-store"; import { migration } from "../migration-wrapper"; import * as uuid from "uuid"; diff --git a/src/migrations/migration-wrapper.ts b/src/migrations/migration-wrapper.ts index db363513de..26b17e0450 100644 --- a/src/migrations/migration-wrapper.ts +++ b/src/migrations/migration-wrapper.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import Config from "conf"; +import type Config from "conf"; import { isTestEnv } from "../common/vars"; export interface MigrationOpts { diff --git a/src/renderer/api/__tests__/crd.test.ts b/src/renderer/api/__tests__/crd.test.ts index 657434e93b..af7db4280c 100644 --- a/src/renderer/api/__tests__/crd.test.ts +++ b/src/renderer/api/__tests__/crd.test.ts @@ -20,7 +20,7 @@ */ import { CustomResourceDefinition } from "../endpoints"; -import { IKubeObjectMetadata } from "../kube-object"; +import type { IKubeObjectMetadata } from "../kube-object"; describe("Crds", () => { describe("getVersion", () => { diff --git a/src/renderer/api/catalog-entity.ts b/src/renderer/api/catalog-entity.ts index 493099d6c8..63a5ce62eb 100644 --- a/src/renderer/api/catalog-entity.ts +++ b/src/renderer/api/catalog-entity.ts @@ -21,18 +21,17 @@ import { navigate } from "../navigation"; import { commandRegistry } from "../../extensions/registries"; -import { CatalogEntity } from "../../common/catalog"; +import type { CatalogEntity } from "../../common/catalog"; -export { - CatalogCategory, - CatalogEntity, +export { CatalogCategory, CatalogEntity } from "../../common/catalog"; +export type { CatalogEntityData, CatalogEntityKindData, CatalogEntityActionContext, CatalogEntityAddMenuContext, CatalogEntityAddMenu, CatalogEntityContextMenu, - CatalogEntityContextMenuContext + CatalogEntityContextMenuContext, } from "../../common/catalog"; export const catalogEntityRunContext = { diff --git a/src/renderer/api/endpoints/configmap.api.ts b/src/renderer/api/endpoints/configmap.api.ts index decbad381d..2c96494c57 100644 --- a/src/renderer/api/endpoints/configmap.api.ts +++ b/src/renderer/api/endpoints/configmap.api.ts @@ -20,7 +20,7 @@ */ import { KubeObject } from "../kube-object"; -import { KubeJsonApiData } from "../kube-json-api"; +import type { KubeJsonApiData } from "../kube-json-api"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; diff --git a/src/renderer/api/endpoints/cron-job.api.ts b/src/renderer/api/endpoints/cron-job.api.ts index d0f9b9c3e0..09c18924d4 100644 --- a/src/renderer/api/endpoints/cron-job.api.ts +++ b/src/renderer/api/endpoints/cron-job.api.ts @@ -21,7 +21,7 @@ import moment from "moment"; import { KubeObject } from "../kube-object"; -import { IPodContainer } from "./pods.api"; +import type { IPodContainer } from "./pods.api"; import { formatDuration } from "../../utils/formatDuration"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; diff --git a/src/renderer/api/endpoints/daemon-set.api.ts b/src/renderer/api/endpoints/daemon-set.api.ts index fa22106e3a..1f2660b3c5 100644 --- a/src/renderer/api/endpoints/daemon-set.api.ts +++ b/src/renderer/api/endpoints/daemon-set.api.ts @@ -20,7 +20,7 @@ */ import get from "lodash/get"; -import { IPodContainer } from "./pods.api"; +import type { IPodContainer } from "./pods.api"; import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; diff --git a/src/renderer/api/endpoints/helm-releases.api.ts b/src/renderer/api/endpoints/helm-releases.api.ts index 6958e7f8c3..45fc55a342 100644 --- a/src/renderer/api/endpoints/helm-releases.api.ts +++ b/src/renderer/api/endpoints/helm-releases.api.ts @@ -25,9 +25,9 @@ import { autobind, formatDuration } from "../../utils"; import capitalize from "lodash/capitalize"; import { apiBase } from "../index"; import { helmChartStore } from "../../components/+apps-helm-charts/helm-chart.store"; -import { ItemObject } from "../../item.store"; +import type { ItemObject } from "../../item.store"; import { KubeObject } from "../kube-object"; -import { JsonApiData } from "../json-api"; +import type { JsonApiData } from "../json-api"; interface IReleasePayload { name: string; diff --git a/src/renderer/api/endpoints/job.api.ts b/src/renderer/api/endpoints/job.api.ts index b9e7dfeafa..dac3cf7a71 100644 --- a/src/renderer/api/endpoints/job.api.ts +++ b/src/renderer/api/endpoints/job.api.ts @@ -22,9 +22,9 @@ import get from "lodash/get"; import { autobind } from "../../utils"; import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; -import { IPodContainer } from "./pods.api"; +import type { IPodContainer } from "./pods.api"; import { KubeApi } from "../kube-api"; -import { JsonApiParams } from "../json-api"; +import type { JsonApiParams } from "../json-api"; @autobind() export class Job extends WorkloadKubeObject { @@ -106,11 +106,7 @@ export class Job extends WorkloadKubeObject { getCondition() { // Type of Job condition could be only Complete or Failed // https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.14/#jobcondition-v1-batch - const { conditions } = this.status; - - if (!conditions) return; - - return conditions.find(({ status }) => status === "True"); + return this.status.conditions?.find(({ status }) => status === "True"); } getImages() { diff --git a/src/renderer/api/endpoints/metrics.api.ts b/src/renderer/api/endpoints/metrics.api.ts index f1d50a68b1..00408678e0 100644 --- a/src/renderer/api/endpoints/metrics.api.ts +++ b/src/renderer/api/endpoints/metrics.api.ts @@ -132,11 +132,11 @@ export function normalizeMetrics(metrics: IMetrics, frames = 60): IMetrics { return metrics; } -export function isMetricsEmpty(metrics: { [key: string]: IMetrics }) { +export function isMetricsEmpty(metrics: Record) { return Object.values(metrics).every(metric => !metric?.data?.result?.length); } -export function getItemMetrics(metrics: { [key: string]: IMetrics }, itemName: string): { [key: string]: IMetrics } { +export function getItemMetrics(metrics: Record, itemName: string): Record | void { if (!metrics) return; const itemMetrics = { ...metrics }; @@ -153,7 +153,7 @@ export function getItemMetrics(metrics: { [key: string]: IMetrics }, itemName: s return itemMetrics; } -export function getMetricLastPoints(metrics: { [key: string]: IMetrics }) { +export function getMetricLastPoints(metrics: Record) { const result: Partial<{ [metric: string]: number }> = {}; Object.keys(metrics).forEach(metricName => { diff --git a/src/renderer/api/endpoints/persistent-volume-claims.api.ts b/src/renderer/api/endpoints/persistent-volume-claims.api.ts index d1e37db5b9..92641945d7 100644 --- a/src/renderer/api/endpoints/persistent-volume-claims.api.ts +++ b/src/renderer/api/endpoints/persistent-volume-claims.api.ts @@ -22,7 +22,7 @@ import { KubeObject } from "../kube-object"; import { autobind } from "../../utils"; import { IMetrics, metricsApi } from "./metrics.api"; -import { Pod } from "./pods.api"; +import type { Pod } from "./pods.api"; import { KubeApi } from "../kube-api"; export class PersistentVolumeClaimsApi extends KubeApi { diff --git a/src/renderer/api/endpoints/persistent-volume.api.ts b/src/renderer/api/endpoints/persistent-volume.api.ts index c0402cef70..c2bf11e29f 100644 --- a/src/renderer/api/endpoints/persistent-volume.api.ts +++ b/src/renderer/api/endpoints/persistent-volume.api.ts @@ -61,7 +61,7 @@ export class PersistentVolume extends KubeObject { }; }; - status: { + status?: { phase: string; reason?: string; }; @@ -79,9 +79,7 @@ export class PersistentVolume extends KubeObject { } getStatus() { - if (!this.status) return; - - return this.status.phase || "-"; + return this.status?.phase || "-"; } getStorageClass(): string { diff --git a/src/renderer/api/endpoints/replica-set.api.ts b/src/renderer/api/endpoints/replica-set.api.ts index 5e9fe2fc82..cf79c85308 100644 --- a/src/renderer/api/endpoints/replica-set.api.ts +++ b/src/renderer/api/endpoints/replica-set.api.ts @@ -22,7 +22,7 @@ import get from "lodash/get"; import { autobind } from "../../utils"; import { WorkloadKubeObject } from "../workload-kube-object"; -import { IPodContainer, Pod } from "./pods.api"; +import type { IPodContainer, Pod } from "./pods.api"; import { KubeApi } from "../kube-api"; export class ReplicaSetApi extends KubeApi { diff --git a/src/renderer/api/endpoints/resource-applier.api.ts b/src/renderer/api/endpoints/resource-applier.api.ts index 6825c6d0b0..1756977c95 100644 --- a/src/renderer/api/endpoints/resource-applier.api.ts +++ b/src/renderer/api/endpoints/resource-applier.api.ts @@ -21,7 +21,7 @@ import jsYaml from "js-yaml"; import { KubeObject } from "../kube-object"; -import { KubeJsonApiData } from "../kube-json-api"; +import type { KubeJsonApiData } from "../kube-json-api"; import { apiBase } from "../index"; import { apiManager } from "../api-manager"; diff --git a/src/renderer/api/endpoints/resource-quota.api.ts b/src/renderer/api/endpoints/resource-quota.api.ts index 173d019350..4675299a39 100644 --- a/src/renderer/api/endpoints/resource-quota.api.ts +++ b/src/renderer/api/endpoints/resource-quota.api.ts @@ -21,7 +21,7 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; -import { KubeJsonApiData } from "../kube-json-api"; +import type { KubeJsonApiData } from "../kube-json-api"; export interface IResourceQuotaValues { [quota: string]: string; diff --git a/src/renderer/api/endpoints/secret.api.ts b/src/renderer/api/endpoints/secret.api.ts index 62fffbe611..b51f467430 100644 --- a/src/renderer/api/endpoints/secret.api.ts +++ b/src/renderer/api/endpoints/secret.api.ts @@ -20,7 +20,7 @@ */ import { KubeObject } from "../kube-object"; -import { KubeJsonApiData } from "../kube-json-api"; +import type { KubeJsonApiData } from "../kube-json-api"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; diff --git a/src/renderer/api/endpoints/stateful-set.api.ts b/src/renderer/api/endpoints/stateful-set.api.ts index 41c3c11f5c..cdbeb5a01a 100644 --- a/src/renderer/api/endpoints/stateful-set.api.ts +++ b/src/renderer/api/endpoints/stateful-set.api.ts @@ -20,7 +20,7 @@ */ import get from "lodash/get"; -import { IPodContainer } from "./pods.api"; +import type { IPodContainer } from "./pods.api"; import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; diff --git a/src/renderer/api/kube-api.ts b/src/renderer/api/kube-api.ts index 990b0d3a7b..21e370a207 100644 --- a/src/renderer/api/kube-api.ts +++ b/src/renderer/api/kube-api.ts @@ -30,7 +30,7 @@ import { apiKube } from "./index"; import { createKubeApiURL, parseKubeApi } from "./kube-api-parse"; import { IKubeObjectConstructor, KubeObject, KubeStatus } from "./kube-object"; import byline from "byline"; -import { IKubeWatchEvent } from "./kube-watch-api"; +import type { IKubeWatchEvent } from "./kube-watch-api"; import { ReadableWebToNodeStream } from "../utils/readableStream"; import { KubeJsonApi, KubeJsonApiData } from "./kube-json-api"; import { noop } from "../utils"; @@ -306,7 +306,7 @@ export class KubeApi { } protected parseResponse(data: unknown, namespace?: string): T | T[] | null { - if (!data) return; + if (!data) return null; const KubeObjectConstructor = this.objectConstructor; // process items list response, check before single item since there is overlap diff --git a/src/renderer/api/kube-object.ts b/src/renderer/api/kube-object.ts index 1bfd1a21d1..06c431851c 100644 --- a/src/renderer/api/kube-object.ts +++ b/src/renderer/api/kube-object.ts @@ -22,11 +22,11 @@ // Base class for all kubernetes objects import moment from "moment"; -import { KubeJsonApiData, KubeJsonApiDataList, KubeJsonApiListMetadata, KubeJsonApiMetadata } from "./kube-json-api"; +import type { KubeJsonApiData, KubeJsonApiDataList, KubeJsonApiListMetadata, KubeJsonApiMetadata } from "./kube-json-api"; import { autobind, formatDuration } from "../utils"; -import { ItemObject } from "../item.store"; +import type { ItemObject } from "../item.store"; import { apiKube } from "./index"; -import { JsonApiParams } from "./json-api"; +import type { JsonApiParams } from "./json-api"; import { resourceApplierApi } from "./endpoints/resource-applier.api"; import { hasOptionalProperty, hasTypedProperty, isObject, isString, bindPredicate, isTypedArray, isRecord } from "../../common/utils/type-narrowing"; diff --git a/src/renderer/api/kube-watch-api.ts b/src/renderer/api/kube-watch-api.ts index 33d6d44290..4c68e0fdfa 100644 --- a/src/renderer/api/kube-watch-api.ts +++ b/src/renderer/api/kube-watch-api.ts @@ -28,8 +28,8 @@ import type { ClusterContext } from "../components/context"; import plimit from "p-limit"; import { comparer, IReactionDisposer, observable, reaction, when } from "mobx"; import { autobind, noop } from "../utils"; -import { KubeApi } from "./kube-api"; -import { KubeJsonApiData } from "./kube-json-api"; +import type { KubeApi } from "./kube-api"; +import type { KubeJsonApiData } from "./kube-json-api"; import { isDebugging, isProduction } from "../../common/vars"; export interface IKubeWatchEvent { diff --git a/src/renderer/api/terminal-api.ts b/src/renderer/api/terminal-api.ts index 1b9f7d7989..2720fddf51 100644 --- a/src/renderer/api/terminal-api.ts +++ b/src/renderer/api/terminal-api.ts @@ -108,7 +108,7 @@ export class TerminalApi extends WebSocketApi { @autobind() protected _onReady(data: string) { - if (!data) return; + if (!data) return true; this.isReady = true; this.onReady.emit(); this.onData.removeListener(this._onReady); diff --git a/src/renderer/components/+apps-helm-charts/helm-charts.tsx b/src/renderer/components/+apps-helm-charts/helm-charts.tsx index 34ef8aaf23..5e451e33e5 100644 --- a/src/renderer/components/+apps-helm-charts/helm-charts.tsx +++ b/src/renderer/components/+apps-helm-charts/helm-charts.tsx @@ -22,11 +22,11 @@ import "./helm-charts.scss"; import React, { Component } from "react"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { observer } from "mobx-react"; import { helmChartsURL, IHelmChartsRouteParams } from "./helm-charts.route"; import { helmChartStore } from "./helm-chart.store"; -import { HelmChart } from "../../api/endpoints/helm-charts.api"; +import type { HelmChart } from "../../api/endpoints/helm-charts.api"; import { HelmChartDetails } from "./helm-chart-details"; import { navigation } from "../../navigation"; import { ItemListLayout } from "../item-object-list/item-list-layout"; diff --git a/src/renderer/components/+apps-releases/release-menu.tsx b/src/renderer/components/+apps-releases/release-menu.tsx index 9e29c112e4..78e4c8e94b 100644 --- a/src/renderer/components/+apps-releases/release-menu.tsx +++ b/src/renderer/components/+apps-releases/release-menu.tsx @@ -20,7 +20,7 @@ */ import React from "react"; -import { HelmRelease } from "../../api/endpoints/helm-releases.api"; +import type { HelmRelease } from "../../api/endpoints/helm-releases.api"; import { autobind, cssNames } from "../../utils"; import { releaseStore } from "./release.store"; import { MenuActions, MenuActionsProps } from "../menu/menu-actions"; @@ -56,7 +56,7 @@ export class HelmReleaseMenu extends React.Component { renderContent() { const { release, toolbar } = this.props; - if (!release) return; + if (!release) return null; const hasRollback = release && release.getRevision() > 1; return ( diff --git a/src/renderer/components/+apps-releases/release.store.ts b/src/renderer/components/+apps-releases/release.store.ts index 6a4d8e6a68..7ed2ac42c7 100644 --- a/src/renderer/components/+apps-releases/release.store.ts +++ b/src/renderer/components/+apps-releases/release.store.ts @@ -24,7 +24,7 @@ import { action, observable, reaction, when } from "mobx"; import { autobind } from "../../utils"; import { createRelease, deleteRelease, HelmRelease, IReleaseCreatePayload, IReleaseUpdatePayload, listReleases, rollbackRelease, updateRelease } from "../../api/endpoints/helm-releases.api"; import { ItemStore } from "../../item.store"; -import { Secret } from "../../api/endpoints"; +import type { Secret } from "../../api/endpoints"; import { secretsStore } from "../+config-secrets/secrets.store"; import { namespaceStore } from "../+namespaces/namespace.store"; import { Notifications } from "../notifications"; @@ -146,8 +146,6 @@ export class ReleaseStore extends ItemStore { } async removeSelectedItems() { - if (!this.selectedItems.length) return; - return Promise.all(this.selectedItems.map(this.remove)); } } diff --git a/src/renderer/components/+apps-releases/releases.tsx b/src/renderer/components/+apps-releases/releases.tsx index 716d5c8a64..bbf3944554 100644 --- a/src/renderer/components/+apps-releases/releases.tsx +++ b/src/renderer/components/+apps-releases/releases.tsx @@ -24,10 +24,10 @@ import "./releases.scss"; import React, { Component } from "react"; import kebabCase from "lodash/kebabCase"; import { disposeOnUnmount, observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { releaseStore } from "./release.store"; import { IReleaseRouteParams, releaseURL } from "./release.route"; -import { HelmRelease } from "../../api/endpoints/helm-releases.api"; +import type { HelmRelease } from "../../api/endpoints/helm-releases.api"; import { ReleaseDetails } from "./release-details"; import { ReleaseRollbackDialog } from "./release-rollback-dialog"; import { navigation } from "../../navigation"; diff --git a/src/renderer/components/+catalog/catalog-add-button.tsx b/src/renderer/components/+catalog/catalog-add-button.tsx index 5329702832..af6b3ebbbb 100644 --- a/src/renderer/components/+catalog/catalog-add-button.tsx +++ b/src/renderer/components/+catalog/catalog-add-button.tsx @@ -26,7 +26,7 @@ import { Icon } from "../icon"; import { disposeOnUnmount, observer } from "mobx-react"; import { observable, reaction } from "mobx"; import { autobind } from "../../../common/utils"; -import { CatalogCategory, CatalogEntityAddMenuContext, CatalogEntityAddMenu } from "../../api/catalog-entity"; +import type { CatalogCategory, CatalogEntityAddMenuContext, CatalogEntityAddMenu } from "../../api/catalog-entity"; import { EventEmitter } from "events"; import { navigate } from "../../navigation"; diff --git a/src/renderer/components/+catalog/catalog-entity.store.ts b/src/renderer/components/+catalog/catalog-entity.store.ts index f53515efca..3bd3dbacfa 100644 --- a/src/renderer/components/+catalog/catalog-entity.store.ts +++ b/src/renderer/components/+catalog/catalog-entity.store.ts @@ -21,7 +21,7 @@ import { action, computed, IReactionDisposer, observable, reaction } from "mobx"; import { catalogEntityRegistry } from "../../api/catalog-entity-registry"; -import { CatalogEntity, CatalogEntityActionContext } from "../../api/catalog-entity"; +import type { CatalogEntity, CatalogEntityActionContext } from "../../api/catalog-entity"; import { ItemObject, ItemStore } from "../../item.store"; import { autobind } from "../../utils"; import { CatalogCategory } from "../../../common/catalog"; diff --git a/src/renderer/components/+cluster/cluster-issues.tsx b/src/renderer/components/+cluster/cluster-issues.tsx index e02ce958a8..ce6496f490 100644 --- a/src/renderer/components/+cluster/cluster-issues.tsx +++ b/src/renderer/components/+cluster/cluster-issues.tsx @@ -30,7 +30,7 @@ import { Table, TableCell, TableHead, TableRow } from "../table"; import { nodesStore } from "../+nodes/nodes.store"; import { eventStore } from "../+events/event.store"; import { autobind, cssNames, prevDefault } from "../../utils"; -import { ItemObject } from "../../item.store"; +import type { ItemObject } from "../../item.store"; import { Spinner } from "../spinner"; import { ThemeStore } from "../../theme.store"; import { lookupApiLink } from "../../api/kube-api"; diff --git a/src/renderer/components/+cluster/cluster-metrics.tsx b/src/renderer/components/+cluster/cluster-metrics.tsx index c247dc3ef8..0c4910e7e5 100644 --- a/src/renderer/components/+cluster/cluster-metrics.tsx +++ b/src/renderer/components/+cluster/cluster-metrics.tsx @@ -23,7 +23,7 @@ import "./cluster-metrics.scss"; import React from "react"; import { observer } from "mobx-react"; -import { ChartOptions, ChartPoint } from "chart.js"; +import type { ChartOptions, ChartPoint } from "chart.js"; import { clusterOverviewStore, MetricType } from "./cluster-overview.store"; import { BarChart } from "../chart"; import { bytesToUnits } from "../../utils"; diff --git a/src/renderer/components/+config-autoscalers/hpa-details.tsx b/src/renderer/components/+config-autoscalers/hpa-details.tsx index 4e832426e4..5b9cf76f97 100644 --- a/src/renderer/components/+config-autoscalers/hpa-details.tsx +++ b/src/renderer/components/+config-autoscalers/hpa-details.tsx @@ -100,7 +100,7 @@ export class HpaDetails extends React.Component { render() { const { object: hpa } = this.props; - if (!hpa) return; + if (!hpa) return null; const { scaleTargetRef } = hpa.spec; return ( diff --git a/src/renderer/components/+config-autoscalers/hpa.tsx b/src/renderer/components/+config-autoscalers/hpa.tsx index 663d1fd5b1..54eb0b67a8 100644 --- a/src/renderer/components/+config-autoscalers/hpa.tsx +++ b/src/renderer/components/+config-autoscalers/hpa.tsx @@ -23,10 +23,10 @@ import "./hpa.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { KubeObjectListLayout } from "../kube-object"; -import { IHpaRouteParams } from "./hpa.route"; -import { HorizontalPodAutoscaler } from "../../api/endpoints/hpa.api"; +import type { IHpaRouteParams } from "./hpa.route"; +import type { HorizontalPodAutoscaler } from "../../api/endpoints/hpa.api"; import { hpaStore } from "./hpa.store"; import { Badge } from "../badge"; import { cssNames } from "../../utils"; diff --git a/src/renderer/components/+config-limit-ranges/limit-range-details.tsx b/src/renderer/components/+config-limit-ranges/limit-range-details.tsx index 859f8272ba..d4c9d18f28 100644 --- a/src/renderer/components/+config-limit-ranges/limit-range-details.tsx +++ b/src/renderer/components/+config-limit-ranges/limit-range-details.tsx @@ -23,7 +23,7 @@ import "./limit-range-details.scss"; import React from "react"; import { observer } from "mobx-react"; -import { KubeObjectDetailsProps } from "../kube-object"; +import type { KubeObjectDetailsProps } from "../kube-object"; import { LimitPart, LimitRange, LimitRangeItem, Resource } from "../../api/endpoints/limit-range.api"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; diff --git a/src/renderer/components/+config-limit-ranges/limit-ranges.tsx b/src/renderer/components/+config-limit-ranges/limit-ranges.tsx index 73e51bd0bf..6784e6f7d6 100644 --- a/src/renderer/components/+config-limit-ranges/limit-ranges.tsx +++ b/src/renderer/components/+config-limit-ranges/limit-ranges.tsx @@ -21,14 +21,14 @@ import "./limit-ranges.scss"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { observer } from "mobx-react"; import { KubeObjectListLayout } from "../kube-object/kube-object-list-layout"; import { limitRangeStore } from "./limit-ranges.store"; -import { LimitRangeRouteParams } from "./limit-ranges.route"; +import type { LimitRangeRouteParams } from "./limit-ranges.route"; import React from "react"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; -import { LimitRange } from "../../api/endpoints/limit-range.api"; +import type { LimitRange } from "../../api/endpoints/limit-range.api"; enum columnId { name = "name", diff --git a/src/renderer/components/+config-maps/config-map-details.tsx b/src/renderer/components/+config-maps/config-map-details.tsx index 62a0534fba..b9dd05cfaa 100644 --- a/src/renderer/components/+config-maps/config-map-details.tsx +++ b/src/renderer/components/+config-maps/config-map-details.tsx @@ -30,8 +30,8 @@ import { Input } from "../input"; import { Button } from "../button"; import { KubeEventDetails } from "../+events/kube-event-details"; import { configMapsStore } from "./config-maps.store"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { ConfigMap } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { ConfigMap } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; @@ -132,5 +132,3 @@ kubeObjectDetailRegistry.add({ Details: (props) => } }); - - diff --git a/src/renderer/components/+config-maps/config-maps.tsx b/src/renderer/components/+config-maps/config-maps.tsx index dbc78f13a0..b1997fa792 100644 --- a/src/renderer/components/+config-maps/config-maps.tsx +++ b/src/renderer/components/+config-maps/config-maps.tsx @@ -23,11 +23,11 @@ import "./config-maps.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { configMapsStore } from "./config-maps.store"; -import { ConfigMap } from "../../api/endpoints/configmap.api"; +import type { ConfigMap } from "../../api/endpoints/configmap.api"; import { KubeObjectListLayout } from "../kube-object"; -import { IConfigMapsRouteParams } from "./config-maps.route"; +import type { IConfigMapsRouteParams } from "./config-maps.route"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum columnId { diff --git a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx index 8ccaa814b2..ddb95aa628 100644 --- a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx +++ b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx @@ -25,8 +25,8 @@ import React from "react"; import { observer } from "mobx-react"; import { DrawerItem } from "../drawer"; import { Badge } from "../badge"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { PodDisruptionBudget } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { PodDisruptionBudget } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; diff --git a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx index 07bf10f96f..abc87a6a4d 100644 --- a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx +++ b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx @@ -24,7 +24,7 @@ import "./pod-disruption-budgets.scss"; import * as React from "react"; import { observer } from "mobx-react"; import { podDisruptionBudgetsStore } from "./pod-disruption-budgets.store"; -import { PodDisruptionBudget } from "../../api/endpoints/poddisruptionbudget.api"; +import type { PodDisruptionBudget } from "../../api/endpoints/poddisruptionbudget.api"; import { KubeObjectDetailsProps, KubeObjectListLayout } from "../kube-object"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; diff --git a/src/renderer/components/+config-resource-quotas/resource-quota-details.tsx b/src/renderer/components/+config-resource-quotas/resource-quota-details.tsx index 79b7209adf..662a8e26ec 100644 --- a/src/renderer/components/+config-resource-quotas/resource-quota-details.tsx +++ b/src/renderer/components/+config-resource-quotas/resource-quota-details.tsx @@ -25,8 +25,8 @@ import kebabCase from "lodash/kebabCase"; import { observer } from "mobx-react"; import { DrawerItem, DrawerTitle } from "../drawer"; import { cpuUnitsToNumber, cssNames, unitsToBytes, metricUnitsToNumber } from "../../utils"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { ResourceQuota } from "../../api/endpoints/resource-quota.api"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { ResourceQuota } from "../../api/endpoints/resource-quota.api"; import { LineProgress } from "../line-progress"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; diff --git a/src/renderer/components/+config-resource-quotas/resource-quotas.tsx b/src/renderer/components/+config-resource-quotas/resource-quotas.tsx index 90b5526c44..59be708d6f 100644 --- a/src/renderer/components/+config-resource-quotas/resource-quotas.tsx +++ b/src/renderer/components/+config-resource-quotas/resource-quotas.tsx @@ -23,12 +23,12 @@ import "./resource-quotas.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { KubeObjectListLayout } from "../kube-object"; -import { ResourceQuota } from "../../api/endpoints/resource-quota.api"; +import type { ResourceQuota } from "../../api/endpoints/resource-quota.api"; import { AddQuotaDialog } from "./add-quota-dialog"; import { resourceQuotaStore } from "./resource-quotas.store"; -import { IResourceQuotaRouteParams } from "./resource-quotas.route"; +import type { IResourceQuotaRouteParams } from "./resource-quotas.route"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum columnId { diff --git a/src/renderer/components/+config-secrets/add-secret-dialog.tsx b/src/renderer/components/+config-secrets/add-secret-dialog.tsx index bbf04ed533..f877fbe291 100644 --- a/src/renderer/components/+config-secrets/add-secret-dialog.tsx +++ b/src/renderer/components/+config-secrets/add-secret-dialog.tsx @@ -33,7 +33,7 @@ import { SubTitle } from "../layout/sub-title"; import { NamespaceSelect } from "../+namespaces/namespace-select"; import { Select, SelectOption } from "../select"; import { Icon } from "../icon"; -import { IKubeObjectMetadata } from "../../api/kube-object"; +import type { IKubeObjectMetadata } from "../../api/kube-object"; import { base64 } from "../../utils"; import { Notifications } from "../notifications"; import upperFirst from "lodash/upperFirst"; diff --git a/src/renderer/components/+config-secrets/secret-details.tsx b/src/renderer/components/+config-secrets/secret-details.tsx index bbf6cda035..5a4aaca64e 100644 --- a/src/renderer/components/+config-secrets/secret-details.tsx +++ b/src/renderer/components/+config-secrets/secret-details.tsx @@ -32,8 +32,8 @@ import { Notifications } from "../notifications"; import { base64 } from "../../utils"; import { Icon } from "../icon"; import { secretsStore } from "./secrets.store"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { Secret } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { Secret } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; diff --git a/src/renderer/components/+config-secrets/secrets.tsx b/src/renderer/components/+config-secrets/secrets.tsx index 41ce4cdf42..b87c6a51ed 100644 --- a/src/renderer/components/+config-secrets/secrets.tsx +++ b/src/renderer/components/+config-secrets/secrets.tsx @@ -23,10 +23,10 @@ import "./secrets.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; -import { Secret } from "../../api/endpoints"; +import type { RouteComponentProps } from "react-router"; +import type { Secret } from "../../api/endpoints"; import { AddSecretDialog } from "./add-secret-dialog"; -import { ISecretsRouteParams } from "./secrets.route"; +import type { ISecretsRouteParams } from "./secrets.route"; import { KubeObjectListLayout } from "../kube-object"; import { Badge } from "../badge"; import { secretsStore } from "./secrets.store"; diff --git a/src/renderer/components/+config/config.route.ts b/src/renderer/components/+config/config.route.ts index eab91880a5..6e3cd5696e 100644 --- a/src/renderer/components/+config/config.route.ts +++ b/src/renderer/components/+config/config.route.ts @@ -19,8 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { RouteProps } from "react-router"; -import { IURLParams } from "../../../common/utils/buildUrl"; +import type { RouteProps } from "react-router"; +import type { IURLParams } from "../../../common/utils/buildUrl"; import { configMapsRoute, configMapsURL } from "../+config-maps/config-maps.route"; import { hpaRoute } from "../+config-autoscalers"; import { limitRangesRoute } from "../+config-limit-ranges"; diff --git a/src/renderer/components/+custom-resources/crd-details.tsx b/src/renderer/components/+custom-resources/crd-details.tsx index 0561679dda..757f389702 100644 --- a/src/renderer/components/+custom-resources/crd-details.tsx +++ b/src/renderer/components/+custom-resources/crd-details.tsx @@ -24,12 +24,12 @@ import "./crd-details.scss"; import React from "react"; import { Link } from "react-router-dom"; import { observer } from "mobx-react"; -import { CustomResourceDefinition } from "../../api/endpoints/crd.api"; +import type { CustomResourceDefinition } from "../../api/endpoints/crd.api"; import { cssNames } from "../../utils"; import { AceEditor } from "../ace-editor"; import { Badge } from "../badge"; import { DrawerItem, DrawerTitle } from "../drawer"; -import { KubeObjectDetailsProps } from "../kube-object"; +import type { KubeObjectDetailsProps } from "../kube-object"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { Input } from "../input"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; diff --git a/src/renderer/components/+custom-resources/crd-list.tsx b/src/renderer/components/+custom-resources/crd-list.tsx index 33442a5404..bb6753dce2 100644 --- a/src/renderer/components/+custom-resources/crd-list.tsx +++ b/src/renderer/components/+custom-resources/crd-list.tsx @@ -28,7 +28,7 @@ import { Link } from "react-router-dom"; import { stopPropagation } from "../../utils"; import { KubeObjectListLayout } from "../kube-object"; import { crdStore } from "./crd.store"; -import { CustomResourceDefinition } from "../../api/endpoints/crd.api"; +import type { CustomResourceDefinition } from "../../api/endpoints/crd.api"; import { Select, SelectOption } from "../select"; import { createPageParam } from "../../navigation"; import { Icon } from "../icon"; diff --git a/src/renderer/components/+custom-resources/crd-resource-details.tsx b/src/renderer/components/+custom-resources/crd-resource-details.tsx index cbd558c334..b681b23c9a 100644 --- a/src/renderer/components/+custom-resources/crd-resource-details.tsx +++ b/src/renderer/components/+custom-resources/crd-resource-details.tsx @@ -28,11 +28,11 @@ import { computed } from "mobx"; import { cssNames } from "../../utils"; import { Badge } from "../badge"; import { DrawerItem } from "../drawer"; -import { KubeObjectDetailsProps } from "../kube-object"; +import type { KubeObjectDetailsProps } from "../kube-object"; import { crdStore } from "./crd.store"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { Input } from "../input"; -import { AdditionalPrinterColumnsV1, CustomResourceDefinition } from "../../api/endpoints/crd.api"; +import type { AdditionalPrinterColumnsV1, CustomResourceDefinition } from "../../api/endpoints/crd.api"; import { parseJsonPath } from "../../utils/jsonPath"; interface Props extends KubeObjectDetailsProps { diff --git a/src/renderer/components/+custom-resources/crd-resource.store.ts b/src/renderer/components/+custom-resources/crd-resource.store.ts index 485eaccd64..b980f30890 100644 --- a/src/renderer/components/+custom-resources/crd-resource.store.ts +++ b/src/renderer/components/+custom-resources/crd-resource.store.ts @@ -22,7 +22,7 @@ import { autobind } from "../../utils"; import { KubeApi } from "../../api/kube-api"; import { KubeObjectStore } from "../../kube-object.store"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; @autobind() export class CRDResourceStore extends KubeObjectStore { diff --git a/src/renderer/components/+custom-resources/crd-resources.tsx b/src/renderer/components/+custom-resources/crd-resources.tsx index 3b280baa66..a8128f42e1 100644 --- a/src/renderer/components/+custom-resources/crd-resources.tsx +++ b/src/renderer/components/+custom-resources/crd-resources.tsx @@ -24,13 +24,13 @@ import "./crd-resources.scss"; import React from "react"; import jsonPath from "jsonpath"; import { disposeOnUnmount, observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { KubeObjectListLayout } from "../kube-object"; -import { KubeObject } from "../../api/kube-object"; -import { ICRDRouteParams } from "./crd.route"; +import type { KubeObject } from "../../api/kube-object"; +import type { ICRDRouteParams } from "./crd.route"; import { autorun, computed } from "mobx"; import { crdStore } from "./crd.store"; -import { TableSortCallback } from "../table"; +import type { TableSortCallback } from "../table"; import { apiManager } from "../../api/api-manager"; import { parseJsonPath } from "../../utils/jsonPath"; diff --git a/src/renderer/components/+custom-resources/crd.store.ts b/src/renderer/components/+custom-resources/crd.store.ts index 14af6d9726..9813175b8a 100644 --- a/src/renderer/components/+custom-resources/crd.store.ts +++ b/src/renderer/components/+custom-resources/crd.store.ts @@ -26,14 +26,14 @@ import { crdApi, CustomResourceDefinition } from "../../api/endpoints/crd.api"; import { apiManager } from "../../api/api-manager"; import { KubeApi } from "../../api/kube-api"; import { CRDResourceStore } from "./crd-resource.store"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; function initStore(crd: CustomResourceDefinition) { const apiBase = crd.getResourceApiBase(); const kind = crd.getResourceKind(); const isNamespaced = crd.isNamespaced(); const api = apiManager.getApi(apiBase) || new KubeApi({ apiBase, kind, isNamespaced }); - + if (!apiManager.getStore(api)) { apiManager.registerStore(new CRDResourceStore(api)); } @@ -81,7 +81,7 @@ export class CRDStore extends KubeObjectStore { getByObject(obj: KubeObject) { if (!obj) return null; const { kind, apiVersion } = obj; - + return this.items.find(crd => ( kind === crd.getResourceKind() && apiVersion === `${crd.getGroup()}/${crd.getVersion()}` )); diff --git a/src/renderer/components/+entity-settings/entity-settings.tsx b/src/renderer/components/+entity-settings/entity-settings.tsx index 779cce45d6..18eee4ffaa 100644 --- a/src/renderer/components/+entity-settings/entity-settings.tsx +++ b/src/renderer/components/+entity-settings/entity-settings.tsx @@ -23,15 +23,15 @@ import "./entity-settings.scss"; import React from "react"; import { observable } from "mobx"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { observer } from "mobx-react"; import { PageLayout } from "../layout/page-layout"; import { navigation } from "../../navigation"; import { Tabs, Tab } from "../tabs"; -import { CatalogEntity } from "../../api/catalog-entity"; +import type { CatalogEntity } from "../../api/catalog-entity"; import { catalogEntityRegistry } from "../../api/catalog-entity-registry"; import { entitySettingRegistry } from "../../../extensions/registries"; -import { EntitySettingsRouteParams } from "./entity-settings.route"; +import type { EntitySettingsRouteParams } from "./entity-settings.route"; import { groupBy } from "lodash"; interface Props extends RouteComponentProps { diff --git a/src/renderer/components/+events/event-details.tsx b/src/renderer/components/+events/event-details.tsx index d10f36002d..ec50373964 100644 --- a/src/renderer/components/+events/event-details.tsx +++ b/src/renderer/components/+events/event-details.tsx @@ -27,7 +27,7 @@ import { DrawerItem, DrawerTitle } from "../drawer"; import { Link } from "react-router-dom"; import { observer } from "mobx-react"; import { KubeObjectDetailsProps, getDetailsUrl } from "../kube-object"; -import { KubeEvent } from "../../api/endpoints/events.api"; +import type { KubeEvent } from "../../api/endpoints/events.api"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { lookupApiLink } from "../../api/kube-api"; @@ -42,7 +42,7 @@ export class EventDetails extends React.Component { render() { const { object: event } = this.props; - if (!event) return; + if (!event) return null; const { message, reason, count, type, involvedObject } = event; const { kind, name, namespace, fieldPath } = involvedObject; diff --git a/src/renderer/components/+events/event.store.ts b/src/renderer/components/+events/event.store.ts index 65dd71c2ed..7f51104802 100644 --- a/src/renderer/components/+events/event.store.ts +++ b/src/renderer/components/+events/event.store.ts @@ -24,7 +24,7 @@ import compact from "lodash/compact"; import { KubeObjectStore } from "../../kube-object.store"; import { autobind } from "../../utils"; import { eventApi, KubeEvent } from "../../api/endpoints/events.api"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; import { Pod } from "../../api/endpoints/pods.api"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; @@ -65,7 +65,7 @@ export class EventStore extends KubeObjectStore { if (kind == Pod.kind) { // Wipe out running pods const pod = podsStore.items.find(pod => pod.getId() == uid); - if (!pod || (!pod.hasIssues() && pod.spec.priority < 500000)) return; + if (!pod || (!pod.hasIssues() && pod.spec.priority < 500000)) return undefined; } return recent; diff --git a/src/renderer/components/+events/events.tsx b/src/renderer/components/+events/events.tsx index a9bebc1a01..15aafdbf43 100644 --- a/src/renderer/components/+events/events.tsx +++ b/src/renderer/components/+events/events.tsx @@ -28,9 +28,9 @@ import { orderBy } from "lodash"; import { TabLayout } from "../layout/tab-layout"; import { EventStore, eventStore } from "./event.store"; import { getDetailsUrl, KubeObjectListLayout, KubeObjectListLayoutProps } from "../kube-object"; -import { KubeEvent } from "../../api/endpoints/events.api"; -import { TableSortCallbacks, TableSortParams, TableProps } from "../table"; -import { IHeaderPlaceholders } from "../item-object-list"; +import type { KubeEvent } from "../../api/endpoints/events.api"; +import type { TableSortCallbacks, TableSortParams, TableProps } from "../table"; +import type { IHeaderPlaceholders } from "../item-object-list"; import { Tooltip } from "../tooltip"; import { Link } from "react-router-dom"; import { cssNames, IClassName, stopPropagation } from "../../utils"; diff --git a/src/renderer/components/+events/kube-event-details.tsx b/src/renderer/components/+events/kube-event-details.tsx index 474e21abfb..4ac3e63a84 100644 --- a/src/renderer/components/+events/kube-event-details.tsx +++ b/src/renderer/components/+events/kube-event-details.tsx @@ -23,7 +23,7 @@ import "./kube-event-details.scss"; import React from "react"; import { observer } from "mobx-react"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; import { DrawerItem, DrawerTitle } from "../drawer"; import { cssNames } from "../../utils"; import { eventStore } from "./event.store"; diff --git a/src/renderer/components/+events/kube-event-icon.tsx b/src/renderer/components/+events/kube-event-icon.tsx index b93997ab4b..03bfa92a07 100644 --- a/src/renderer/components/+events/kube-event-icon.tsx +++ b/src/renderer/components/+events/kube-event-icon.tsx @@ -23,10 +23,10 @@ import "./kube-event-icon.scss"; import React from "react"; import { Icon } from "../icon"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; import { eventStore } from "./event.store"; import { cssNames } from "../../utils"; -import { KubeEvent } from "../../api/endpoints/events.api"; +import type { KubeEvent } from "../../api/endpoints/events.api"; interface Props { object: KubeObject; diff --git a/src/renderer/components/+extensions/extension-install.store.ts b/src/renderer/components/+extensions/extension-install.store.ts index fc556c068a..79ba16fa01 100644 --- a/src/renderer/components/+extensions/extension-install.store.ts +++ b/src/renderer/components/+extensions/extension-install.store.ts @@ -21,7 +21,8 @@ import { action, computed, observable } from "mobx"; import logger from "../../../main/logger"; -import { disposer, ExtendableDisposer } from "../../utils"; +import { disposer } from "../../utils"; +import type { ExtendableDisposer } from "../../utils"; import * as uuid from "uuid"; import { broadcastMessage } from "../../../common/ipc"; import { ipcRenderer } from "electron"; diff --git a/src/renderer/components/+extensions/extensions.route.ts b/src/renderer/components/+extensions/extensions.route.ts index 1bc555fd53..e8552eac10 100644 --- a/src/renderer/components/+extensions/extensions.route.ts +++ b/src/renderer/components/+extensions/extensions.route.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { RouteProps } from "react-router"; +import type { RouteProps } from "react-router"; import { buildURL } from "../../../common/utils/buildUrl"; export const extensionsRoute: RouteProps = { diff --git a/src/renderer/components/+extensions/extensions.tsx b/src/renderer/components/+extensions/extensions.tsx index cec1f5db20..93923d3093 100644 --- a/src/renderer/components/+extensions/extensions.tsx +++ b/src/renderer/components/+extensions/extensions.tsx @@ -199,7 +199,7 @@ async function createTempFilesAndValidate({ fileName, dataP }: InstallRequest): const data = await dataP; if (!data) { - return; + return null; } await fse.writeFile(tempFile, data); diff --git a/src/renderer/components/+namespaces/add-namespace-dialog.tsx b/src/renderer/components/+namespaces/add-namespace-dialog.tsx index 9970acccab..50b4d207c3 100644 --- a/src/renderer/components/+namespaces/add-namespace-dialog.tsx +++ b/src/renderer/components/+namespaces/add-namespace-dialog.tsx @@ -27,7 +27,7 @@ import { observer } from "mobx-react"; import { Dialog, DialogProps } from "../dialog"; import { Wizard, WizardStep } from "../wizard"; import { namespaceStore } from "./namespace.store"; -import { Namespace } from "../../api/endpoints"; +import type { Namespace } from "../../api/endpoints"; import { Input } from "../input"; import { systemName } from "../input/input_validators"; import { Notifications } from "../notifications"; diff --git a/src/renderer/components/+namespaces/namespace-details.tsx b/src/renderer/components/+namespaces/namespace-details.tsx index 0208a6001a..d8e5e90f7b 100644 --- a/src/renderer/components/+namespaces/namespace-details.tsx +++ b/src/renderer/components/+namespaces/namespace-details.tsx @@ -26,7 +26,7 @@ import { computed } from "mobx"; import { observer } from "mobx-react"; import { DrawerItem } from "../drawer"; import { cssNames } from "../../utils"; -import { Namespace } from "../../api/endpoints"; +import type { Namespace } from "../../api/endpoints"; import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; import { Link } from "react-router-dom"; import { Spinner } from "../spinner"; @@ -60,7 +60,7 @@ export class NamespaceDetails extends React.Component { render() { const { object: namespace } = this.props; - if (!namespace) return; + if (!namespace) return null; const status = namespace.getStatus(); return ( diff --git a/src/renderer/components/+namespaces/namespace-select-filter.tsx b/src/renderer/components/+namespaces/namespace-select-filter.tsx index 0bdb4fbb8e..8f4e9df6da 100644 --- a/src/renderer/components/+namespaces/namespace-select-filter.tsx +++ b/src/renderer/components/+namespaces/namespace-select-filter.tsx @@ -28,7 +28,7 @@ import { components, PlaceholderProps } from "react-select"; import { Icon } from "../icon"; import { FilterIcon } from "../item-object-list/filter-icon"; import { FilterType } from "../item-object-list/page-filters.store"; -import { SelectOption } from "../select"; +import type { SelectOption } from "../select"; import { NamespaceSelect } from "./namespace-select"; import { namespaceStore } from "./namespace.store"; diff --git a/src/renderer/components/+namespaces/namespaces.tsx b/src/renderer/components/+namespaces/namespaces.tsx index 4de61ef7c2..2c9a778777 100644 --- a/src/renderer/components/+namespaces/namespaces.tsx +++ b/src/renderer/components/+namespaces/namespaces.tsx @@ -26,9 +26,9 @@ import { Namespace, NamespaceStatus } from "../../api/endpoints"; import { AddNamespaceDialog } from "./add-namespace-dialog"; import { TabLayout } from "../layout/tab-layout"; import { Badge } from "../badge"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { KubeObjectListLayout } from "../kube-object"; -import { INamespacesRouteParams } from "./namespaces.route"; +import type { INamespacesRouteParams } from "./namespaces.route"; import { namespaceStore } from "./namespace.store"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; diff --git a/src/renderer/components/+network-endpoints/endpoint-details.tsx b/src/renderer/components/+network-endpoints/endpoint-details.tsx index eebaa4dd4a..d8cc20f529 100644 --- a/src/renderer/components/+network-endpoints/endpoint-details.tsx +++ b/src/renderer/components/+network-endpoints/endpoint-details.tsx @@ -25,8 +25,8 @@ import React from "react"; import { observer } from "mobx-react"; import { DrawerTitle } from "../drawer"; import { KubeEventDetails } from "../+events/kube-event-details"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { Endpoint } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { Endpoint } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { EndpointSubsetList } from "./endpoint-subset-list"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; @@ -39,7 +39,7 @@ export class EndpointDetails extends React.Component { render() { const { object: endpoint } = this.props; - if (!endpoint) return; + if (!endpoint) return null; return (
diff --git a/src/renderer/components/+network-endpoints/endpoints.tsx b/src/renderer/components/+network-endpoints/endpoints.tsx index 666fde15c8..7cc74427fa 100644 --- a/src/renderer/components/+network-endpoints/endpoints.tsx +++ b/src/renderer/components/+network-endpoints/endpoints.tsx @@ -23,9 +23,9 @@ import "./endpoints.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router-dom"; -import { EndpointRouteParams } from "./endpoints.route"; -import { Endpoint } from "../../api/endpoints/endpoint.api"; +import type { RouteComponentProps } from "react-router-dom"; +import type { EndpointRouteParams } from "./endpoints.route"; +import type { Endpoint } from "../../api/endpoints/endpoint.api"; import { endpointStore } from "./endpoints.store"; import { KubeObjectListLayout } from "../kube-object"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; diff --git a/src/renderer/components/+network-ingresses/ingress-charts.tsx b/src/renderer/components/+network-ingresses/ingress-charts.tsx index 4ebb7d4a9e..178d61652c 100644 --- a/src/renderer/components/+network-ingresses/ingress-charts.tsx +++ b/src/renderer/components/+network-ingresses/ingress-charts.tsx @@ -21,8 +21,8 @@ import React, { useContext } from "react"; import { observer } from "mobx-react"; -import { ChartOptions, ChartPoint } from "chart.js"; -import { IIngressMetrics, Ingress } from "../../api/endpoints"; +import type { ChartOptions, ChartPoint } from "chart.js"; +import type { IIngressMetrics, Ingress } from "../../api/endpoints"; import { BarChart, memoryOptions } from "../chart"; import { normalizeMetrics, isMetricsEmpty } from "../../api/endpoints/metrics.api"; import { NoMetrics } from "../resource-metrics/no-metrics"; diff --git a/src/renderer/components/+network-ingresses/ingress-details.tsx b/src/renderer/components/+network-ingresses/ingress-details.tsx index 896ed1ea92..8e9ddf7bb4 100644 --- a/src/renderer/components/+network-ingresses/ingress-details.tsx +++ b/src/renderer/components/+network-ingresses/ingress-details.tsx @@ -25,12 +25,12 @@ import React from "react"; import { disposeOnUnmount, observer } from "mobx-react"; import { reaction } from "mobx"; import { DrawerItem, DrawerTitle } from "../drawer"; -import { ILoadBalancerIngress, Ingress } from "../../api/endpoints"; +import type { ILoadBalancerIngress, Ingress } from "../../api/endpoints"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { KubeEventDetails } from "../+events/kube-event-details"; import { ingressStore } from "./ingress.store"; import { ResourceMetrics } from "../resource-metrics"; -import { KubeObjectDetailsProps } from "../kube-object"; +import type { KubeObjectDetailsProps } from "../kube-object"; import { IngressCharts } from "./ingress-charts"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; diff --git a/src/renderer/components/+network-ingresses/ingresses.tsx b/src/renderer/components/+network-ingresses/ingresses.tsx index 9005aaeedf..1ee39d4010 100644 --- a/src/renderer/components/+network-ingresses/ingresses.tsx +++ b/src/renderer/components/+network-ingresses/ingresses.tsx @@ -23,9 +23,9 @@ import "./ingresses.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router-dom"; -import { IngressRouteParams } from "./ingresses.route"; -import { Ingress } from "../../api/endpoints/ingress.api"; +import type { RouteComponentProps } from "react-router-dom"; +import type { IngressRouteParams } from "./ingresses.route"; +import type { Ingress } from "../../api/endpoints/ingress.api"; import { ingressStore } from "./ingress.store"; import { KubeObjectListLayout } from "../kube-object"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; diff --git a/src/renderer/components/+network-policies/network-policies.tsx b/src/renderer/components/+network-policies/network-policies.tsx index 558973a0ad..1010c07175 100644 --- a/src/renderer/components/+network-policies/network-policies.tsx +++ b/src/renderer/components/+network-policies/network-policies.tsx @@ -23,10 +23,10 @@ import "./network-policies.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router-dom"; -import { NetworkPolicy } from "../../api/endpoints/network-policy.api"; +import type { RouteComponentProps } from "react-router-dom"; +import type { NetworkPolicy } from "../../api/endpoints/network-policy.api"; import { KubeObjectListLayout } from "../kube-object"; -import { INetworkPoliciesRouteParams } from "./network-policies.route"; +import type { INetworkPoliciesRouteParams } from "./network-policies.route"; import { networkPolicyStore } from "./network-policy.store"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; diff --git a/src/renderer/components/+network-policies/network-policy-details.tsx b/src/renderer/components/+network-policies/network-policy-details.tsx index 54a0e8e93a..289d139fb5 100644 --- a/src/renderer/components/+network-policies/network-policy-details.tsx +++ b/src/renderer/components/+network-policies/network-policy-details.tsx @@ -24,12 +24,12 @@ import "./network-policy-details.scss"; import get from "lodash/get"; import React, { Fragment } from "react"; import { DrawerItem, DrawerTitle } from "../drawer"; -import { IPolicyEgress, IPolicyIngress, IPolicyIpBlock, IPolicySelector, NetworkPolicy } from "../../api/endpoints/network-policy.api"; +import type { IPolicyEgress, IPolicyIngress, IPolicyIpBlock, IPolicySelector, NetworkPolicy } from "../../api/endpoints/network-policy.api"; import { Badge } from "../badge"; import { SubTitle } from "../layout/sub-title"; import { KubeEventDetails } from "../+events/kube-event-details"; import { observer } from "mobx-react"; -import { KubeObjectDetailsProps } from "../kube-object"; +import type { KubeObjectDetailsProps } from "../kube-object"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; @@ -53,7 +53,7 @@ export class NetworkPolicyDetails extends React.Component { if (key === "ipBlock") { const { cidr, except } = data as IPolicyIpBlock; - if (!cidr) return; + if (!cidr) return null; return ( @@ -96,12 +96,9 @@ export class NetworkPolicyDetails extends React.Component { <> {to.map(item => { - const { ipBlock } = item; + const { ipBlock: { cidr, except } = {} } = item; - if (!ipBlock) return; - const { cidr, except } = ipBlock; - - if (!cidr) return; + if (!cidr) return null; return ( diff --git a/src/renderer/components/+network-services/service-details-endpoint.tsx b/src/renderer/components/+network-services/service-details-endpoint.tsx index 9ba114c90c..2e04c78f1a 100644 --- a/src/renderer/components/+network-services/service-details-endpoint.tsx +++ b/src/renderer/components/+network-services/service-details-endpoint.tsx @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; import { observer } from "mobx-react"; import React from "react"; import { Table, TableHead, TableCell, TableRow } from "../table"; diff --git a/src/renderer/components/+network-services/service-details.tsx b/src/renderer/components/+network-services/service-details.tsx index 804519ae18..f04b5687af 100644 --- a/src/renderer/components/+network-services/service-details.tsx +++ b/src/renderer/components/+network-services/service-details.tsx @@ -26,8 +26,8 @@ import { disposeOnUnmount, observer } from "mobx-react"; import { DrawerItem, DrawerTitle } from "../drawer"; import { Badge } from "../badge"; import { KubeEventDetails } from "../+events/kube-event-details"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { Service } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { Service } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { ServicePortComponent } from "./service-port-component"; import { endpointStore } from "../+network-endpoints/endpoints.store"; @@ -51,7 +51,7 @@ export class ServiceDetails extends React.Component { render() { const { object: service } = this.props; - if (!service) return; + if (!service) return null; const { spec } = service; const endpoint = endpointStore.getByName(service.getName(), service.getNs()); diff --git a/src/renderer/components/+network-services/service-port-component.tsx b/src/renderer/components/+network-services/service-port-component.tsx index 1b297ed26a..c83ea9eb17 100644 --- a/src/renderer/components/+network-services/service-port-component.tsx +++ b/src/renderer/components/+network-services/service-port-component.tsx @@ -23,7 +23,7 @@ import "./service-port-component.scss"; import React from "react"; import { observer } from "mobx-react"; -import { Service, ServicePort } from "../../api/endpoints"; +import type { Service, ServicePort } from "../../api/endpoints"; import { apiBase } from "../../api"; import { observable } from "mobx"; import { cssNames } from "../../utils"; diff --git a/src/renderer/components/+network-services/services.tsx b/src/renderer/components/+network-services/services.tsx index 739b9c30c9..33f9b73e08 100644 --- a/src/renderer/components/+network-services/services.tsx +++ b/src/renderer/components/+network-services/services.tsx @@ -23,9 +23,9 @@ import "./services.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; -import { IServicesRouteParams } from "./services.route"; -import { Service } from "../../api/endpoints/service.api"; +import type { RouteComponentProps } from "react-router"; +import type { IServicesRouteParams } from "./services.route"; +import type { Service } from "../../api/endpoints/service.api"; import { KubeObjectListLayout } from "../kube-object"; import { Badge } from "../badge"; import { serviceStore } from "./services.store"; diff --git a/src/renderer/components/+network/network.route.ts b/src/renderer/components/+network/network.route.ts index 7647ddeca6..a827461f8f 100644 --- a/src/renderer/components/+network/network.route.ts +++ b/src/renderer/components/+network/network.route.ts @@ -19,12 +19,12 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { RouteProps } from "react-router"; +import type { RouteProps } from "react-router"; import { endpointRoute } from "../+network-endpoints"; import { ingressRoute } from "../+network-ingresses"; import { networkPoliciesRoute } from "../+network-policies"; import { servicesRoute, servicesURL } from "../+network-services"; -import { IURLParams } from "../../../common/utils/buildUrl"; +import type { IURLParams } from "../../../common/utils/buildUrl"; export const networkRoute: RouteProps = { path: [ diff --git a/src/renderer/components/+nodes/node-charts.tsx b/src/renderer/components/+nodes/node-charts.tsx index 9a1b1c7e1a..664da5a19b 100644 --- a/src/renderer/components/+nodes/node-charts.tsx +++ b/src/renderer/components/+nodes/node-charts.tsx @@ -20,13 +20,13 @@ */ import React, { useContext } from "react"; -import { IClusterMetrics, Node } from "../../api/endpoints"; +import type { IClusterMetrics, Node } from "../../api/endpoints"; import { BarChart, cpuOptions, memoryOptions } from "../chart"; import { isMetricsEmpty, normalizeMetrics } from "../../api/endpoints/metrics.api"; import { NoMetrics } from "../resource-metrics/no-metrics"; import { IResourceMetricsValue, ResourceMetricsContext } from "../resource-metrics"; import { observer } from "mobx-react"; -import { ChartOptions, ChartPoint } from "chart.js"; +import type { ChartOptions, ChartPoint } from "chart.js"; import { ThemeStore } from "../../theme.store"; import { mapValues } from "lodash"; diff --git a/src/renderer/components/+nodes/node-details.tsx b/src/renderer/components/+nodes/node-details.tsx index e0b93364af..df98312d17 100644 --- a/src/renderer/components/+nodes/node-details.tsx +++ b/src/renderer/components/+nodes/node-details.tsx @@ -30,8 +30,8 @@ import { Badge } from "../badge"; import { nodesStore } from "./nodes.store"; import { ResourceMetrics } from "../resource-metrics"; import { podsStore } from "../+workloads-pods/pods.store"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { Node } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { Node } from "../../api/endpoints"; import { NodeCharts } from "./node-charts"; import { reaction } from "mobx"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; @@ -62,7 +62,7 @@ export class NodeDetails extends React.Component { render() { const { object: node } = this.props; - if (!node) return; + if (!node) return null; const { status } = node; const { nodeInfo, addresses, capacity, allocatable } = status; const conditions = node.getActiveConditions(); diff --git a/src/renderer/components/+nodes/nodes.store.ts b/src/renderer/components/+nodes/nodes.store.ts index eb7c94cc25..cd7bb12123 100644 --- a/src/renderer/components/+nodes/nodes.store.ts +++ b/src/renderer/components/+nodes/nodes.store.ts @@ -62,7 +62,7 @@ export class NodesStore extends KubeObjectStore { getLastMetricValues(node: Node, metricNames: string[]): number[] { if (!this.metricsLoaded) { - return; + return []; } const nodeName = node.getName(); diff --git a/src/renderer/components/+nodes/nodes.tsx b/src/renderer/components/+nodes/nodes.tsx index 72ef7e07a4..953562b06b 100644 --- a/src/renderer/components/+nodes/nodes.tsx +++ b/src/renderer/components/+nodes/nodes.tsx @@ -22,14 +22,14 @@ import "./nodes.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { cssNames, interval } from "../../utils"; import { TabLayout } from "../layout/tab-layout"; import { nodesStore } from "./nodes.store"; import { podsStore } from "../+workloads-pods/pods.store"; import { KubeObjectListLayout } from "../kube-object"; -import { INodesRouteParams } from "./nodes.route"; -import { Node } from "../../api/endpoints/nodes.api"; +import type { INodesRouteParams } from "./nodes.route"; +import type { Node } from "../../api/endpoints/nodes.api"; import { LineProgress } from "../line-progress"; import { bytesToUnits } from "../../utils/convertMemory"; import { Tooltip, TooltipPosition } from "../tooltip"; @@ -73,8 +73,8 @@ export class Nodes extends React.Component { const usage = metrics[0]; const cores = metrics[1]; const cpuUsagePercent = Math.ceil(usage * 100) / cores; - const cpuUsagePercentLabel: String = cpuUsagePercent % 1 === 0 - ? cpuUsagePercent.toString() + const cpuUsagePercentLabel: String = cpuUsagePercent % 1 === 0 + ? cpuUsagePercent.toString() : cpuUsagePercent.toFixed(2); return ( diff --git a/src/renderer/components/+pod-security-policies/pod-security-policies.tsx b/src/renderer/components/+pod-security-policies/pod-security-policies.tsx index 3cefe234e9..addae6322e 100644 --- a/src/renderer/components/+pod-security-policies/pod-security-policies.tsx +++ b/src/renderer/components/+pod-security-policies/pod-security-policies.tsx @@ -25,7 +25,7 @@ import React from "react"; import { observer } from "mobx-react"; import { KubeObjectListLayout } from "../kube-object"; import { podSecurityPoliciesStore } from "./pod-security-policies.store"; -import { PodSecurityPolicy } from "../../api/endpoints"; +import type { PodSecurityPolicy } from "../../api/endpoints"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum columnId { diff --git a/src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx b/src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx index 615e87a7fd..eacc4f7696 100644 --- a/src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx +++ b/src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx @@ -24,8 +24,8 @@ import "./pod-security-policy-details.scss"; import React from "react"; import { observer } from "mobx-react"; import { DrawerItem, DrawerTitle } from "../drawer"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { PodSecurityPolicy } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { PodSecurityPolicy } from "../../api/endpoints"; import { Badge } from "../badge"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; @@ -42,7 +42,7 @@ export class PodSecurityPolicyDetails extends React.Component { rule: string; ranges?: { max: number; min: number }[]; }) { - if (!group) return; + if (!group) return null; const { rule, ranges } = group; return ( diff --git a/src/renderer/components/+storage-classes/storage-class-details.tsx b/src/renderer/components/+storage-classes/storage-class-details.tsx index 1db217ac83..e99501b963 100644 --- a/src/renderer/components/+storage-classes/storage-class-details.tsx +++ b/src/renderer/components/+storage-classes/storage-class-details.tsx @@ -27,8 +27,8 @@ import { DrawerItem, DrawerTitle } from "../drawer"; import { Badge } from "../badge"; import { KubeEventDetails } from "../+events/kube-event-details"; import { observer } from "mobx-react"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { StorageClass } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { StorageClass } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { storageClassStore } from "./storage-class.store"; diff --git a/src/renderer/components/+storage-classes/storage-classes.tsx b/src/renderer/components/+storage-classes/storage-classes.tsx index 725230afe0..39182abb46 100644 --- a/src/renderer/components/+storage-classes/storage-classes.tsx +++ b/src/renderer/components/+storage-classes/storage-classes.tsx @@ -22,11 +22,11 @@ import "./storage-classes.scss"; import React from "react"; -import { RouteComponentProps } from "react-router-dom"; +import type { RouteComponentProps } from "react-router-dom"; import { observer } from "mobx-react"; -import { StorageClass } from "../../api/endpoints/storage-class.api"; +import type { StorageClass } from "../../api/endpoints/storage-class.api"; import { KubeObjectListLayout } from "../kube-object"; -import { IStorageClassesRouteParams } from "./storage-classes.route"; +import type { IStorageClassesRouteParams } from "./storage-classes.route"; import { storageClassStore } from "./storage-class.store"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; diff --git a/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx b/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx index f7ad7ff65c..c2ae2f672f 100644 --- a/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx +++ b/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx @@ -33,7 +33,7 @@ import { volumeClaimStore } from "./volume-claim.store"; import { ResourceMetrics } from "../resource-metrics"; import { VolumeClaimDiskChart } from "./volume-claim-disk-chart"; import { getDetailsUrl, KubeObjectDetailsProps, KubeObjectMeta } from "../kube-object"; -import { PersistentVolumeClaim } from "../../api/endpoints"; +import type { PersistentVolumeClaim } from "../../api/endpoints"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { ClusterStore } from "../../../common/cluster-store"; diff --git a/src/renderer/components/+storage-volume-claims/volume-claim-disk-chart.tsx b/src/renderer/components/+storage-volume-claims/volume-claim-disk-chart.tsx index cf09c4caa5..cd1c6f7024 100644 --- a/src/renderer/components/+storage-volume-claims/volume-claim-disk-chart.tsx +++ b/src/renderer/components/+storage-volume-claims/volume-claim-disk-chart.tsx @@ -21,7 +21,7 @@ import React, { useContext } from "react"; import { observer } from "mobx-react"; -import { IPvcMetrics, PersistentVolumeClaim } from "../../api/endpoints"; +import type { IPvcMetrics, PersistentVolumeClaim } from "../../api/endpoints"; import { BarChart, ChartDataSets, memoryOptions } from "../chart"; import { isMetricsEmpty, normalizeMetrics } from "../../api/endpoints/metrics.api"; import { NoMetrics } from "../resource-metrics/no-metrics"; diff --git a/src/renderer/components/+storage-volume-claims/volume-claims.tsx b/src/renderer/components/+storage-volume-claims/volume-claims.tsx index 404dcf5da5..34309b43ec 100644 --- a/src/renderer/components/+storage-volume-claims/volume-claims.tsx +++ b/src/renderer/components/+storage-volume-claims/volume-claims.tsx @@ -25,10 +25,10 @@ import React from "react"; import { observer } from "mobx-react"; import { Link, RouteComponentProps } from "react-router-dom"; import { volumeClaimStore } from "./volume-claim.store"; -import { PersistentVolumeClaim } from "../../api/endpoints/persistent-volume-claims.api"; +import type { PersistentVolumeClaim } from "../../api/endpoints/persistent-volume-claims.api"; import { podsStore } from "../+workloads-pods/pods.store"; import { getDetailsUrl, KubeObjectListLayout } from "../kube-object"; -import { IVolumeClaimsRouteParams } from "./volume-claims.route"; +import type { IVolumeClaimsRouteParams } from "./volume-claims.route"; import { unitsToBytes } from "../../utils/convertMemory"; import { stopPropagation } from "../../utils"; import { storageClassApi } from "../../api/endpoints"; diff --git a/src/renderer/components/+storage-volumes/volume-details-list.tsx b/src/renderer/components/+storage-volumes/volume-details-list.tsx index c69d470c8c..6cb3eec3d1 100644 --- a/src/renderer/components/+storage-volumes/volume-details-list.tsx +++ b/src/renderer/components/+storage-volumes/volume-details-list.tsx @@ -23,7 +23,7 @@ import "./volume-details-list.scss"; import React from "react"; import { observer } from "mobx-react"; -import { PersistentVolume } from "../../api/endpoints/persistent-volume.api"; +import type { PersistentVolume } from "../../api/endpoints/persistent-volume.api"; import { autobind } from "../../../common/utils/autobind"; import { TableRow } from "../table/table-row"; import { cssNames, prevDefault } from "../../utils"; diff --git a/src/renderer/components/+storage-volumes/volumes.store.ts b/src/renderer/components/+storage-volumes/volumes.store.ts index 97fa2b18f2..f6c1012dd8 100644 --- a/src/renderer/components/+storage-volumes/volumes.store.ts +++ b/src/renderer/components/+storage-volumes/volumes.store.ts @@ -23,7 +23,7 @@ import { KubeObjectStore } from "../../kube-object.store"; import { autobind } from "../../utils"; import { PersistentVolume, persistentVolumeApi } from "../../api/endpoints/persistent-volume.api"; import { apiManager } from "../../api/api-manager"; -import { StorageClass } from "../../api/endpoints/storage-class.api"; +import type { StorageClass } from "../../api/endpoints/storage-class.api"; @autobind() export class PersistentVolumesStore extends KubeObjectStore { diff --git a/src/renderer/components/+storage-volumes/volumes.tsx b/src/renderer/components/+storage-volumes/volumes.tsx index 590fe11a38..858d362bb2 100644 --- a/src/renderer/components/+storage-volumes/volumes.tsx +++ b/src/renderer/components/+storage-volumes/volumes.tsx @@ -24,9 +24,9 @@ import "./volumes.scss"; import React from "react"; import { observer } from "mobx-react"; import { Link, RouteComponentProps } from "react-router-dom"; -import { PersistentVolume } from "../../api/endpoints/persistent-volume.api"; +import type { PersistentVolume } from "../../api/endpoints/persistent-volume.api"; import { getDetailsUrl, KubeObjectListLayout } from "../kube-object"; -import { IVolumesRouteParams } from "./volumes.route"; +import type { IVolumesRouteParams } from "./volumes.route"; import { stopPropagation } from "../../utils"; import { volumesStore } from "./volumes.store"; import { pvcApi, storageClassApi } from "../../api/endpoints"; diff --git a/src/renderer/components/+storage/storage.route.ts b/src/renderer/components/+storage/storage.route.ts index 3162e18b8e..6903a76375 100644 --- a/src/renderer/components/+storage/storage.route.ts +++ b/src/renderer/components/+storage/storage.route.ts @@ -19,11 +19,11 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { RouteProps } from "react-router"; +import type { RouteProps } from "react-router"; import { storageClassesRoute } from "../+storage-classes"; import { volumeClaimsRoute, volumeClaimsURL } from "../+storage-volume-claims"; import { volumesRoute } from "../+storage-volumes"; -import { IURLParams } from "../../../common/utils/buildUrl"; +import type { IURLParams } from "../../../common/utils/buildUrl"; export const storageRoute: RouteProps = { path: [ diff --git a/src/renderer/components/+user-management-roles-bindings/add-role-binding-dialog.tsx b/src/renderer/components/+user-management-roles-bindings/add-role-binding-dialog.tsx index 71c0b25406..83ae0b9abd 100644 --- a/src/renderer/components/+user-management-roles-bindings/add-role-binding-dialog.tsx +++ b/src/renderer/components/+user-management-roles-bindings/add-role-binding-dialog.tsx @@ -40,7 +40,7 @@ import { namespaceStore } from "../+namespaces/namespace.store"; import { serviceAccountsStore } from "../+user-management-service-accounts/service-accounts.store"; import { roleBindingsStore } from "./role-bindings.store"; import { showDetails } from "../kube-object"; -import { KubeObjectStore } from "../../kube-object.store"; +import type { KubeObjectStore } from "../../kube-object.store"; interface BindingSelectOption extends SelectOption { value: string; // binding name diff --git a/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx b/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx index 2d5ff1a30f..c42cdbebed 100644 --- a/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx +++ b/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx @@ -23,7 +23,7 @@ import "./role-binding-details.scss"; import React from "react"; import { AddRemoveButtons } from "../add-remove-buttons"; -import { IRoleBindingSubject, RoleBinding } from "../../api/endpoints"; +import type { IRoleBindingSubject, RoleBinding } from "../../api/endpoints"; import { autobind, prevDefault } from "../../utils"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { ConfirmDialog } from "../confirm-dialog"; @@ -33,7 +33,7 @@ import { disposeOnUnmount, observer } from "mobx-react"; import { observable, reaction } from "mobx"; import { roleBindingsStore } from "./role-bindings.store"; import { AddRoleBindingDialog } from "./add-role-binding-dialog"; -import { KubeObjectDetailsProps } from "../kube-object"; +import type { KubeObjectDetailsProps } from "../kube-object"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; diff --git a/src/renderer/components/+user-management-roles-bindings/role-bindings.tsx b/src/renderer/components/+user-management-roles-bindings/role-bindings.tsx index d406141d16..db86d37cd6 100644 --- a/src/renderer/components/+user-management-roles-bindings/role-bindings.tsx +++ b/src/renderer/components/+user-management-roles-bindings/role-bindings.tsx @@ -23,9 +23,9 @@ import "./role-bindings.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; -import { IRoleBindingsRouteParams } from "../+user-management/user-management.route"; -import { RoleBinding } from "../../api/endpoints"; +import type { RouteComponentProps } from "react-router"; +import type { IRoleBindingsRouteParams } from "../+user-management/user-management.route"; +import type { RoleBinding } from "../../api/endpoints"; import { roleBindingsStore } from "./role-bindings.store"; import { KubeObjectListLayout } from "../kube-object"; import { AddRoleBindingDialog } from "./add-role-binding-dialog"; diff --git a/src/renderer/components/+user-management-roles/role-details.tsx b/src/renderer/components/+user-management-roles/role-details.tsx index 1d6344c561..34fb92f816 100644 --- a/src/renderer/components/+user-management-roles/role-details.tsx +++ b/src/renderer/components/+user-management-roles/role-details.tsx @@ -25,8 +25,8 @@ import React from "react"; import { DrawerTitle } from "../drawer"; import { KubeEventDetails } from "../+events/kube-event-details"; import { observer } from "mobx-react"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { Role } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { Role } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; @@ -38,7 +38,7 @@ export class RoleDetails extends React.Component { render() { const { object: role } = this.props; - if (!role) return; + if (!role) return null; const rules = role.getRules(); return ( diff --git a/src/renderer/components/+user-management-roles/roles.tsx b/src/renderer/components/+user-management-roles/roles.tsx index 028edeb926..ac7385cb2c 100644 --- a/src/renderer/components/+user-management-roles/roles.tsx +++ b/src/renderer/components/+user-management-roles/roles.tsx @@ -23,10 +23,10 @@ import "./roles.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; -import { IRolesRouteParams } from "../+user-management/user-management.route"; +import type { RouteComponentProps } from "react-router"; +import type { IRolesRouteParams } from "../+user-management/user-management.route"; import { rolesStore } from "./roles.store"; -import { Role } from "../../api/endpoints"; +import type { Role } from "../../api/endpoints"; import { KubeObjectListLayout } from "../kube-object"; import { AddRoleDialog } from "./add-role-dialog"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; diff --git a/src/renderer/components/+user-management-service-accounts/service-accounts-secret.tsx b/src/renderer/components/+user-management-service-accounts/service-accounts-secret.tsx index 060fdffe1b..d57bb8cc05 100644 --- a/src/renderer/components/+user-management-service-accounts/service-accounts-secret.tsx +++ b/src/renderer/components/+user-management-service-accounts/service-accounts-secret.tsx @@ -24,7 +24,7 @@ import "./service-accounts-secret.scss"; import React from "react"; import moment from "moment"; import { Icon } from "../icon"; -import { Secret } from "../../api/endpoints/secret.api"; +import type { Secret } from "../../api/endpoints/secret.api"; import { prevDefault } from "../../utils"; interface Props { diff --git a/src/renderer/components/+user-management-service-accounts/service-accounts.tsx b/src/renderer/components/+user-management-service-accounts/service-accounts.tsx index f8a77ff381..dff4d1fe58 100644 --- a/src/renderer/components/+user-management-service-accounts/service-accounts.tsx +++ b/src/renderer/components/+user-management-service-accounts/service-accounts.tsx @@ -23,14 +23,14 @@ import "./service-accounts.scss"; import React from "react"; import { observer } from "mobx-react"; -import { ServiceAccount } from "../../api/endpoints/service-accounts.api"; -import { RouteComponentProps } from "react-router"; -import { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; +import type { ServiceAccount } from "../../api/endpoints/service-accounts.api"; +import type { RouteComponentProps } from "react-router"; +import type { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; import { MenuItem } from "../menu"; import { openServiceAccountKubeConfig } from "../kubeconfig-dialog"; import { Icon } from "../icon"; import { KubeObjectListLayout } from "../kube-object"; -import { IServiceAccountsRouteParams } from "../+user-management"; +import type { IServiceAccountsRouteParams } from "../+user-management"; import { serviceAccountsStore } from "./service-accounts.store"; import { CreateServiceAccountDialog } from "./create-service-account-dialog"; import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; diff --git a/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx b/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx index 2e0e88a856..e86f4f5c8e 100644 --- a/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx +++ b/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx @@ -31,7 +31,7 @@ import { Link } from "react-router-dom"; import { KubeEventDetails } from "../+events/kube-event-details"; import { cronJobStore } from "./cronjob.store"; import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; -import { CronJob, Job } from "../../api/endpoints"; +import type { CronJob, Job } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; diff --git a/src/renderer/components/+workloads-cronjobs/cronjobs.tsx b/src/renderer/components/+workloads-cronjobs/cronjobs.tsx index e32834ad6b..04560aa197 100644 --- a/src/renderer/components/+workloads-cronjobs/cronjobs.tsx +++ b/src/renderer/components/+workloads-cronjobs/cronjobs.tsx @@ -23,15 +23,15 @@ import "./cronjobs.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { CronJob, cronJobApi } from "../../api/endpoints/cron-job.api"; import { MenuItem } from "../menu"; import { Icon } from "../icon"; import { cronJobStore } from "./cronjob.store"; import { jobStore } from "../+workloads-jobs/job.store"; import { eventStore } from "../+events/event.store"; -import { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; -import { ICronJobsRouteParams } from "../+workloads"; +import type { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; +import type { ICronJobsRouteParams } from "../+workloads"; import { KubeObjectListLayout } from "../kube-object"; import { CronJobTriggerDialog } from "./cronjob-trigger-dialog"; import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; diff --git a/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx b/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx index 1c94fb4a34..96bf692e72 100644 --- a/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx +++ b/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx @@ -31,8 +31,8 @@ import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities" import { KubeEventDetails } from "../+events/kube-event-details"; import { daemonSetStore } from "./daemonsets.store"; import { podsStore } from "../+workloads-pods/pods.store"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { DaemonSet } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { DaemonSet } from "../../api/endpoints"; import { ResourceMetrics, ResourceMetricsText } from "../resource-metrics"; import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; import { reaction } from "mobx"; diff --git a/src/renderer/components/+workloads-daemonsets/daemonsets.tsx b/src/renderer/components/+workloads-daemonsets/daemonsets.tsx index a9c441f1ae..b256ac1f62 100644 --- a/src/renderer/components/+workloads-daemonsets/daemonsets.tsx +++ b/src/renderer/components/+workloads-daemonsets/daemonsets.tsx @@ -23,14 +23,14 @@ import "./daemonsets.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; -import { DaemonSet } from "../../api/endpoints"; +import type { RouteComponentProps } from "react-router"; +import type { DaemonSet } from "../../api/endpoints"; import { eventStore } from "../+events/event.store"; import { daemonSetStore } from "./daemonsets.store"; import { podsStore } from "../+workloads-pods/pods.store"; import { nodesStore } from "../+nodes/nodes.store"; import { KubeObjectListLayout } from "../kube-object"; -import { IDaemonSetsRouteParams } from "../+workloads"; +import type { IDaemonSetsRouteParams } from "../+workloads"; import { Badge } from "../badge"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; diff --git a/src/renderer/components/+workloads-deployments/deployment-details.tsx b/src/renderer/components/+workloads-deployments/deployment-details.tsx index 112953e63a..21bf03bdf5 100644 --- a/src/renderer/components/+workloads-deployments/deployment-details.tsx +++ b/src/renderer/components/+workloads-deployments/deployment-details.tsx @@ -26,13 +26,13 @@ import kebabCase from "lodash/kebabCase"; import { disposeOnUnmount, observer } from "mobx-react"; import { DrawerItem } from "../drawer"; import { Badge } from "../badge"; -import { Deployment } from "../../api/endpoints"; +import type { Deployment } from "../../api/endpoints"; import { cssNames } from "../../utils"; import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations"; import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities"; import { KubeEventDetails } from "../+events/kube-event-details"; import { podsStore } from "../+workloads-pods/pods.store"; -import { KubeObjectDetailsProps } from "../kube-object"; +import type { KubeObjectDetailsProps } from "../kube-object"; import { ResourceMetrics, ResourceMetricsText } from "../resource-metrics"; import { deploymentStore } from "./deployments.store"; import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; diff --git a/src/renderer/components/+workloads-deployments/deployment-replicasets.tsx b/src/renderer/components/+workloads-deployments/deployment-replicasets.tsx index 8fbce9564d..0a556ddcfc 100644 --- a/src/renderer/components/+workloads-deployments/deployment-replicasets.tsx +++ b/src/renderer/components/+workloads-deployments/deployment-replicasets.tsx @@ -23,7 +23,7 @@ import "./deployment-replicasets.scss"; import React from "react"; import { observer } from "mobx-react"; -import { ReplicaSet } from "../../api/endpoints"; +import type { ReplicaSet } from "../../api/endpoints"; import { KubeObjectMenu, KubeObjectMenuProps } from "../kube-object/kube-object-menu"; import { Spinner } from "../spinner"; import { prevDefault, stopPropagation } from "../../utils"; diff --git a/src/renderer/components/+workloads-deployments/deployments.tsx b/src/renderer/components/+workloads-deployments/deployments.tsx index 77b6c34abe..74ddb08fcb 100644 --- a/src/renderer/components/+workloads-deployments/deployments.tsx +++ b/src/renderer/components/+workloads-deployments/deployments.tsx @@ -23,9 +23,9 @@ import "./deployments.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { Deployment, deploymentApi } from "../../api/endpoints"; -import { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; +import type { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; import { MenuItem } from "../menu"; import { Icon } from "../icon"; import { DeploymentScaleDialog } from "./deployment-scale-dialog"; @@ -36,7 +36,7 @@ import { podsStore } from "../+workloads-pods/pods.store"; import { nodesStore } from "../+nodes/nodes.store"; import { eventStore } from "../+events/event.store"; import { KubeObjectListLayout } from "../kube-object"; -import { IDeploymentsRouteParams } from "../+workloads"; +import type { IDeploymentsRouteParams } from "../+workloads"; import { cssNames } from "../../utils"; import kebabCase from "lodash/kebabCase"; import orderBy from "lodash/orderBy"; diff --git a/src/renderer/components/+workloads-jobs/job-details.tsx b/src/renderer/components/+workloads-jobs/job-details.tsx index a947c918d1..6fcbff96e7 100644 --- a/src/renderer/components/+workloads-jobs/job-details.tsx +++ b/src/renderer/components/+workloads-jobs/job-details.tsx @@ -34,7 +34,7 @@ import { KubeEventDetails } from "../+events/kube-event-details"; import { podsStore } from "../+workloads-pods/pods.store"; import { jobStore } from "./job.store"; import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; -import { Job } from "../../api/endpoints"; +import type { Job } from "../../api/endpoints"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { lookupApiLink } from "../../api/kube-api"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; diff --git a/src/renderer/components/+workloads-jobs/jobs.tsx b/src/renderer/components/+workloads-jobs/jobs.tsx index 6a131638f4..bcc9b85efe 100644 --- a/src/renderer/components/+workloads-jobs/jobs.tsx +++ b/src/renderer/components/+workloads-jobs/jobs.tsx @@ -23,13 +23,13 @@ import "./jobs.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { podsStore } from "../+workloads-pods/pods.store"; import { jobStore } from "./job.store"; import { eventStore } from "../+events/event.store"; -import { Job } from "../../api/endpoints/job.api"; +import type { Job } from "../../api/endpoints/job.api"; import { KubeObjectListLayout } from "../kube-object"; -import { IJobsRouteParams } from "../+workloads"; +import type { IJobsRouteParams } from "../+workloads"; import kebabCase from "lodash/kebabCase"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; diff --git a/src/renderer/components/+workloads-overview/overview-workload-status.tsx b/src/renderer/components/+workloads-overview/overview-workload-status.tsx index ec3c9878b4..65729ad255 100644 --- a/src/renderer/components/+workloads-overview/overview-workload-status.tsx +++ b/src/renderer/components/+workloads-overview/overview-workload-status.tsx @@ -28,7 +28,7 @@ import { observable } from "mobx"; import { observer } from "mobx-react"; import { PieChart } from "../chart"; import { cssVar } from "../../utils"; -import { ChartData, ChartDataSets } from "chart.js"; +import type { ChartData, ChartDataSets } from "chart.js"; import { ThemeStore } from "../../theme.store"; interface SimpleChartDataSets extends ChartDataSets { diff --git a/src/renderer/components/+workloads-overview/overview.tsx b/src/renderer/components/+workloads-overview/overview.tsx index 63e5881763..82c3549fb1 100644 --- a/src/renderer/components/+workloads-overview/overview.tsx +++ b/src/renderer/components/+workloads-overview/overview.tsx @@ -24,8 +24,8 @@ import "./overview.scss"; import React from "react"; import { disposeOnUnmount, observer } from "mobx-react"; import { OverviewStatuses } from "./overview-statuses"; -import { RouteComponentProps } from "react-router"; -import { IWorkloadsOverviewRouteParams } from "../+workloads"; +import type { RouteComponentProps } from "react-router"; +import type { IWorkloadsOverviewRouteParams } from "../+workloads"; import { eventStore } from "../+events/event.store"; import { podsStore } from "../+workloads-pods/pods.store"; import { deploymentStore } from "../+workloads-deployments/deployments.store"; diff --git a/src/renderer/components/+workloads-pods/__tests__/pod-tolerations.test.tsx b/src/renderer/components/+workloads-pods/__tests__/pod-tolerations.test.tsx index c41a32bd27..30ef2e98e9 100644 --- a/src/renderer/components/+workloads-pods/__tests__/pod-tolerations.test.tsx +++ b/src/renderer/components/+workloads-pods/__tests__/pod-tolerations.test.tsx @@ -22,9 +22,15 @@ import React from "react"; import "@testing-library/jest-dom/extend-expect"; import { fireEvent, render } from "@testing-library/react"; -import { IToleration } from "../../../api/workload-kube-object"; +import type { IToleration } from "../../../api/workload-kube-object"; import { PodTolerations } from "../pod-tolerations"; +jest.mock("electron", () => ({ + app: { + getPath: () => "/foo", + }, +})); + const tolerations: IToleration[] =[ { key: "CriticalAddonsOnly", diff --git a/src/renderer/components/+workloads-pods/container-charts.tsx b/src/renderer/components/+workloads-pods/container-charts.tsx index 558fb4c859..df55fc9b59 100644 --- a/src/renderer/components/+workloads-pods/container-charts.tsx +++ b/src/renderer/components/+workloads-pods/container-charts.tsx @@ -21,7 +21,7 @@ import React, { useContext } from "react"; import { observer } from "mobx-react"; -import { IPodMetrics } from "../../api/endpoints"; +import type { IPodMetrics } from "../../api/endpoints"; import { BarChart, cpuOptions, memoryOptions } from "../chart"; import { isMetricsEmpty, normalizeMetrics } from "../../api/endpoints/metrics.api"; import { NoMetrics } from "../resource-metrics/no-metrics"; diff --git a/src/renderer/components/+workloads-pods/pod-charts.tsx b/src/renderer/components/+workloads-pods/pod-charts.tsx index a83b96384f..d3aafa0214 100644 --- a/src/renderer/components/+workloads-pods/pod-charts.tsx +++ b/src/renderer/components/+workloads-pods/pod-charts.tsx @@ -21,12 +21,12 @@ import React, { useContext } from "react"; import { observer } from "mobx-react"; -import { IPodMetrics } from "../../api/endpoints"; +import type { IPodMetrics } from "../../api/endpoints"; import { BarChart, cpuOptions, memoryOptions } from "../chart"; import { isMetricsEmpty, normalizeMetrics } from "../../api/endpoints/metrics.api"; import { NoMetrics } from "../resource-metrics/no-metrics"; import { IResourceMetricsValue, ResourceMetricsContext } from "../resource-metrics"; -import { WorkloadKubeObject } from "../../api/workload-kube-object"; +import type { WorkloadKubeObject } from "../../api/workload-kube-object"; import { ThemeStore } from "../../theme.store"; export const podMetricTabs = [ diff --git a/src/renderer/components/+workloads-pods/pod-container-env.tsx b/src/renderer/components/+workloads-pods/pod-container-env.tsx index 4623a7fe32..3d3eb33474 100644 --- a/src/renderer/components/+workloads-pods/pod-container-env.tsx +++ b/src/renderer/components/+workloads-pods/pod-container-env.tsx @@ -23,13 +23,13 @@ import "./pod-container-env.scss"; import React, { useEffect, useState } from "react"; import { observer } from "mobx-react"; -import { IPodContainer, Secret } from "../../api/endpoints"; +import type { IPodContainer, Secret } from "../../api/endpoints"; import { DrawerItem } from "../drawer"; import { autorun } from "mobx"; import { secretsStore } from "../+config-secrets/secrets.store"; import { configMapsStore } from "../+config-maps/config-maps.store"; import { Icon } from "../icon"; -import { base64, cssNames } from "../../utils"; +import { base64, cssNames, iter } from "../../utils"; import _ from "lodash"; interface Props { @@ -113,21 +113,23 @@ export const ContainerEnvironment = observer((props: Props) => { }; const renderEnvFrom = () => { - const envVars = envFrom.map(vars => { + return Array.from(iter.filterFlatMap(envFrom, vars => { if (vars.configMapRef?.name) { return renderEnvFromConfigMap(vars.configMapRef.name); - } else if (vars.secretRef?.name ) { + } + + if (vars.secretRef?.name) { return renderEnvFromSecret(vars.secretRef.name); } - }); - return _.flatten(envVars); + return null; + })); }; const renderEnvFromConfigMap = (configMapName: string) => { const configMap = configMapsStore.getByName(configMapName, namespace); - if (!configMap) return; + if (!configMap) return null; return Object.entries(configMap.data).map(([name, value]) => (
@@ -139,7 +141,7 @@ export const ContainerEnvironment = observer((props: Props) => { const renderEnvFromSecret = (secretName: string) => { const secret = secretsStore.getByName(secretName, namespace); - if (!secret) return; + if (!secret) return null; return Object.keys(secret.data).map(key => { const secretKeyRef = { diff --git a/src/renderer/components/+workloads-pods/pod-container-port.tsx b/src/renderer/components/+workloads-pods/pod-container-port.tsx index 93b982a568..38d05adbc9 100644 --- a/src/renderer/components/+workloads-pods/pod-container-port.tsx +++ b/src/renderer/components/+workloads-pods/pod-container-port.tsx @@ -23,7 +23,7 @@ import "./pod-container-port.scss"; import React from "react"; import { observer } from "mobx-react"; -import { Pod } from "../../api/endpoints"; +import type { Pod } from "../../api/endpoints"; import { apiBase } from "../../api"; import { observable } from "mobx"; import { cssNames } from "../../utils"; diff --git a/src/renderer/components/+workloads-pods/pod-details-affinities.tsx b/src/renderer/components/+workloads-pods/pod-details-affinities.tsx index e2dc3246a1..7be1722286 100644 --- a/src/renderer/components/+workloads-pods/pod-details-affinities.tsx +++ b/src/renderer/components/+workloads-pods/pod-details-affinities.tsx @@ -24,7 +24,7 @@ import React from "react"; import jsYaml from "js-yaml"; import { AceEditor } from "../ace-editor"; import { DrawerParamToggler, DrawerItem } from "../drawer"; -import { Pod, Deployment, DaemonSet, StatefulSet, ReplicaSet, Job } from "../../api/endpoints"; +import type { Pod, Deployment, DaemonSet, StatefulSet, ReplicaSet, Job } from "../../api/endpoints"; interface Props { workload: Pod | Deployment | DaemonSet | StatefulSet | ReplicaSet | Job; diff --git a/src/renderer/components/+workloads-pods/pod-details-container.tsx b/src/renderer/components/+workloads-pods/pod-details-container.tsx index fe6d12c45f..1596a6cad7 100644 --- a/src/renderer/components/+workloads-pods/pod-details-container.tsx +++ b/src/renderer/components/+workloads-pods/pod-details-container.tsx @@ -22,7 +22,7 @@ import "./pod-details-container.scss"; import React from "react"; -import { IPodContainer, IPodContainerStatus, Pod } from "../../api/endpoints"; +import type { IPodContainer, IPodContainerStatus, Pod } from "../../api/endpoints"; import { DrawerItem } from "../drawer"; import { cssNames } from "../../utils"; import { StatusBrick } from "../status-brick"; @@ -30,7 +30,7 @@ import { Badge } from "../badge"; import { ContainerEnvironment } from "./pod-container-env"; import { PodContainerPort } from "./pod-container-port"; import { ResourceMetrics } from "../resource-metrics"; -import { IMetrics } from "../../api/endpoints/metrics.api"; +import type { IMetrics } from "../../api/endpoints/metrics.api"; import { ContainerCharts } from "./container-charts"; import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { LocaleDate } from "../locale-date"; @@ -66,6 +66,8 @@ export class PodDetailsContainer extends React.Component { ); } + + return null; } render() { diff --git a/src/renderer/components/+workloads-pods/pod-details-list.tsx b/src/renderer/components/+workloads-pods/pod-details-list.tsx index 696f28aa79..a9e21d1a5c 100644 --- a/src/renderer/components/+workloads-pods/pod-details-list.tsx +++ b/src/renderer/components/+workloads-pods/pod-details-list.tsx @@ -26,10 +26,10 @@ import kebabCase from "lodash/kebabCase"; import { reaction } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import { podsStore } from "./pods.store"; -import { Pod } from "../../api/endpoints"; +import type { Pod } from "../../api/endpoints"; import { autobind, bytesToUnits, cssNames, interval, prevDefault } from "../../utils"; import { LineProgress } from "../line-progress"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { Spinner } from "../spinner"; import { DrawerTitle } from "../drawer"; diff --git a/src/renderer/components/+workloads-pods/pod-details-statuses.tsx b/src/renderer/components/+workloads-pods/pod-details-statuses.tsx index 4ab44dbe3d..90c59ef778 100644 --- a/src/renderer/components/+workloads-pods/pod-details-statuses.tsx +++ b/src/renderer/components/+workloads-pods/pod-details-statuses.tsx @@ -23,7 +23,7 @@ import "./pod-details-statuses.scss"; import React from "react"; import countBy from "lodash/countBy"; import kebabCase from "lodash/kebabCase"; -import { Pod } from "../../api/endpoints"; +import type { Pod } from "../../api/endpoints"; interface Props { pods: Pod[]; diff --git a/src/renderer/components/+workloads-pods/pod-details-tolerations.tsx b/src/renderer/components/+workloads-pods/pod-details-tolerations.tsx index 970a27eaf5..124192d549 100644 --- a/src/renderer/components/+workloads-pods/pod-details-tolerations.tsx +++ b/src/renderer/components/+workloads-pods/pod-details-tolerations.tsx @@ -22,7 +22,7 @@ import "./pod-details-tolerations.scss"; import React from "react"; import { DrawerParamToggler, DrawerItem } from "../drawer"; -import { WorkloadKubeObject } from "../../api/workload-kube-object"; +import type { WorkloadKubeObject } from "../../api/workload-kube-object"; import { PodTolerations } from "./pod-tolerations"; interface Props { diff --git a/src/renderer/components/+workloads-pods/pod-details.tsx b/src/renderer/components/+workloads-pods/pod-details.tsx index 1315c68238..4a67fe76d7 100644 --- a/src/renderer/components/+workloads-pods/pod-details.tsx +++ b/src/renderer/components/+workloads-pods/pod-details.tsx @@ -176,7 +176,7 @@ export class PodDetails extends React.Component { key={name} pod={pod} container={container} - metrics={metrics} + metrics={metrics || null} /> ); }) diff --git a/src/renderer/components/+workloads-pods/pod-tolerations.tsx b/src/renderer/components/+workloads-pods/pod-tolerations.tsx index 39d13aa081..5ca65cc2b3 100644 --- a/src/renderer/components/+workloads-pods/pod-tolerations.tsx +++ b/src/renderer/components/+workloads-pods/pod-tolerations.tsx @@ -23,7 +23,7 @@ import "./pod-tolerations.scss"; import React from "react"; import uniqueId from "lodash/uniqueId"; -import { IToleration } from "../../api/workload-kube-object"; +import type { IToleration } from "../../api/workload-kube-object"; import { Table, TableCell, TableHead, TableRow } from "../table"; interface Props { diff --git a/src/renderer/components/+workloads-pods/pods.store.ts b/src/renderer/components/+workloads-pods/pods.store.ts index 4343c4b50f..7bdba606e4 100644 --- a/src/renderer/components/+workloads-pods/pods.store.ts +++ b/src/renderer/components/+workloads-pods/pods.store.ts @@ -25,7 +25,7 @@ import { KubeObjectStore } from "../../kube-object.store"; import { autobind, cpuUnitsToNumber, unitsToBytes } from "../../utils"; import { IPodMetrics, Pod, PodMetrics, podMetricsApi, podsApi } from "../../api/endpoints"; import { apiManager } from "../../api/api-manager"; -import { WorkloadKubeObject } from "../../api/workload-kube-object"; +import type { WorkloadKubeObject } from "../../api/workload-kube-object"; @autobind() export class PodsStore extends KubeObjectStore { @@ -59,8 +59,6 @@ export class PodsStore extends KubeObjectStore { return this.items.filter(pod => { const owners = pod.getOwnerRefs(); - if (!owners.length) return; - return owners.find(owner => owner.uid === workload.getId()); }); } diff --git a/src/renderer/components/+workloads-pods/pods.tsx b/src/renderer/components/+workloads-pods/pods.tsx index 7c2b4e79f7..be5cbf8852 100644 --- a/src/renderer/components/+workloads-pods/pods.tsx +++ b/src/renderer/components/+workloads-pods/pods.tsx @@ -25,9 +25,9 @@ import React, { Fragment } from "react"; import { observer } from "mobx-react"; import { Link } from "react-router-dom"; import { podsStore } from "./pods.store"; -import { RouteComponentProps } from "react-router"; +import type { RouteComponentProps } from "react-router"; import { volumeClaimStore } from "../+storage-volume-claims/volume-claim.store"; -import { IPodsRouteParams } from "../+workloads"; +import type { IPodsRouteParams } from "../+workloads"; import { eventStore } from "../+events/event.store"; import { getDetailsUrl, KubeObjectListLayout } from "../kube-object"; import { nodesApi, Pod } from "../../api/endpoints"; diff --git a/src/renderer/components/+workloads-replicasets/replicaset-details.tsx b/src/renderer/components/+workloads-replicasets/replicaset-details.tsx index 1c67a86e88..e02d23a3d5 100644 --- a/src/renderer/components/+workloads-replicasets/replicaset-details.tsx +++ b/src/renderer/components/+workloads-replicasets/replicaset-details.tsx @@ -31,8 +31,8 @@ import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities" import { KubeEventDetails } from "../+events/kube-event-details"; import { disposeOnUnmount, observer } from "mobx-react"; import { podsStore } from "../+workloads-pods/pods.store"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { ReplicaSet } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { ReplicaSet } from "../../api/endpoints"; import { ResourceMetrics, ResourceMetricsText } from "../resource-metrics"; import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; diff --git a/src/renderer/components/+workloads-replicasets/replicasets.tsx b/src/renderer/components/+workloads-replicasets/replicasets.tsx index d7e6dd9493..ffc75ead0e 100644 --- a/src/renderer/components/+workloads-replicasets/replicasets.tsx +++ b/src/renderer/components/+workloads-replicasets/replicasets.tsx @@ -23,12 +23,12 @@ import "./replicasets.scss"; import React from "react"; import { observer } from "mobx-react"; -import { ReplicaSet } from "../../api/endpoints"; -import { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; +import type { ReplicaSet } from "../../api/endpoints"; +import type { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; import { replicaSetStore } from "./replicasets.store"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; -import { RouteComponentProps } from "react-router"; -import { IReplicaSetsRouteParams } from "../+workloads/workloads.route"; +import type { RouteComponentProps } from "react-router"; +import type { IReplicaSetsRouteParams } from "../+workloads/workloads.route"; import { KubeObjectListLayout } from "../kube-object/kube-object-list-layout"; import { MenuItem } from "../menu/menu"; import { Icon } from "../icon/icon"; diff --git a/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx b/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx index 75f78af3be..0342d424e9 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx +++ b/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx @@ -32,8 +32,8 @@ import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities" import { KubeEventDetails } from "../+events/kube-event-details"; import { podsStore } from "../+workloads-pods/pods.store"; import { statefulSetStore } from "./statefulset.store"; -import { KubeObjectDetailsProps } from "../kube-object"; -import { StatefulSet } from "../../api/endpoints"; +import type { KubeObjectDetailsProps } from "../kube-object"; +import type { StatefulSet } from "../../api/endpoints"; import { ResourceMetrics, ResourceMetricsText } from "../resource-metrics"; import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; diff --git a/src/renderer/components/+workloads-statefulsets/statefulsets.tsx b/src/renderer/components/+workloads-statefulsets/statefulsets.tsx index ff359b73df..59b208cccf 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulsets.tsx +++ b/src/renderer/components/+workloads-statefulsets/statefulsets.tsx @@ -23,15 +23,15 @@ import "./statefulsets.scss"; import React from "react"; import { observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; -import { StatefulSet } from "../../api/endpoints"; +import type { RouteComponentProps } from "react-router"; +import type { StatefulSet } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { statefulSetStore } from "./statefulset.store"; import { nodesStore } from "../+nodes/nodes.store"; import { eventStore } from "../+events/event.store"; -import { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; +import type { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; import { KubeObjectListLayout } from "../kube-object"; -import { IStatefulSetsRouteParams } from "../+workloads"; +import type { IStatefulSetsRouteParams } from "../+workloads"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { StatefulSetScaleDialog } from "./statefulset-scale-dialog"; import { MenuItem } from "../menu/menu"; diff --git a/src/renderer/components/+workloads/workloads.route.ts b/src/renderer/components/+workloads/workloads.route.ts index 7fec45f9ca..baef1928b7 100644 --- a/src/renderer/components/+workloads/workloads.route.ts +++ b/src/renderer/components/+workloads/workloads.route.ts @@ -21,7 +21,7 @@ import type { RouteProps } from "react-router"; import { buildURL, IURLParams } from "../../../common/utils/buildUrl"; -import { KubeResource } from "../../../common/rbac"; +import type { KubeResource } from "../../../common/rbac"; // Routes export const overviewRoute: RouteProps = { diff --git a/src/renderer/components/+workloads/workloads.stores.ts b/src/renderer/components/+workloads/workloads.stores.ts index 979e99bfc7..a06c17200d 100644 --- a/src/renderer/components/+workloads/workloads.stores.ts +++ b/src/renderer/components/+workloads/workloads.stores.ts @@ -19,14 +19,14 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { KubeObjectStore } from "../../kube-object.store"; +import type { KubeObjectStore } from "../../kube-object.store"; import { podsStore } from "../+workloads-pods/pods.store"; import { deploymentStore } from "../+workloads-deployments/deployments.store"; import { daemonSetStore } from "../+workloads-daemonsets/daemonsets.store"; import { statefulSetStore } from "../+workloads-statefulsets/statefulset.store"; import { jobStore } from "../+workloads-jobs/job.store"; import { cronJobStore } from "../+workloads-cronjobs/cronjob.store"; -import { KubeResource } from "../../../common/rbac"; +import type { KubeResource } from "../../../common/rbac"; import { replicaSetStore } from "../+workloads-replicasets/replicasets.store"; export const workloadStores: Partial> = { diff --git a/src/renderer/components/app.tsx b/src/renderer/components/app.tsx index 7242b23128..f04fb46c5c 100755 --- a/src/renderer/components/app.tsx +++ b/src/renderer/components/app.tsx @@ -151,6 +151,8 @@ export class App extends React.Component { return ; } } + + return null; }); } @@ -161,6 +163,8 @@ export class App extends React.Component { if (!menu) { return ; } + + return null; }); } diff --git a/src/renderer/components/button/button.tsx b/src/renderer/components/button/button.tsx index f35e7b6c50..83d4cc18bf 100644 --- a/src/renderer/components/button/button.tsx +++ b/src/renderer/components/button/button.tsx @@ -42,9 +42,6 @@ export interface ButtonProps extends ButtonHTMLAttributes, TooltipDecorator @withTooltip export class Button extends React.PureComponent { - private link: HTMLAnchorElement; - private button: HTMLButtonElement; - render() { const { waiting, label, primary, accent, plain, hidden, active, big, @@ -60,7 +57,7 @@ export class Button extends React.PureComponent { // render as link if (this.props.href) { return ( - this.link = e}> + {label} {children} @@ -69,7 +66,7 @@ export class Button extends React.PureComponent { // render as button return ( - diff --git a/src/renderer/components/chart/bar-chart.tsx b/src/renderer/components/chart/bar-chart.tsx index 46e25e10f7..b5946b6330 100644 --- a/src/renderer/components/chart/bar-chart.tsx +++ b/src/renderer/components/chart/bar-chart.tsx @@ -24,7 +24,7 @@ import merge from "lodash/merge"; import moment from "moment"; import Color from "color"; import { observer } from "mobx-react"; -import { ChartData, ChartOptions, ChartPoint, ChartTooltipItem, Scriptable } from "chart.js"; +import type { ChartData, ChartOptions, ChartPoint, ChartTooltipItem, Scriptable } from "chart.js"; import { Chart, ChartKind, ChartProps } from "./chart"; import { bytesToUnits, cssNames } from "../../utils"; import { ZebraStripes } from "./zebra-stripes.plugin"; diff --git a/src/renderer/components/chart/zebra-stripes.plugin.ts b/src/renderer/components/chart/zebra-stripes.plugin.ts index f1f78ee5f4..8980546763 100644 --- a/src/renderer/components/chart/zebra-stripes.plugin.ts +++ b/src/renderer/components/chart/zebra-stripes.plugin.ts @@ -22,7 +22,7 @@ // Plugin for drawing stripe bars on top of any timeseries barchart // Based on cover DIV element with repeating-linear-gradient style -import ChartJS, { ChartPoint } from "chart.js"; +import type ChartJS from "chart.js"; import moment, { Moment } from "moment"; import get from "lodash/get"; @@ -39,7 +39,7 @@ export const ZebraStripes = { }, getLastUpdate(chart: ChartJS) { - const data = chart.data.datasets[0].data[0] as ChartPoint; + const data = chart.data.datasets[0].data[0] as ChartJS.ChartPoint; return moment.unix(parseInt(data.x as string)); }, diff --git a/src/renderer/components/cluster-manager/bottom-bar.test.tsx b/src/renderer/components/cluster-manager/bottom-bar.test.tsx index 590e9534f5..eceb02697a 100644 --- a/src/renderer/components/cluster-manager/bottom-bar.test.tsx +++ b/src/renderer/components/cluster-manager/bottom-bar.test.tsx @@ -23,6 +23,12 @@ import React from "react"; import { render } from "@testing-library/react"; import "@testing-library/jest-dom/extend-expect"; +jest.mock("electron", () => ({ + app: { + getPath: () => "/foo", + }, +})); + import { BottomBar } from "./bottom-bar"; jest.mock("../../../extensions/registries"); import { statusBarRegistry } from "../../../extensions/registries"; diff --git a/src/renderer/components/cluster-manager/bottom-bar.tsx b/src/renderer/components/cluster-manager/bottom-bar.tsx index c36a75dd90..32f56d0f78 100644 --- a/src/renderer/components/cluster-manager/bottom-bar.tsx +++ b/src/renderer/components/cluster-manager/bottom-bar.tsx @@ -44,14 +44,14 @@ export class BottomBar extends React.Component { const items = statusBarRegistry.getItems(); if (!Array.isArray(items)) { - return; + return null; } return (
{items.map((registration, index) => { if (!registration?.item && !registration?.components?.Item) { - return; + return null; } return ( diff --git a/src/renderer/components/cluster-manager/cluster-status.tsx b/src/renderer/components/cluster-manager/cluster-status.tsx index 9f8b999e8c..565fee6107 100644 --- a/src/renderer/components/cluster-manager/cluster-status.tsx +++ b/src/renderer/components/cluster-manager/cluster-status.tsx @@ -30,7 +30,7 @@ import { requestMain, subscribeToBroadcast } from "../../../common/ipc"; import { Icon } from "../icon"; import { Button } from "../button"; import { cssNames, IClassName } from "../../utils"; -import { Cluster } from "../../../main/cluster"; +import type { Cluster } from "../../../main/cluster"; import { ClusterId, ClusterStore } from "../../../common/cluster-store"; import { CubeSpinner } from "../spinner"; import { clusterActivateHandler } from "../../../common/cluster-ipc"; diff --git a/src/renderer/components/cluster-manager/cluster-view.tsx b/src/renderer/components/cluster-manager/cluster-view.tsx index 2e3622944b..b1ab7c9366 100644 --- a/src/renderer/components/cluster-manager/cluster-view.tsx +++ b/src/renderer/components/cluster-manager/cluster-view.tsx @@ -23,11 +23,11 @@ import "./cluster-view.scss"; import React from "react"; import { reaction } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; -import { RouteComponentProps } from "react-router"; -import { IClusterViewRouteParams } from "./cluster-view.route"; +import type { RouteComponentProps } from "react-router"; +import type { IClusterViewRouteParams } from "./cluster-view.route"; import { ClusterStatus } from "./cluster-status"; import { hasLoadedView, initView, lensViews, refreshViews } from "./lens-views"; -import { Cluster } from "../../../main/cluster"; +import type { Cluster } from "../../../main/cluster"; import { ClusterStore } from "../../../common/cluster-store"; import { requestMain } from "../../../common/ipc"; import { clusterActivateHandler } from "../../../common/cluster-ipc"; diff --git a/src/renderer/components/cluster-settings/cluster-settings.tsx b/src/renderer/components/cluster-settings/cluster-settings.tsx index d0aaf18e5c..d8fd374136 100644 --- a/src/renderer/components/cluster-settings/cluster-settings.tsx +++ b/src/renderer/components/cluster-settings/cluster-settings.tsx @@ -30,7 +30,7 @@ import { ShowMetricsSetting } from "./components/show-metrics"; import { ClusterPrometheusSetting } from "./components/cluster-prometheus-setting"; import { ClusterKubeconfig } from "./components/cluster-kubeconfig"; import { entitySettingRegistry } from "../../../extensions/registries"; -import { CatalogEntity } from "../../api/catalog-entity"; +import type { CatalogEntity } from "../../api/catalog-entity"; function getClusterForEntity(entity: CatalogEntity) { diff --git a/src/renderer/components/cluster-settings/components/cluster-accessible-namespaces.tsx b/src/renderer/components/cluster-settings/components/cluster-accessible-namespaces.tsx index 5f02a92edd..61b576bb97 100644 --- a/src/renderer/components/cluster-settings/components/cluster-accessible-namespaces.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-accessible-namespaces.tsx @@ -21,7 +21,7 @@ import React from "react"; import { observer } from "mobx-react"; -import { Cluster } from "../../../../main/cluster"; +import type { Cluster } from "../../../../main/cluster"; import { SubTitle } from "../../layout/sub-title"; import { EditableList } from "../../editable-list"; import { observable } from "mobx"; diff --git a/src/renderer/components/cluster-settings/components/cluster-home-dir-setting.tsx b/src/renderer/components/cluster-settings/components/cluster-home-dir-setting.tsx index e2448d6520..0603bea967 100644 --- a/src/renderer/components/cluster-settings/components/cluster-home-dir-setting.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-home-dir-setting.tsx @@ -22,7 +22,7 @@ import React from "react"; import { observable, autorun } from "mobx"; import { observer, disposeOnUnmount } from "mobx-react"; -import { Cluster } from "../../../../main/cluster"; +import type { Cluster } from "../../../../main/cluster"; import { Input } from "../../input"; import { SubTitle } from "../../layout/sub-title"; diff --git a/src/renderer/components/cluster-settings/components/cluster-kubeconfig.tsx b/src/renderer/components/cluster-settings/components/cluster-kubeconfig.tsx index 489398f59c..6c7aec50f3 100644 --- a/src/renderer/components/cluster-settings/components/cluster-kubeconfig.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-kubeconfig.tsx @@ -20,7 +20,7 @@ */ import React from "react"; -import { Cluster } from "../../../../main/cluster"; +import type { Cluster } from "../../../../main/cluster"; import { observer } from "mobx-react"; import { SubTitle } from "../../layout/sub-title"; import { autobind } from "../../../../common/utils"; diff --git a/src/renderer/components/cluster-settings/components/cluster-metrics-setting.tsx b/src/renderer/components/cluster-settings/components/cluster-metrics-setting.tsx index bfa4630032..21bbf7b07a 100644 --- a/src/renderer/components/cluster-settings/components/cluster-metrics-setting.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-metrics-setting.tsx @@ -25,7 +25,7 @@ import { Select, SelectOption } from "../../select/select"; import { Icon } from "../../icon/icon"; import { Button } from "../../button/button"; import { SubTitle } from "../../layout/sub-title"; -import { Cluster } from "../../../../main/cluster"; +import type { Cluster } from "../../../../main/cluster"; import { observable, reaction } from "mobx"; interface Props { diff --git a/src/renderer/components/cluster-settings/components/cluster-name-setting.tsx b/src/renderer/components/cluster-settings/components/cluster-name-setting.tsx index 52a4383d12..cca3d8ac3d 100644 --- a/src/renderer/components/cluster-settings/components/cluster-name-setting.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-name-setting.tsx @@ -20,7 +20,7 @@ */ import React from "react"; -import { Cluster } from "../../../../main/cluster"; +import type { Cluster } from "../../../../main/cluster"; import { Input } from "../../input"; import { observable, autorun } from "mobx"; import { observer, disposeOnUnmount } from "mobx-react"; diff --git a/src/renderer/components/cluster-settings/components/cluster-prometheus-setting.tsx b/src/renderer/components/cluster-settings/components/cluster-prometheus-setting.tsx index 36395f1bdb..00d2056b3e 100644 --- a/src/renderer/components/cluster-settings/components/cluster-prometheus-setting.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-prometheus-setting.tsx @@ -22,7 +22,7 @@ import React from "react"; import { observer, disposeOnUnmount } from "mobx-react"; import { prometheusProviders } from "../../../../common/prometheus-providers"; -import { Cluster } from "../../../../main/cluster"; +import type { Cluster } from "../../../../main/cluster"; import { SubTitle } from "../../layout/sub-title"; import { Select, SelectOption } from "../../select"; import { Input } from "../../input"; diff --git a/src/renderer/components/cluster-settings/components/cluster-proxy-setting.tsx b/src/renderer/components/cluster-settings/components/cluster-proxy-setting.tsx index 52a54be547..d4c307226c 100644 --- a/src/renderer/components/cluster-settings/components/cluster-proxy-setting.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-proxy-setting.tsx @@ -22,7 +22,7 @@ import React from "react"; import { observable, autorun } from "mobx"; import { observer, disposeOnUnmount } from "mobx-react"; -import { Cluster } from "../../../../main/cluster"; +import type { Cluster } from "../../../../main/cluster"; import { Input, InputValidators } from "../../input"; import { SubTitle } from "../../layout/sub-title"; diff --git a/src/renderer/components/cluster-settings/components/show-metrics.tsx b/src/renderer/components/cluster-settings/components/show-metrics.tsx index e744875810..8d4ba2a7c7 100644 --- a/src/renderer/components/cluster-settings/components/show-metrics.tsx +++ b/src/renderer/components/cluster-settings/components/show-metrics.tsx @@ -21,7 +21,7 @@ import React from "react"; import { disposeOnUnmount, observer } from "mobx-react"; -import { Cluster } from "../../../../main/cluster"; +import type { Cluster } from "../../../../main/cluster"; import { observable, reaction } from "mobx"; import { Badge } from "../../badge/badge"; import { Icon } from "../../icon/icon"; diff --git a/src/renderer/components/dock/__test__/dock-tabs.test.tsx b/src/renderer/components/dock/__test__/dock-tabs.test.tsx index 37cb7fdc8a..0c5ae7defd 100644 --- a/src/renderer/components/dock/__test__/dock-tabs.test.tsx +++ b/src/renderer/components/dock/__test__/dock-tabs.test.tsx @@ -26,6 +26,12 @@ import "@testing-library/jest-dom/extend-expect"; import { DockTabs } from "../dock-tabs"; import { dockStore, IDockTab, TabKind } from "../dock.store"; +jest.mock("electron", () => ({ + app: { + getPath: () => "/foo", + }, +})); + const onChangeTab = jest.fn(); const getComponent = () => ( diff --git a/src/renderer/components/dock/__test__/log-resource-selector.test.tsx b/src/renderer/components/dock/__test__/log-resource-selector.test.tsx index 62c67247e0..62566b868a 100644 --- a/src/renderer/components/dock/__test__/log-resource-selector.test.tsx +++ b/src/renderer/components/dock/__test__/log-resource-selector.test.tsx @@ -26,11 +26,17 @@ import selectEvent from "react-select-event"; import { Pod } from "../../../api/endpoints"; import { LogResourceSelector } from "../log-resource-selector"; -import { LogTabData } from "../log-tab.store"; +import type { LogTabData } from "../log-tab.store"; import { dockerPod, deploymentPod1 } from "./pod.mock"; import { ThemeStore } from "../../../theme.store"; import { UserStore } from "../../../../common/user-store"; +jest.mock("electron", () => ({ + app: { + getPath: () => "/foo", + }, +})); + const getComponent = (tabData: LogTabData) => { return ( ({ + app: { + getPath: () => "/foo", + }, +})); podsStore.items.push(new Pod(dockerPod)); podsStore.items.push(new Pod(deploymentPod1)); diff --git a/src/renderer/components/dock/create-resource.store.ts b/src/renderer/components/dock/create-resource.store.ts index 573ff1cffd..7ff01286b3 100644 --- a/src/renderer/components/dock/create-resource.store.ts +++ b/src/renderer/components/dock/create-resource.store.ts @@ -89,7 +89,3 @@ export function createResourceTab(tabParams: Partial = {}) { ...tabParams }); } - -export function isCreateResourceTab(tab: IDockTab) { - return tab && tab.kind === TabKind.CREATE_RESOURCE; -} diff --git a/src/renderer/components/dock/create-resource.tsx b/src/renderer/components/dock/create-resource.tsx index 36058cabbd..44becbb52b 100644 --- a/src/renderer/components/dock/create-resource.tsx +++ b/src/renderer/components/dock/create-resource.tsx @@ -30,11 +30,11 @@ import { observable } from "mobx"; import { observer } from "mobx-react"; import { cssNames } from "../../utils"; import { createResourceStore } from "./create-resource.store"; -import { IDockTab } from "./dock.store"; +import type { IDockTab } from "./dock.store"; import { EditorPanel } from "./editor-panel"; import { InfoPanel } from "./info-panel"; import { resourceApplierApi } from "../../api/endpoints/resource-applier.api"; -import { JsonApiErrorParsed } from "../../api/json-api"; +import type { JsonApiErrorParsed } from "../../api/json-api"; import { Notifications } from "../notifications"; interface Props { @@ -87,10 +87,13 @@ export class CreateResource extends React.Component { }; create = async () => { - if (this.error) return; - if (!this.data.trim()) return; // do not save when field is empty - const resources = jsYaml.safeLoadAll(this.data) - .filter(v => !!v); // skip empty documents if "---" pasted at the beginning or end + if (this.error || !this.data.trim()) { + // do not save when field is empty or there is an error + return null; + } + + // skip empty documents if "---" pasted at the beginning or end + const resources = jsYaml.safeLoadAll(this.data).filter(Boolean); const createdResources: string[] = []; const errors: string[] = []; diff --git a/src/renderer/components/dock/dock-tabs.tsx b/src/renderer/components/dock/dock-tabs.tsx index 6bb0606574..6064259cbc 100644 --- a/src/renderer/components/dock/dock-tabs.tsx +++ b/src/renderer/components/dock/dock-tabs.tsx @@ -23,15 +23,10 @@ import React, { Fragment } from "react"; import { Icon } from "../icon"; import { Tabs } from "../tabs/tabs"; -import { isCreateResourceTab } from "./create-resource.store"; import { DockTab } from "./dock-tab"; -import { IDockTab } from "./dock.store"; -import { isEditResourceTab } from "./edit-resource.store"; -import { isInstallChartTab } from "./install-chart.store"; -import { isLogsTab } from "./log-tab.store"; +import type { IDockTab } from "./dock.store"; +import { TabKind } from "./dock.store"; import { TerminalTab } from "./terminal-tab"; -import { isTerminalTab } from "./terminal.store"; -import { isUpgradeChartTab } from "./upgrade-chart.store"; interface Props { tabs: IDockTab[] @@ -41,21 +36,22 @@ interface Props { } export const DockTabs = ({ tabs, autoFocus, selectedTab, onChangeTab }: Props) => { - const renderTab = (tab: IDockTab) => { - if (isTerminalTab(tab)) { - return ; + const renderTab = (tab?: IDockTab) => { + if (!tab) { + return null; } - if (isCreateResourceTab(tab) || isEditResourceTab(tab)) { - return ; - } - - if (isInstallChartTab(tab) || isUpgradeChartTab(tab)) { - return } />; - } - - if (isLogsTab(tab)) { - return ; + switch (tab.kind) { + case TabKind.CREATE_RESOURCE: + case TabKind.EDIT_RESOURCE: + return ; + case TabKind.INSTALL_CHART: + case TabKind.UPGRADE_CHART: + return } />; + case TabKind.POD_LOGS: + return ; + case TabKind.TERMINAL: + return ; } }; diff --git a/src/renderer/components/dock/dock.store.ts b/src/renderer/components/dock/dock.store.ts index 99617563f0..2edbbce75c 100644 --- a/src/renderer/components/dock/dock.store.ts +++ b/src/renderer/components/dock/dock.store.ts @@ -215,7 +215,7 @@ export class DockStore implements DockStorageState { if (this.tabs.length) { const newTab = this.tabs.slice(-1)[0]; // last - if (newTab.kind === TabKind.TERMINAL) { + if (newTab?.kind === TabKind.TERMINAL) { // close the dock when selected sibling inactive terminal tab const { terminalStore } = await import("./terminal.store"); diff --git a/src/renderer/components/dock/dock.tsx b/src/renderer/components/dock/dock.tsx index 6f7dbe6956..21e167ac8c 100644 --- a/src/renderer/components/dock/dock.tsx +++ b/src/renderer/components/dock/dock.tsx @@ -30,19 +30,15 @@ import { MenuItem } from "../menu"; import { MenuActions } from "../menu/menu-actions"; import { ResizeDirection, ResizingAnchor } from "../resizing-anchor"; import { CreateResource } from "./create-resource"; -import { createResourceTab, isCreateResourceTab } from "./create-resource.store"; +import { createResourceTab } from "./create-resource.store"; import { DockTabs } from "./dock-tabs"; -import { dockStore, IDockTab } from "./dock.store"; +import { dockStore, IDockTab, TabKind } from "./dock.store"; import { EditResource } from "./edit-resource"; -import { isEditResourceTab } from "./edit-resource.store"; import { InstallChart } from "./install-chart"; -import { isInstallChartTab } from "./install-chart.store"; import { Logs } from "./logs"; -import { isLogsTab } from "./log-tab.store"; import { TerminalWindow } from "./terminal-window"; -import { createTerminalTab, isTerminalTab } from "./terminal.store"; +import { createTerminalTab } from "./terminal.store"; import { UpgradeChart } from "./upgrade-chart"; -import { isUpgradeChartTab } from "./upgrade-chart.store"; import { commandRegistry } from "../../../extensions/registries/command-registry"; interface Props { @@ -74,19 +70,31 @@ export class Dock extends React.Component { selectTab(tab.id); }; - renderTabContent() { - const { isOpen, height, selectedTab: tab } = dockStore; + renderTab(tab: IDockTab) { + switch (tab.kind) { + case TabKind.CREATE_RESOURCE: + return ; + case TabKind.EDIT_RESOURCE: + return ; + case TabKind.INSTALL_CHART: + return ; + case TabKind.UPGRADE_CHART: + return ; + case TabKind.POD_LOGS: + return ; + case TabKind.TERMINAL: + return ; + } + } - if (!isOpen || !tab) return; + renderTabContent() { + const { isOpen, height, selectedTab } = dockStore; + + if (!isOpen || !selectedTab) return null; return (
- {isCreateResourceTab(tab) && } - {isEditResourceTab(tab) && } - {isInstallChartTab(tab) && } - {isUpgradeChartTab(tab) && } - {isTerminalTab(tab) && } - {isLogsTab(tab) && } + {this.renderTab(selectedTab)}
); } diff --git a/src/renderer/components/dock/edit-resource.store.ts b/src/renderer/components/dock/edit-resource.store.ts index 48d64ffbbf..b73ad9785f 100644 --- a/src/renderer/components/dock/edit-resource.store.ts +++ b/src/renderer/components/dock/edit-resource.store.ts @@ -23,9 +23,9 @@ import { autobind, noop } from "../../utils"; import { DockTabStore } from "./dock-tab.store"; import { autorun, IReactionDisposer } from "mobx"; import { dockStore, IDockTab, TabId, TabKind } from "./dock.store"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; import { apiManager } from "../../api/api-manager"; -import { KubeObjectStore } from "../../kube-object.store"; +import type { KubeObjectStore } from "../../kube-object.store"; export interface EditingResource { resource: string; // resource path, e.g. /api/v1/namespaces/default @@ -138,7 +138,3 @@ export function editResourceTab(object: KubeObject, tabParams: Partial return tab; } - -export function isEditResourceTab(tab: IDockTab) { - return tab && tab.kind === TabKind.EDIT_RESOURCE; -} diff --git a/src/renderer/components/dock/edit-resource.tsx b/src/renderer/components/dock/edit-resource.tsx index eafb6a7396..010e130513 100644 --- a/src/renderer/components/dock/edit-resource.tsx +++ b/src/renderer/components/dock/edit-resource.tsx @@ -25,14 +25,14 @@ import React from "react"; import { action, computed, observable } from "mobx"; import { observer } from "mobx-react"; import jsYaml from "js-yaml"; -import { IDockTab } from "./dock.store"; +import type { IDockTab } from "./dock.store"; import { cssNames } from "../../utils"; import { editResourceStore } from "./edit-resource.store"; import { InfoPanel } from "./info-panel"; import { Badge } from "../badge"; import { EditorPanel } from "./editor-panel"; import { Spinner } from "../spinner"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; interface Props { className?: string; @@ -88,7 +88,7 @@ export class EditResource extends React.Component { save = async () => { if (this.error) { - return; + return null; } const store = editResourceStore.getStore(this.tabId); const updatedResource = await store.update(this.resource, jsYaml.safeLoad(this.draft)); diff --git a/src/renderer/components/dock/editor-panel.tsx b/src/renderer/components/dock/editor-panel.tsx index cca59c9b28..64e37e1f0e 100644 --- a/src/renderer/components/dock/editor-panel.tsx +++ b/src/renderer/components/dock/editor-panel.tsx @@ -27,7 +27,7 @@ import { cssNames } from "../../utils"; import { AceEditor } from "../ace-editor"; import { dockStore, TabId } from "./dock.store"; import { DockTabStore } from "./dock-tab.store"; -import { Ace } from "ace-builds"; +import type { Ace } from "ace-builds"; interface Props { className?: string; diff --git a/src/renderer/components/dock/info-panel.tsx b/src/renderer/components/dock/info-panel.tsx index ce2286bf18..da893904eb 100644 --- a/src/renderer/components/dock/info-panel.tsx +++ b/src/renderer/components/dock/info-panel.tsx @@ -104,7 +104,7 @@ export class InfoPanel extends Component { renderErrorIcon() { if (!this.props.showInlineInfo || !this.errorInfo) { - return; + return null; } return ( diff --git a/src/renderer/components/dock/install-chart.store.ts b/src/renderer/components/dock/install-chart.store.ts index 46f8cde904..3e5f7a9d8f 100644 --- a/src/renderer/components/dock/install-chart.store.ts +++ b/src/renderer/components/dock/install-chart.store.ts @@ -23,7 +23,7 @@ import { action, autorun } from "mobx"; import { dockStore, IDockTab, TabId, TabKind } from "./dock.store"; import { DockTabStore } from "./dock-tab.store"; import { getChartDetails, getChartValues, HelmChart } from "../../api/endpoints/helm-charts.api"; -import { IReleaseUpdateDetails } from "../../api/endpoints/helm-releases.api"; +import type { IReleaseUpdateDetails } from "../../api/endpoints/helm-releases.api"; import { Notifications } from "../notifications"; export interface IChartInstallData { @@ -48,15 +48,15 @@ export class InstallChartStore extends DockTabStore { autorun(() => { const { selectedTab, isOpen } = dockStore; - if (isInstallChartTab(selectedTab) && isOpen) { - this.loadData() + if (selectedTab?.kind === TabKind.INSTALL_CHART && isOpen) { + this.loadData(selectedTab.id) .catch(err => Notifications.error(String(err))); } }, { delay: 250 }); } @action - async loadData(tabId = dockStore.selectedTabId) { + async loadData(tabId: string) { const promises = []; if (!this.getData(tabId).values) { @@ -116,7 +116,3 @@ export function createInstallChartTab(chart: HelmChart, tabParams: Partial { } export const logTabStore = new LogTabStore(); - -export function isLogsTab(tab: IDockTab) { - return tab && tab.kind === TabKind.POD_LOGS; -} diff --git a/src/renderer/components/dock/log.store.ts b/src/renderer/components/dock/log.store.ts index 22fae5eac5..111fe9b018 100644 --- a/src/renderer/components/dock/log.store.ts +++ b/src/renderer/components/dock/log.store.ts @@ -23,8 +23,8 @@ import { autorun, computed, observable } from "mobx"; import { IPodLogsQuery, Pod, podsApi } from "../../api/endpoints"; import { autobind, interval } from "../../utils"; -import { dockStore, TabId } from "./dock.store"; -import { isLogsTab, logTabStore } from "./log-tab.store"; +import { dockStore, TabId, TabKind } from "./dock.store"; +import { logTabStore } from "./log-tab.store"; type PodLogLine = string; @@ -45,7 +45,7 @@ export class LogStore { autorun(() => { const { selectedTab, isOpen } = dockStore; - if (isLogsTab(selectedTab) && isOpen) { + if (selectedTab?.kind === TabKind.POD_LOGS && isOpen) { this.refresher.start(); } else { this.refresher.stop(); diff --git a/src/renderer/components/dock/logs.tsx b/src/renderer/components/dock/logs.tsx index 2f5c6c9ac8..0d7696f513 100644 --- a/src/renderer/components/dock/logs.tsx +++ b/src/renderer/components/dock/logs.tsx @@ -25,7 +25,7 @@ import { disposeOnUnmount, observer } from "mobx-react"; import { searchStore } from "../../../common/search-store"; import { autobind } from "../../utils"; -import { IDockTab } from "./dock.store"; +import type { IDockTab } from "./dock.store"; import { InfoPanel } from "./info-panel"; import { LogResourceSelector } from "./log-resource-selector"; import { LogList } from "./log-list"; diff --git a/src/renderer/components/dock/terminal-window.tsx b/src/renderer/components/dock/terminal-window.tsx index 7c0be046dd..d5b4d4a53b 100644 --- a/src/renderer/components/dock/terminal-window.tsx +++ b/src/renderer/components/dock/terminal-window.tsx @@ -25,8 +25,8 @@ import React from "react"; import { reaction } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import { cssNames } from "../../utils"; -import { IDockTab } from "./dock.store"; -import { Terminal } from "./terminal"; +import type { IDockTab } from "./dock.store"; +import type { Terminal } from "./terminal"; import { terminalStore } from "./terminal.store"; import { ThemeStore } from "../../theme.store"; diff --git a/src/renderer/components/dock/terminal.store.ts b/src/renderer/components/dock/terminal.store.ts index 4ede78c681..ba57c9bef7 100644 --- a/src/renderer/components/dock/terminal.store.ts +++ b/src/renderer/components/dock/terminal.store.ts @@ -30,10 +30,6 @@ export interface ITerminalTab extends IDockTab { node?: string; // activate node shell mode } -export function isTerminalTab(tab: IDockTab) { - return tab && tab.kind === TabKind.TERMINAL; -} - export function createTerminalTab(tabParams: Partial = {}) { return dockStore.createTab({ kind: TabKind.TERMINAL, @@ -52,9 +48,7 @@ export class TerminalStore { autorun(() => { const { selectedTab, isOpen } = dockStore; - if (!isTerminalTab(selectedTab)) return; - - if (isOpen) { + if (selectedTab?.kind === TabKind.TERMINAL && isOpen) { this.connect(selectedTab.id); } }); @@ -97,21 +91,15 @@ export class TerminalStore { } reconnect(tabId: TabId) { - const terminalApi = this.connections.get(tabId); - - if (terminalApi) terminalApi.connect(); + this.connections.get(tabId)?.connect(); } isConnected(tabId: TabId) { - return !!this.connections.get(tabId); + return Boolean(this.connections.get(tabId)); } isDisconnected(tabId: TabId) { - const terminalApi = this.connections.get(tabId); - - if (terminalApi) { - return terminalApi.readyState === WebSocketApiState.CLOSED; - } + return this.connections.get(tabId)?.readyState === WebSocketApiState.CLOSED; } sendCommand(command: string, options: { enter?: boolean; newTab?: boolean; tabId?: TabId } = {}) { diff --git a/src/renderer/components/dock/terminal.ts b/src/renderer/components/dock/terminal.ts index d3fd029259..7ce5412dab 100644 --- a/src/renderer/components/dock/terminal.ts +++ b/src/renderer/components/dock/terminal.ts @@ -24,7 +24,7 @@ import { reaction, toJS } from "mobx"; import { Terminal as XTerm } from "xterm"; import { FitAddon } from "xterm-addon-fit"; import { dockStore, TabId } from "./dock.store"; -import { TerminalApi } from "../../api/terminal-api"; +import type { TerminalApi } from "../../api/terminal-api"; import { ThemeStore } from "../../theme.store"; import { autobind } from "../../utils"; import { isMac } from "../../../common/vars"; diff --git a/src/renderer/components/dock/upgrade-chart.store.ts b/src/renderer/components/dock/upgrade-chart.store.ts index 97d8bd722e..a9b09e50d0 100644 --- a/src/renderer/components/dock/upgrade-chart.store.ts +++ b/src/renderer/components/dock/upgrade-chart.store.ts @@ -19,11 +19,12 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { action, autorun, IReactionDisposer, reaction } from "mobx"; +import { action, autorun, computed, IReactionDisposer, reaction } from "mobx"; import { dockStore, IDockTab, TabId, TabKind } from "./dock.store"; import { DockTabStore } from "./dock-tab.store"; import { getReleaseValues, HelmRelease } from "../../api/endpoints/helm-releases.api"; import { releaseStore } from "../+apps-releases/release.store"; +import { iter } from "../../utils"; export interface IChartUpgradeData { releaseName: string; @@ -35,6 +36,10 @@ export class UpgradeChartStore extends DockTabStore { values = new DockTabStore(); + @computed private get releaseNameReverseLookup(): Map { + return new Map(iter.map(this.data, ([id, { releaseName }]) => [releaseName, id])); + } + constructor() { super({ storageKey: "chart_releases" @@ -43,9 +48,7 @@ export class UpgradeChartStore extends DockTabStore { autorun(() => { const { selectedTab, isOpen } = dockStore; - if (!isUpgradeChartTab(selectedTab)) return; - - if (isOpen) { + if (selectedTab?.kind === TabKind.UPGRADE_CHART && isOpen) { this.loadData(selectedTab.id); } }, { delay: 250 }); @@ -64,7 +67,7 @@ export class UpgradeChartStore extends DockTabStore { const dispose = reaction(() => { const release = releaseStore.getByName(releaseName); - if (release) return release.getRevision(); // watch changes only by revision + return release?.getRevision(); // watch changes only by revision }, release => { const releaseTab = this.getTabByRelease(releaseName); @@ -116,13 +119,7 @@ export class UpgradeChartStore extends DockTabStore { } getTabByRelease(releaseName: string): IDockTab { - const item = [...this.data].find(item => item[1].releaseName === releaseName); - - if (item) { - const [tabId] = item; - - return dockStore.getTabById(tabId); - } + return dockStore.getTabById(this.releaseNameReverseLookup.get(releaseName)); } } @@ -151,7 +148,3 @@ export function createUpgradeChartTab(release: HelmRelease, tabParams: Partial { get release(): HelmRelease { const tabData = upgradeChartStore.getData(this.tabId); - if (!tabData) return; + if (!tabData) return null; return releaseStore.getByName(tabData.releaseName); } @@ -87,7 +87,7 @@ export class UpgradeChart extends React.Component { }; upgrade = async () => { - if (this.error) return; + if (this.error) return null; const { version, repo } = this.version; const releaseName = this.release.getName(); const releaseNs = this.release.getNs(); diff --git a/src/renderer/components/hotbar/hotbar-entity-icon.tsx b/src/renderer/components/hotbar/hotbar-entity-icon.tsx index 41b0a69da0..93cfb28da7 100644 --- a/src/renderer/components/hotbar/hotbar-entity-icon.tsx +++ b/src/renderer/components/hotbar/hotbar-entity-icon.tsx @@ -23,7 +23,7 @@ import React, { DOMAttributes } from "react"; import { observable } from "mobx"; import { observer } from "mobx-react"; -import { CatalogEntity, CatalogEntityContextMenuContext } from "../../../common/catalog"; +import type { CatalogEntity, CatalogEntityContextMenuContext } from "../../../common/catalog"; import { catalogCategoryRegistry } from "../../api/catalog-category-registry"; import { catalogEntityRegistry } from "../../api/catalog-entity-registry"; import { navigate } from "../../navigation"; diff --git a/src/renderer/components/hotbar/hotbar-icon.tsx b/src/renderer/components/hotbar/hotbar-icon.tsx index ddfa512dcd..bdd00859c2 100644 --- a/src/renderer/components/hotbar/hotbar-icon.tsx +++ b/src/renderer/components/hotbar/hotbar-icon.tsx @@ -26,7 +26,7 @@ import { Avatar } from "@material-ui/core"; import randomColor from "randomcolor"; import GraphemeSplitter from "grapheme-splitter"; -import { CatalogEntityContextMenu } from "../../../common/catalog"; +import type { CatalogEntityContextMenu } from "../../../common/catalog"; import { cssNames, IClassName, iter } from "../../utils"; import { ConfirmDialog } from "../confirm-dialog"; import { Menu, MenuItem } from "../menu"; diff --git a/src/renderer/components/icon/icon.tsx b/src/renderer/components/icon/icon.tsx index 6de4b6c39d..2e13273ab4 100644 --- a/src/renderer/components/icon/icon.tsx +++ b/src/renderer/components/icon/icon.tsx @@ -24,7 +24,7 @@ import "./icon.scss"; import React, { ReactNode } from "react"; import { findDOMNode } from "react-dom"; import { NavLink } from "react-router-dom"; -import { LocationDescriptor } from "history"; +import type { LocationDescriptor } from "history"; import { autobind, cssNames } from "../../utils"; import { TooltipDecoratorProps, withTooltip } from "../tooltip"; import isNumber from "lodash/isNumber"; diff --git a/src/renderer/components/input/drop-file-input.tsx b/src/renderer/components/input/drop-file-input.tsx index 276fb8d839..1062e1ce06 100644 --- a/src/renderer/components/input/drop-file-input.tsx +++ b/src/renderer/components/input/drop-file-input.tsx @@ -82,9 +82,8 @@ export class DropFileInput extends React.Component< if (disabled) { return contentElem; } - const isValidContentElem = React.isValidElement(contentElem); - if (isValidContentElem) { + if (React.isValidElement(contentElem)) { const contentElemProps: React.HTMLProps = { className: cssNames("DropFileInput", contentElem.props.className, className, { droppable: this.dropAreaActive, @@ -97,6 +96,8 @@ export class DropFileInput extends React.Component< return React.cloneElement(contentElem, contentElemProps); } + + return null; } catch (err) { logger.error(`Error: must contain only single child element`); diff --git a/src/renderer/components/input/input.tsx b/src/renderer/components/input/input.tsx index d4d9b9f577..324afdefb1 100644 --- a/src/renderer/components/input/input.tsx +++ b/src/renderer/components/input/input.tsx @@ -26,7 +26,7 @@ import { autobind, cssNames, debouncePromise, getRandId } from "../../utils"; import { Icon } from "../icon"; import { Tooltip, TooltipProps } from "../tooltip"; import * as Validators from "./input_validators"; -import { InputValidator } from "./input_validators"; +import type { InputValidator } from "./input_validators"; import isString from "lodash/isString"; import isFunction from "lodash/isFunction"; import isBoolean from "lodash/isBoolean"; @@ -34,7 +34,8 @@ import uniqueId from "lodash/uniqueId"; const { conditionalValidators, ...InputValidators } = Validators; -export { InputValidators, InputValidator }; +export { InputValidators }; +export type { InputValidator }; type InputElement = HTMLInputElement | HTMLTextAreaElement; type InputElementProps = InputHTMLAttributes & TextareaHTMLAttributes & DOMAttributes; diff --git a/src/renderer/components/input/input_validators.ts b/src/renderer/components/input/input_validators.ts index 46042300bc..7022527f74 100644 --- a/src/renderer/components/input/input_validators.ts +++ b/src/renderer/components/input/input_validators.ts @@ -20,7 +20,7 @@ */ import type { InputProps } from "./input"; -import { ReactNode } from "react"; +import type { ReactNode } from "react"; import fse from "fs-extra"; export interface InputValidator { diff --git a/src/renderer/components/input/search-input-url.tsx b/src/renderer/components/input/search-input-url.tsx index 44474ba5a7..cf9bb267b2 100644 --- a/src/renderer/components/input/search-input-url.tsx +++ b/src/renderer/components/input/search-input-url.tsx @@ -23,7 +23,7 @@ import React from "react"; import debounce from "lodash/debounce"; import { autorun, observable } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; -import { InputProps } from "./input"; +import type { InputProps } from "./input"; import { SearchInput } from "./search-input"; import { createPageParam } from "../../navigation"; diff --git a/src/renderer/components/item-object-list/item-list-layout.tsx b/src/renderer/components/item-object-list/item-list-layout.tsx index de1d7f9fac..527e43652c 100644 --- a/src/renderer/components/item-object-list/item-list-layout.tsx +++ b/src/renderer/components/item-object-list/item-list-layout.tsx @@ -31,7 +31,7 @@ import { autobind, createStorage, cssNames, IClassName, isReactNode, noop, Obser import { AddRemoveButtons, AddRemoveButtonsProps } from "../add-remove-buttons"; import { NoItems } from "../no-items"; import { Spinner } from "../spinner"; -import { ItemObject, ItemStore } from "../../item.store"; +import type { ItemObject, ItemStore } from "../../item.store"; import { SearchInputUrl } from "../input"; import { Filter, FilterType, pageFilters } from "./page-filters.store"; import { PageFiltersList } from "./page-filters-list"; @@ -247,7 +247,7 @@ export class ItemListLayout extends React.Component { const { isSelected } = store; const item = this.items.find(item => item.getId() == uid); - if (!item) return; + if (!item) return null; const itemId = item.getId(); return ( @@ -279,6 +279,8 @@ export class ItemListLayout extends React.Component { if (!headCell || this.showColumn(headCell)) { return ; } + + return null; }) } {renderItemMenu && ( @@ -320,7 +322,7 @@ export class ItemListLayout extends React.Component { const { isReady, filters } = this; if (!isReady || !filters.length || hideFilters || !this.showFilters) { - return; + return null; } return ; @@ -392,7 +394,7 @@ export class ItemListLayout extends React.Component { renderHeader() { const { showHeader, customizeHeader, renderHeaderTitle, headerClassName, isClusterScoped } = this.props; - if (!showHeader) return; + if (!showHeader) return null; const title = typeof renderHeaderTitle === "function" ? renderHeaderTitle(this) : renderHeaderTitle; const placeholders: IHeaderPlaceholders = { title:
{title}
, @@ -431,7 +433,7 @@ export class ItemListLayout extends React.Component { const { customizeTableRowProps, renderTableHeader, isSelectable, isConfigurable, store } = this.props; if (!renderTableHeader) { - return; + return null; } const enabledItems = this.items.filter(item => !customizeTableRowProps(item).disabled); @@ -520,9 +522,7 @@ export class ItemListLayout extends React.Component { } renderFooter() { - if (this.props.renderFooter) { - return this.props.renderFooter(this); - } + return this.props.renderFooter?.(this); } render() { diff --git a/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx b/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx index db08bffff8..bf700b871c 100644 --- a/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx +++ b/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx @@ -27,7 +27,7 @@ import { cssNames, formatDuration } from "../../utils"; import { KubeObject, KubeObjectStatus, KubeObjectStatusLevel } from "../../..//extensions/renderer-api/k8s-api"; import { kubeObjectStatusRegistry } from "../../../extensions/registries"; -function statusClassName(level: number): string { +function statusClassName(level: KubeObjectStatusLevel): string { switch (level) { case KubeObjectStatusLevel.INFO: return "info"; diff --git a/src/renderer/components/kube-object/kube-object-details.tsx b/src/renderer/components/kube-object/kube-object-details.tsx index 23e4e0c863..b4cc81824c 100644 --- a/src/renderer/components/kube-object/kube-object-details.tsx +++ b/src/renderer/components/kube-object/kube-object-details.tsx @@ -26,7 +26,7 @@ import { disposeOnUnmount, observer } from "mobx-react"; import { computed, observable, reaction } from "mobx"; import { createPageParam, navigation } from "../../navigation"; import { Drawer } from "../drawer"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; import { Spinner } from "../spinner"; import { apiManager } from "../../api/api-manager"; import { crdStore } from "../+custom-resources/crd.store"; diff --git a/src/renderer/components/kube-object/kube-object-list-layout.tsx b/src/renderer/components/kube-object/kube-object-list-layout.tsx index bb455dc4cb..44cb536429 100644 --- a/src/renderer/components/kube-object/kube-object-list-layout.tsx +++ b/src/renderer/components/kube-object/kube-object-list-layout.tsx @@ -23,9 +23,9 @@ import React from "react"; import { computed } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import { cssNames } from "../../utils"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; import { ItemListLayout, ItemListLayoutProps } from "../item-object-list/item-list-layout"; -import { KubeObjectStore } from "../../kube-object.store"; +import type { KubeObjectStore } from "../../kube-object.store"; import { KubeObjectMenu } from "./kube-object-menu"; import { kubeSelectedUrlParam, showDetails } from "./kube-object-details"; import { kubeWatchApi } from "../../api/kube-watch-api"; diff --git a/src/renderer/components/kube-object/kube-object-menu.tsx b/src/renderer/components/kube-object/kube-object-menu.tsx index 88ed9ba53c..b2c26ef9ff 100644 --- a/src/renderer/components/kube-object/kube-object-menu.tsx +++ b/src/renderer/components/kube-object/kube-object-menu.tsx @@ -21,7 +21,7 @@ import React from "react"; import { autobind, cssNames } from "../../utils"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; import { editResourceTab } from "../dock/edit-resource.store"; import { MenuActions, MenuActionsProps } from "../menu/menu-actions"; import { hideDetails } from "./kube-object-details"; @@ -38,7 +38,7 @@ export class KubeObjectMenu extends React.Component { const { isExpandable, expanded, isActive } = this; if (!isExpandable || !expanded) { - return; + return null; } return ( diff --git a/src/renderer/components/layout/sidebar.tsx b/src/renderer/components/layout/sidebar.tsx index fdb950a02c..5149ebb4d6 100644 --- a/src/renderer/components/layout/sidebar.tsx +++ b/src/renderer/components/layout/sidebar.tsx @@ -155,7 +155,7 @@ export class Sidebar extends React.Component { pageUrl = tabRoutes[0].url; isActive = isActiveRoute(tabRoutes.map((tab) => tab.routePath)); } else { - return; + return null; } return ( diff --git a/src/renderer/components/menu/menu-actions.tsx b/src/renderer/components/menu/menu-actions.tsx index b1eaa6f9e0..c6c36482ab 100644 --- a/src/renderer/components/menu/menu-actions.tsx +++ b/src/renderer/components/menu/menu-actions.tsx @@ -75,7 +75,7 @@ export class MenuActions extends React.Component { } renderTriggerIcon() { - if (this.props.toolbar) return; + if (this.props.toolbar) return null; const { triggerIcon = "more_vert" } = this.props; let className: string; diff --git a/src/renderer/components/notifications/notifications.store.tsx b/src/renderer/components/notifications/notifications.store.tsx index 43b11cefa0..5e22e1b01e 100644 --- a/src/renderer/components/notifications/notifications.store.tsx +++ b/src/renderer/components/notifications/notifications.store.tsx @@ -19,11 +19,11 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import React from "react"; +import type React from "react"; import { action, observable } from "mobx"; import { autobind } from "../../utils"; import uniqueId from "lodash/uniqueId"; -import { JsonApiErrorParsed } from "../../api/json-api"; +import type { JsonApiErrorParsed } from "../../api/json-api"; export type NotificationId = string | number; export type NotificationMessage = React.ReactNode | React.ReactNode[] | JsonApiErrorParsed; diff --git a/src/renderer/components/resource-metrics/resource-metrics-text.tsx b/src/renderer/components/resource-metrics/resource-metrics-text.tsx index 0a971c5a1a..a83ef8118c 100644 --- a/src/renderer/components/resource-metrics/resource-metrics-text.tsx +++ b/src/renderer/components/resource-metrics/resource-metrics-text.tsx @@ -20,7 +20,7 @@ */ import React from "react"; -import { IPodMetrics } from "../../api/endpoints"; +import type { IPodMetrics } from "../../api/endpoints"; import { getMetricLastPoints, IMetrics } from "../../api/endpoints/metrics.api"; import { bytesToUnits } from "../../utils"; import { Badge } from "../badge"; diff --git a/src/renderer/components/resource-metrics/resource-metrics.tsx b/src/renderer/components/resource-metrics/resource-metrics.tsx index 90a180a3c2..aaf111a8cb 100644 --- a/src/renderer/components/resource-metrics/resource-metrics.tsx +++ b/src/renderer/components/resource-metrics/resource-metrics.tsx @@ -24,7 +24,7 @@ import "./resource-metrics.scss"; import React, { createContext, useEffect, useState } from "react"; import { Radio, RadioGroup } from "../radio"; import { useInterval } from "../../hooks"; -import { KubeObject } from "../../api/kube-object"; +import type { KubeObject } from "../../api/kube-object"; import { cssNames } from "../../utils"; import { Spinner } from "../spinner"; diff --git a/src/renderer/components/scroll-spy/scroll-spy.tsx b/src/renderer/components/scroll-spy/scroll-spy.tsx index 208ad326bb..672f7dee5d 100644 --- a/src/renderer/components/scroll-spy/scroll-spy.tsx +++ b/src/renderer/components/scroll-spy/scroll-spy.tsx @@ -22,7 +22,7 @@ import { observer } from "mobx-react"; import React, { useEffect, useRef, useState } from "react"; import { useMutationObserver } from "../../hooks"; -import { NavigationTree } from "../tree-view"; +import type { NavigationTree } from "../tree-view"; interface Props extends React.DOMAttributes { render: (data: NavigationTree[]) => JSX.Element diff --git a/src/renderer/components/table/table-cell.tsx b/src/renderer/components/table/table-cell.tsx index e7d88c8e67..0f9fdd8aa0 100644 --- a/src/renderer/components/table/table-cell.tsx +++ b/src/renderer/components/table/table-cell.tsx @@ -64,7 +64,7 @@ export class TableCell extends React.Component { renderSortIcon() { const { sortBy, _sorting } = this.props; - if (!this.isSortable) return; + if (!this.isSortable) return null; const sortActive = _sorting.sortBy === sortBy; const sortIconName = (!sortActive || _sorting.orderBy === "desc") ? "arrow_drop_down" : "arrow_drop_up"; @@ -83,6 +83,8 @@ export class TableCell extends React.Component { if (checkbox && showCheckbox) { return ; } + + return null; } render() { diff --git a/src/renderer/components/table/table-row.tsx b/src/renderer/components/table/table-row.tsx index 4a1acebe5f..9b3ce613e1 100644 --- a/src/renderer/components/table/table-row.tsx +++ b/src/renderer/components/table/table-row.tsx @@ -23,7 +23,7 @@ import "./table-row.scss"; import React, { CSSProperties } from "react"; import { cssNames } from "../../utils"; -import { ItemObject } from "../../item.store"; +import type { ItemObject } from "../../item.store"; export type TableRowElem = React.ReactElement; diff --git a/src/renderer/components/table/table.storage.ts b/src/renderer/components/table/table.storage.ts index 3a9b6af789..94db9eda32 100644 --- a/src/renderer/components/table/table.storage.ts +++ b/src/renderer/components/table/table.storage.ts @@ -20,7 +20,7 @@ */ import { createStorage } from "../../utils"; -import { TableSortParams } from "./table"; +import type { TableSortParams } from "./table"; export interface TableStorageModel { sortParams: { diff --git a/src/renderer/components/table/table.tsx b/src/renderer/components/table/table.tsx index 6884923f8a..9672a9d1ff 100644 --- a/src/renderer/components/table/table.tsx +++ b/src/renderer/components/table/table.tsx @@ -27,10 +27,10 @@ import { observer } from "mobx-react"; import { autobind, cssNames, noop } from "../../utils"; import { TableRow, TableRowElem, TableRowProps } from "./table-row"; import { TableHead, TableHeadElem, TableHeadProps } from "./table-head"; -import { TableCellElem } from "./table-cell"; +import type { TableCellElem } from "./table-cell"; import { VirtualList } from "../virtual-list"; import { createPageParam } from "../../navigation"; -import { ItemObject } from "../../item.store"; +import type { ItemObject } from "../../item.store"; import { getSortParams, setSortParams } from "./table.storage"; import { computed } from "mobx"; @@ -102,33 +102,35 @@ export class Table extends React.Component { const content = React.Children.toArray(children) as (TableRowElem | TableHeadElem)[]; const headElem: React.ReactElement = content.find(elem => elem.type === TableHead); - if (headElem) { - if (sortable) { - const columns = React.Children.toArray(headElem.props.children) as TableCellElem[]; - - return React.cloneElement(headElem, { - children: columns.map(elem => { - if (elem.props.checkbox) { - return elem; - } - const title = elem.props.title || ( - // copy cell content to title if it's a string - // usable if part of TableCell's content is hidden when there is not enough space - typeof elem.props.children === "string" ? elem.props.children : undefined - ); - - return React.cloneElement(elem, { - title, - _sort: this.sort, - _sorting: this.sortParams, - _nowrap: headElem.props.nowrap, - }); - }) - }); - } - - return headElem; + if (!headElem) { + return null; } + + if (sortable) { + const columns = React.Children.toArray(headElem.props.children) as TableCellElem[]; + + return React.cloneElement(headElem, { + children: columns.map(elem => { + if (elem.props.checkbox) { + return elem; + } + const title = elem.props.title || ( + // copy cell content to title if it's a string + // usable if part of TableCell's content is hidden when there is not enough space + typeof elem.props.children === "string" ? elem.props.children : undefined + ); + + return React.cloneElement(elem, { + title, + _sort: this.sort, + _sorting: this.sortParams, + _nowrap: headElem.props.nowrap, + }); + }) + }); + } + + return headElem; } getSorted(items: any[]) { diff --git a/src/renderer/components/virtual-list/virtual-list.tsx b/src/renderer/components/virtual-list/virtual-list.tsx index fd9f91db0d..86f0c7e44d 100644 --- a/src/renderer/components/virtual-list/virtual-list.tsx +++ b/src/renderer/components/virtual-list/virtual-list.tsx @@ -27,8 +27,8 @@ import React, { Component } from "react"; import { observer } from "mobx-react"; import { Align, ListChildComponentProps, ListOnScrollProps, VariableSizeList } from "react-window"; import { cssNames, noop } from "../../utils"; -import { TableRowProps } from "../table/table-row"; -import { ItemObject } from "../../item.store"; +import type { TableRowProps } from "../table/table-row"; +import type { ItemObject } from "../../item.store"; import throttle from "lodash/throttle"; import debounce from "lodash/debounce"; import isEqual from "lodash/isEqual"; diff --git a/src/renderer/components/wizard/wizard.tsx b/src/renderer/components/wizard/wizard.tsx index 8ade6d9210..654db47ef6 100755 --- a/src/renderer/components/wizard/wizard.tsx +++ b/src/renderer/components/wizard/wizard.tsx @@ -221,7 +221,7 @@ export class WizardStep extends React.Component(key: string, initialValue: T, options?: CreateObservableOptions) { const storage = createStorage(key, initialValue, options); diff --git a/src/renderer/kube-object.store.ts b/src/renderer/kube-object.store.ts index 0c82bbeb56..fb60bd0330 100644 --- a/src/renderer/kube-object.store.ts +++ b/src/renderer/kube-object.store.ts @@ -24,11 +24,11 @@ import type { ClusterContext } from "./components/context"; import { action, computed, observable, reaction, when } from "mobx"; import { autobind, bifurcateArray, noop, rejectPromiseBy } from "./utils"; import { KubeObject, KubeStatus } from "./api/kube-object"; -import { IKubeWatchEvent } from "./api/kube-watch-api"; +import type { IKubeWatchEvent } from "./api/kube-watch-api"; import { ItemStore } from "./item.store"; import { apiManager } from "./api/api-manager"; import { IKubeApiQueryParams, KubeApi, parseKubeApi } from "./api/kube-api"; -import { KubeJsonApiData } from "./api/kube-json-api"; +import type { KubeJsonApiData } from "./api/kube-json-api"; import { Notifications } from "./components/notifications"; export interface KubeObjectStoreLoadingParams { @@ -89,9 +89,13 @@ export abstract class KubeObjectStore extends ItemSt if (namespaces.length) { return this.items.filter(item => namespaces.includes(item.getNs())); - } else if (!strict) { + } + + if (!strict) { return this.items; } + + return []; } getById(id: string) { @@ -194,7 +198,7 @@ export abstract class KubeObjectStore extends ItemSt } @action - reloadAll(opts: { force?: boolean, namespaces?: string[], merge?: boolean } = {}) { + async reloadAll(opts: { force?: boolean, namespaces?: string[], merge?: boolean } = {}) { const { force = false, ...loadingOptions } = opts; if (this.isLoading || (this.isLoaded && !force)) { diff --git a/src/renderer/navigation/page-param.ts b/src/renderer/navigation/page-param.ts index 2908993a0c..1d20e0de48 100644 --- a/src/renderer/navigation/page-param.ts +++ b/src/renderer/navigation/page-param.ts @@ -20,7 +20,7 @@ */ // Manage observable URL-param from document.location.search -import { IObservableHistory } from "mobx-observable-history"; +import type { IObservableHistory } from "mobx-observable-history"; export interface PageParamInit { name: string; diff --git a/src/renderer/utils/display-booleans.ts b/src/renderer/utils/display-booleans.ts index cb47b43351..262e032ca7 100644 --- a/src/renderer/utils/display-booleans.ts +++ b/src/renderer/utils/display-booleans.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import React from "react"; +import type React from "react"; export function displayBooleans(shouldShow: boolean, from: React.ReactNode): React.ReactNode { if (shouldShow) { diff --git a/src/renderer/utils/prevDefault.ts b/src/renderer/utils/prevDefault.ts index 77d5ef6f89..4479cbcf93 100644 --- a/src/renderer/utils/prevDefault.ts +++ b/src/renderer/utils/prevDefault.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import React from "react"; +import type React from "react"; // Helper for preventing default event action and performing custom callback // 1) diff --git a/src/renderer/utils/rbac.ts b/src/renderer/utils/rbac.ts index d2740f1f12..ca264f050c 100644 --- a/src/renderer/utils/rbac.ts +++ b/src/renderer/utils/rbac.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { KubeResource } from "../../common/rbac"; +import type { KubeResource } from "../../common/rbac"; export const ResourceNames: Record = { "namespaces": "Namespaces", diff --git a/tsconfig.json b/tsconfig.json index b2cb7376ef..2d72839134 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,14 +13,16 @@ "sourceMap": true, "strict": false, "noImplicitAny": true, - "noUnusedLocals": false, - "noImplicitReturns": false, + "noUnusedLocals": true, + "noImplicitReturns": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, + "isolatedModules": true, "skipLibCheck": true, "allowJs": false, "esModuleInterop": true, "allowSyntheticDefaultImports": true, + "importsNotUsedAsValues": "error", "traceResolution": false, "resolveJsonModule": true, "paths": { diff --git a/webpack.extensions.ts b/webpack.extensions.ts index fb79c55675..e5a95660aa 100644 --- a/webpack.extensions.ts +++ b/webpack.extensions.ts @@ -21,7 +21,7 @@ import path from "path"; -import webpack from "webpack"; +import type webpack from "webpack"; import { sassCommonVars, isDevelopment, isProduction } from "./src/common/vars"; export default function generateExtensionTypes(): webpack.Configuration { diff --git a/webpack.main.ts b/webpack.main.ts index 45c74a85c7..26550de14f 100755 --- a/webpack.main.ts +++ b/webpack.main.ts @@ -20,7 +20,7 @@ */ import path from "path"; -import webpack from "webpack"; +import type webpack from "webpack"; import ForkTsCheckerPlugin from "fork-ts-checker-webpack-plugin"; import { isProduction, mainDir, buildDir, isDevelopment } from "./src/common/vars"; import nodeExternals from "webpack-node-externals";