From e6d4b05e42c5bc61c4e53a81a562b74aa00482fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Mar 2022 13:55:49 -0500 Subject: [PATCH 01/21] Bump plist from 3.0.2 to 3.0.4 (#4952) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/yarn.lock b/yarn.lock index c32c4653ff..3cb00503a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2979,12 +2979,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -base64-js@^1.5.1: +base64-js@^1.0.2, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -10486,13 +10481,12 @@ playwright@^1.17.1: playwright-core "=1.17.1" plist@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.2.tgz#74bbf011124b90421c22d15779cee60060ba95bc" - integrity sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ== + version "3.0.4" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.4.tgz#a62df837e3aed2bb3b735899d510c4f186019cbe" + integrity sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg== dependencies: base64-js "^1.5.1" xmlbuilder "^9.0.7" - xmldom "^0.5.0" pngjs@^5.0.0: version "5.0.0" @@ -13973,11 +13967,6 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmldom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.5.0.tgz#193cb96b84aa3486127ea6272c4596354cb4962e" - integrity sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA== - xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" From d72ebac5f366d864cbb7d89acd28a576eb4b5470 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 2 Mar 2022 17:21:32 -0500 Subject: [PATCH 02/21] Bump lens-k8s-proxy to v0.1.5 (#4946) Signed-off-by: Sebastian Malton --- package.json | 2 +- src/main/context-handler/context-handler.ts | 2 +- src/main/kube-auth-proxy/kube-auth-proxy.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index e5decdef44..e2471a172c 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "postversion": "git push --set-upstream ${GIT_REMOTE:-origin} release/v$npm_package_version" }, "config": { - "k8sProxyVersion": "0.1.2", + "k8sProxyVersion": "0.1.5", "bundledKubectlVersion": "1.23.3", "bundledHelmVersion": "3.7.2", "sentryDsn": "" diff --git a/src/main/context-handler/context-handler.ts b/src/main/context-handler/context-handler.ts index ad1ba734b8..5287828b5b 100644 --- a/src/main/context-handler/context-handler.ts +++ b/src/main/context-handler/context-handler.ts @@ -118,7 +118,7 @@ export class ContextHandler { await this.ensureServer(); const path = this.clusterUrl.path !== "/" ? this.clusterUrl.path : ""; - return `http://127.0.0.1:${this.kubeAuthProxy.port}${this.kubeAuthProxy.apiPrefix.slice(0, -1)}${path}`; + return `http://127.0.0.1:${this.kubeAuthProxy.port}${this.kubeAuthProxy.apiPrefix}${path}`; } async getApiTarget(isLongRunningRequest = false): Promise { diff --git a/src/main/kube-auth-proxy/kube-auth-proxy.ts b/src/main/kube-auth-proxy/kube-auth-proxy.ts index d8a291b50c..addc11b53b 100644 --- a/src/main/kube-auth-proxy/kube-auth-proxy.ts +++ b/src/main/kube-auth-proxy/kube-auth-proxy.ts @@ -18,7 +18,7 @@ interface Dependencies { } export class KubeAuthProxy { - public readonly apiPrefix = `/${randomBytes(8).toString("hex")}/`; + public readonly apiPrefix = `/${randomBytes(8).toString("hex")}`; public get port(): number { return this._port; From 54b87efd8967ee39a9059cb96b51a5c1b319179d Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Thu, 3 Mar 2022 14:55:57 +0200 Subject: [PATCH 03/21] Replace KubeObjectStatusRegistry with reactive solution (#4815) --- src/extensions/common-api/registrations.ts | 2 +- .../extension-loader/extension-loader.ts | 1 - src/extensions/lens-renderer-extension.ts | 3 +- src/extensions/registries/index.ts | 1 - .../registries/kube-object-status-registry.ts | 29 -- .../kube-object-status-icon.test.tsx.snap | 332 ++++++++++++++++++ .../kube-object-status-icon.test.tsx | 263 ++++++++++++++ .../kube-object-status-icon.tsx | 22 +- .../kube-object-status-registration.ts | 12 + .../status-registrations.injectable.ts | 23 ++ .../statuses-for-kube-object.injectable.ts | 35 ++ src/renderer/initializers/registries.ts | 1 - 12 files changed, 687 insertions(+), 37 deletions(-) delete mode 100644 src/extensions/registries/kube-object-status-registry.ts create mode 100644 src/renderer/components/kube-object-status-icon/__snapshots__/kube-object-status-icon.test.tsx.snap create mode 100644 src/renderer/components/kube-object-status-icon/kube-object-status-icon.test.tsx create mode 100644 src/renderer/components/kube-object-status-icon/kube-object-status-registration.ts create mode 100644 src/renderer/components/kube-object-status-icon/status-registrations.injectable.ts create mode 100644 src/renderer/components/kube-object-status-icon/statuses-for-kube-object.injectable.ts diff --git a/src/extensions/common-api/registrations.ts b/src/extensions/common-api/registrations.ts index 76d7538e12..01b4407a6b 100644 --- a/src/extensions/common-api/registrations.ts +++ b/src/extensions/common-api/registrations.ts @@ -6,7 +6,7 @@ export type { StatusBarRegistration } from "../../renderer/components/status-bar export type { KubeObjectMenuRegistration, KubeObjectMenuComponents } from "../../renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-registration"; export type { AppPreferenceRegistration, AppPreferenceComponents } from "../../renderer/components/+preferences/app-preferences/app-preference-registration"; export type { KubeObjectDetailRegistration, KubeObjectDetailComponents } from "../registries/kube-object-detail-registry"; -export type { KubeObjectStatusRegistration } from "../registries/kube-object-status-registry"; +export type { KubeObjectStatusRegistration } from "../../renderer/components/kube-object-status-icon/kube-object-status-registration"; export type { PageRegistration, RegisteredPage, PageParams, PageComponentProps, PageComponents, PageTarget } from "../registries/page-registry"; export type { ClusterPageMenuRegistration, ClusterPageMenuComponents } from "../registries/page-menu-registry"; export type { ProtocolHandlerRegistration, RouteParams as ProtocolRouteParams, RouteHandler as ProtocolRouteHandler } from "../registries/protocol-handler"; diff --git a/src/extensions/extension-loader/extension-loader.ts b/src/extensions/extension-loader/extension-loader.ts index 40121ae37e..dee22e9407 100644 --- a/src/extensions/extension-loader/extension-loader.ts +++ b/src/extensions/extension-loader/extension-loader.ts @@ -277,7 +277,6 @@ export class ExtensionLoader { registries.ClusterPageRegistry.getInstance().add(extension.clusterPages, extension), registries.ClusterPageMenuRegistry.getInstance().add(extension.clusterPageMenus, extension), registries.KubeObjectDetailRegistry.getInstance().add(extension.kubeObjectDetailItems), - registries.KubeObjectStatusRegistry.getInstance().add(extension.kubeObjectStatusTexts), registries.WorkloadsOverviewDetailRegistry.getInstance().add(extension.kubeWorkloadsOverviewItems), ]; diff --git a/src/extensions/lens-renderer-extension.ts b/src/extensions/lens-renderer-extension.ts index b61cd9a2c8..ba68306886 100644 --- a/src/extensions/lens-renderer-extension.ts +++ b/src/extensions/lens-renderer-extension.ts @@ -20,12 +20,13 @@ import type { AdditionalCategoryColumnRegistration } from "../renderer/component import type { CustomCategoryViewRegistration } from "../renderer/components/+catalog/custom-views"; import type { StatusBarRegistration } from "../renderer/components/status-bar/status-bar-registration"; import type { KubeObjectMenuRegistration } from "../renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-registration"; +import type { KubeObjectStatusRegistration } from "../renderer/components/kube-object-status-icon/kube-object-status-registration"; export class LensRendererExtension extends LensExtension { globalPages: registries.PageRegistration[] = []; clusterPages: registries.PageRegistration[] = []; clusterPageMenus: registries.ClusterPageMenuRegistration[] = []; - kubeObjectStatusTexts: registries.KubeObjectStatusRegistration[] = []; + kubeObjectStatusTexts: KubeObjectStatusRegistration[] = []; appPreferences: AppPreferenceRegistration[] = []; entitySettings: registries.EntitySettingRegistration[] = []; statusBarItems: StatusBarRegistration[] = []; diff --git a/src/extensions/registries/index.ts b/src/extensions/registries/index.ts index 0713e3eede..6a4a821aaa 100644 --- a/src/extensions/registries/index.ts +++ b/src/extensions/registries/index.ts @@ -8,7 +8,6 @@ export * from "./page-registry"; export * from "./page-menu-registry"; export * from "./kube-object-detail-registry"; -export * from "./kube-object-status-registry"; export * from "./entity-setting-registry"; export * from "./catalog-entity-detail-registry"; export * from "./workloads-overview-detail-registry"; diff --git a/src/extensions/registries/kube-object-status-registry.ts b/src/extensions/registries/kube-object-status-registry.ts deleted file mode 100644 index 0121e9a39e..0000000000 --- a/src/extensions/registries/kube-object-status-registry.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { KubeObject, KubeObjectStatus } from "../renderer-api/k8s-api"; -import { BaseRegistry } from "./base-registry"; - -export interface KubeObjectStatusRegistration { - kind: string; - apiVersions: string[]; - resolve: (object: KubeObject) => KubeObjectStatus; -} - -export class KubeObjectStatusRegistry extends BaseRegistry { - getItemsForKind(kind: string, apiVersion: string) { - return this.getItems() - .filter((item) => ( - item.kind === kind - && item.apiVersions.includes(apiVersion) - )); - } - - getItemsForObject(src: KubeObject) { - return this.getItemsForKind(src.kind, src.apiVersion) - .map(item => item.resolve(src)) - .filter(Boolean); - } -} diff --git a/src/renderer/components/kube-object-status-icon/__snapshots__/kube-object-status-icon.test.tsx.snap b/src/renderer/components/kube-object-status-icon/__snapshots__/kube-object-status-icon.test.tsx.snap new file mode 100644 index 0000000000..86f5688d82 --- /dev/null +++ b/src/renderer/components/kube-object-status-icon/__snapshots__/kube-object-status-icon.test.tsx.snap @@ -0,0 +1,332 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`kube-object-status-icon given info and warning statuses are present, when rendered, renders with statuses 1`] = ` + +
+ + + warning + +
+ +
+
+
+
+ + Warning + +
+ - + Some warning status for some-name + + + · + 2d + +
+
+
+ + Info + +
+ - + Some info status for some-name + + + · + 2d + +
+
+
+
+ +`; + +exports[`kube-object-status-icon given level "critical" status, when rendered, renders with status 1`] = ` + +
+ + + error + +
+ +
+
+
+
+ + Critical + +
+ - + Some critical status for some-name + + + · + 2d + +
+
+
+
+ +`; + +exports[`kube-object-status-icon given level "info" status, when rendered, renders with status 1`] = ` + +
+ + + info + +
+ +
+
+
+
+ + Info + +
+ - + Some info status for some-name + + + · + 2d + +
+
+
+
+ +`; + +exports[`kube-object-status-icon given level "warning" status, when rendered, renders with status 1`] = ` + +
+ + + warning + +
+ +
+
+
+
+ + Warning + +
+ - + Some warning status for some-name + + + · + 2d + +
+
+
+
+ +`; + +exports[`kube-object-status-icon given no statuses, when rendered, renders as empty 1`] = `
`; + +exports[`kube-object-status-icon given registration for wrong api version, when rendered, renders as empty 1`] = ` + +
+ +`; + +exports[`kube-object-status-icon given registration for wrong kind, when rendered, renders as empty 1`] = ` + +
+ +`; + +exports[`kube-object-status-icon given registration without status for exact kube object, when rendered, renders as empty 1`] = ` + +
+ +`; + +exports[`kube-object-status-icon given status for all levels is present, when rendered, renders with statuses 1`] = ` + +
+ + + error + +
+ +
+
+
+
+ + Critical + +
+ - + Some critical status for some-name + + + · + 2d + +
+
+
+ + Warning + +
+ - + Some warning status for some-name + + + · + 2d + +
+
+
+ + Info + +
+ - + Some info status for some-name + + + · + 2d + +
+
+
+
+ +`; diff --git a/src/renderer/components/kube-object-status-icon/kube-object-status-icon.test.tsx b/src/renderer/components/kube-object-status-icon/kube-object-status-icon.test.tsx new file mode 100644 index 0000000000..7f181af8f8 --- /dev/null +++ b/src/renderer/components/kube-object-status-icon/kube-object-status-icon.test.tsx @@ -0,0 +1,263 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getDiForUnitTesting } from "../../getDiForUnitTesting"; +import rendererExtensionsInjectable from "../../../extensions/renderer-extensions.injectable"; +import { DiRender, renderFor } from "../test-utils/renderFor"; +import { computed } from "mobx"; +import { LensRendererExtension } from "../../../extensions/lens-renderer-extension"; +import { KubeObjectStatusLevel } from "../../../extensions/renderer-api/kube-object-status"; +import { KubeObject } from "../../../common/k8s-api/kube-object"; +import { KubeObjectStatusIcon } from "./kube-object-status-icon"; +import React from "react"; +import type { KubeObjectStatusRegistration } from "./kube-object-status-registration"; + +describe("kube-object-status-icon", () => { + let render: DiRender; + let kubeObjectStatusRegistrations: KubeObjectStatusRegistration[]; + + beforeEach(async () => { + // TODO: Make mocking of date in unit tests global + global.Date.now = () => new Date("2015-10-21T07:28:00Z").getTime(); + + const di = getDiForUnitTesting({ doGeneralOverrides: true }); + + render = renderFor(di); + + kubeObjectStatusRegistrations = []; + + const someTestExtension = new SomeTestExtension( + kubeObjectStatusRegistrations, + ); + + di.override(rendererExtensionsInjectable, () => + computed(() => [someTestExtension]), + ); + + await di.runSetups(); + }); + + it("given no statuses, when rendered, renders as empty", () => { + const kubeObject = getKubeObjectStub("irrelevant", "irrelevant"); + + const { container } = render(); + + expect(container).toMatchSnapshot(); + }); + + it('given level "critical" status, when rendered, renders with status', () => { + const kubeObject = getKubeObjectStub("some-kind", "some-api-version"); + + const statusRegistration = getStatusRegistration( + KubeObjectStatusLevel.CRITICAL, + "critical", + "some-kind", + ["some-api-version"], + ); + + kubeObjectStatusRegistrations.push(statusRegistration); + + const { baseElement } = render( + , + ); + + expect(baseElement).toMatchSnapshot(); + }); + + it('given level "info" status, when rendered, renders with status', () => { + const kubeObject = getKubeObjectStub("some-kind", "some-api-version"); + + const statusRegistration = getStatusRegistration( + KubeObjectStatusLevel.INFO, + "info", + "some-kind", + ["some-api-version"], + ); + + kubeObjectStatusRegistrations.push(statusRegistration); + + const { baseElement } = render( + , + ); + + expect(baseElement).toMatchSnapshot(); + }); + + it('given level "warning" status, when rendered, renders with status', () => { + const kubeObject = getKubeObjectStub("some-kind", "some-api-version"); + + const statusRegistration = getStatusRegistration( + KubeObjectStatusLevel.WARNING, + "warning", + "some-kind", + ["some-api-version"], + ); + + kubeObjectStatusRegistrations.push(statusRegistration); + + const { baseElement } = render( + , + ); + + expect(baseElement).toMatchSnapshot(); + }); + + it("given status for all levels is present, when rendered, renders with statuses", () => { + const kubeObject = getKubeObjectStub("some-kind", "some-api-version"); + + const critical = getStatusRegistration( + KubeObjectStatusLevel.CRITICAL, + "critical", + "some-kind", + ["some-api-version"], + ); + + const warning = getStatusRegistration( + KubeObjectStatusLevel.WARNING, + "warning", + "some-kind", + ["some-api-version"], + ); + + const info = getStatusRegistration( + KubeObjectStatusLevel.INFO, + "info", + "some-kind", + ["some-api-version"], + ); + + kubeObjectStatusRegistrations.push(critical); + kubeObjectStatusRegistrations.push(warning); + kubeObjectStatusRegistrations.push(info); + + const { baseElement } = render( + , + ); + + expect(baseElement).toMatchSnapshot(); + }); + + it("given info and warning statuses are present, when rendered, renders with statuses", () => { + const kubeObject = getKubeObjectStub("some-kind", "some-api-version"); + + const warning = getStatusRegistration( + KubeObjectStatusLevel.WARNING, + "warning", + "some-kind", + ["some-api-version"], + ); + + const info = getStatusRegistration( + KubeObjectStatusLevel.INFO, + "info", + "some-kind", + ["some-api-version"], + ); + + kubeObjectStatusRegistrations.push(warning); + kubeObjectStatusRegistrations.push(info); + + const { baseElement } = render( + , + ); + + expect(baseElement).toMatchSnapshot(); + }); + + + it("given registration for wrong api version, when rendered, renders as empty", () => { + const kubeObject = getKubeObjectStub("some-kind", "some-api-version"); + + const statusRegistration = getStatusRegistration( + KubeObjectStatusLevel.CRITICAL, + "irrelevant", + "some-kind", + ["some-other-api-version"], + ); + + kubeObjectStatusRegistrations.push(statusRegistration); + + const { baseElement } = render( + , + ); + + expect(baseElement).toMatchSnapshot(); + }); + + it("given registration for wrong kind, when rendered, renders as empty", () => { + const kubeObject = getKubeObjectStub("some-kind", "some-api-version"); + + const statusRegistration = getStatusRegistration( + KubeObjectStatusLevel.CRITICAL, + "irrelevant", + "some-other-kind", + ["some-api-version"], + ); + + kubeObjectStatusRegistrations.push(statusRegistration); + + const { baseElement } = render( + , + ); + + expect(baseElement).toMatchSnapshot(); + }); + + it("given registration without status for exact kube object, when rendered, renders as empty", () => { + const kubeObject = getKubeObjectStub("some-kind", "some-api-version"); + + const statusRegistration = { + apiVersions: ["some-api-version"], + kind: "some-kind", + resolve: (): void => {}, + }; + + // @ts-ignore + kubeObjectStatusRegistrations.push(statusRegistration); + + const { baseElement } = render( + , + ); + + expect(baseElement).toMatchSnapshot(); + + }); +}); + +const getKubeObjectStub = (kind: string, apiVersion: string) => KubeObject.create({ + apiVersion, + kind, + metadata: { + uid: "some-uid", + name: "some-name", + resourceVersion: "some-resource-version", + namespace: "some-namespace", + }, +}); + +const getStatusRegistration = (level: KubeObjectStatusLevel, title: string, kind: string, apiVersions: string[]) => ({ + apiVersions, + kind, + resolve: (kubeObject: KubeObject) => ({ + level, + text: `Some ${title} status for ${kubeObject.getName()}`, + timestamp: "2015-10-19T07:28:00Z", + }), +}); + +class SomeTestExtension extends LensRendererExtension { + constructor(kubeObjectStatusTexts: KubeObjectStatusRegistration[]) { + super({ + id: "some-id", + absolutePath: "irrelevant", + isBundled: false, + isCompatible: false, + isEnabled: false, + manifest: { name: "some-id", version: "some-version" }, + manifestPath: "irrelevant", + }); + + this.kubeObjectStatusTexts = kubeObjectStatusTexts; + } +} 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 7ca6098e3f..db5429998e 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 @@ -9,7 +9,8 @@ import React from "react"; import { Icon } from "../icon"; import { cssNames, formatDuration } from "../../utils"; import { KubeObject, KubeObjectStatus, KubeObjectStatusLevel } from "../../..//extensions/renderer-api/k8s-api"; -import { KubeObjectStatusRegistry } from "../../../extensions/registries"; +import { withInjectables } from "@ogre-tools/injectable-react"; +import statusesForKubeObjectInjectable from "./statuses-for-kube-object.injectable"; function statusClassName(level: KubeObjectStatusLevel): string { switch (level) { @@ -68,7 +69,11 @@ export interface KubeObjectStatusIconProps { object: KubeObject; } -export class KubeObjectStatusIcon extends React.Component { +interface Dependencies { + statuses: KubeObjectStatus[]; +} + +class NonInjectedKubeObjectStatusIcon extends React.Component { renderStatuses(statuses: KubeObjectStatus[], level: number) { const filteredStatuses = statuses.filter((item) => item.level == level); @@ -89,7 +94,7 @@ export class KubeObjectStatusIcon extends React.Component( + NonInjectedKubeObjectStatusIcon, + + { + getProps: (di, props) => ({ + statuses: di.inject(statusesForKubeObjectInjectable, props.object), + ...props, + }), + }, +); diff --git a/src/renderer/components/kube-object-status-icon/kube-object-status-registration.ts b/src/renderer/components/kube-object-status-icon/kube-object-status-registration.ts new file mode 100644 index 0000000000..17b8f86196 --- /dev/null +++ b/src/renderer/components/kube-object-status-icon/kube-object-status-registration.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import type { KubeObject } from "../../../common/k8s-api/kube-object"; +import type { KubeObjectStatus } from "../../../extensions/renderer-api/kube-object-status"; + +export interface KubeObjectStatusRegistration { + kind: string; + apiVersions: string[]; + resolve: (object: KubeObject) => KubeObjectStatus; +} diff --git a/src/renderer/components/kube-object-status-icon/status-registrations.injectable.ts b/src/renderer/components/kube-object-status-icon/status-registrations.injectable.ts new file mode 100644 index 0000000000..c75aa85236 --- /dev/null +++ b/src/renderer/components/kube-object-status-icon/status-registrations.injectable.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; +import { computed } from "mobx"; +import rendererExtensionsInjectable from "../../../extensions/renderer-extensions.injectable"; + +const statusRegistrationsInjectable = getInjectable({ + id: "status-registrations", + + instantiate: (di) => { + const extensions = di.inject(rendererExtensionsInjectable); + + return computed(() => + extensions.get().flatMap((extension) => extension.kubeObjectStatusTexts), + ); + }, + + lifecycle: lifecycleEnum.singleton, +}); + +export default statusRegistrationsInjectable; diff --git a/src/renderer/components/kube-object-status-icon/statuses-for-kube-object.injectable.ts b/src/renderer/components/kube-object-status-icon/statuses-for-kube-object.injectable.ts new file mode 100644 index 0000000000..d277dd04a6 --- /dev/null +++ b/src/renderer/components/kube-object-status-icon/statuses-for-kube-object.injectable.ts @@ -0,0 +1,35 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; +import statusRegistrationsInjectable from "./status-registrations.injectable"; +import type { KubeObject } from "../../../common/k8s-api/kube-object"; +import { conforms, eq, includes } from "lodash/fp"; +import type { KubeObjectStatusRegistration } from "./kube-object-status-registration"; + +const statusesForKubeObjectInjectable = getInjectable({ + id: "statuses-for-kube-object", + + instantiate: (di, kubeObject: KubeObject) => + di + .inject(statusRegistrationsInjectable) + .get() + .filter(toKubeObjectRelated(kubeObject)) + .map(toStatus(kubeObject)) + .filter(Boolean), + + lifecycle: lifecycleEnum.transient, +}); + +const toKubeObjectRelated = (kubeObject: KubeObject) => + conforms({ + kind: eq(kubeObject.kind), + apiVersions: includes(kubeObject.apiVersion), + }); + +const toStatus = + (kubeObject: KubeObject) => (item: KubeObjectStatusRegistration) => + item.resolve(kubeObject); + +export default statusesForKubeObjectInjectable; diff --git a/src/renderer/initializers/registries.ts b/src/renderer/initializers/registries.ts index 374e114b7c..2f19e758b5 100644 --- a/src/renderer/initializers/registries.ts +++ b/src/renderer/initializers/registries.ts @@ -12,6 +12,5 @@ export function initRegistries() { registries.EntitySettingRegistry.createInstance(); registries.GlobalPageRegistry.createInstance(); registries.KubeObjectDetailRegistry.createInstance(); - registries.KubeObjectStatusRegistry.createInstance(); registries.WorkloadsOverviewDetailRegistry.createInstance(); } From 8dbc0b82f8d7aba06c05c12c65f54cde84e7c272 Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Thu, 3 Mar 2022 19:26:56 +0200 Subject: [PATCH 04/21] Fix api-manager kubeobject types (#4959) * loosen api-manager kubeobject types Signed-off-by: Jari Kolehmainen * less any Signed-off-by: Jari Kolehmainen * less any Signed-off-by: Jari Kolehmainen * fix typings Signed-off-by: Jari Kolehmainen * fix typings Signed-off-by: Jari Kolehmainen --- src/common/k8s-api/api-manager.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/k8s-api/api-manager.ts b/src/common/k8s-api/api-manager.ts index d392673364..728ac8b61d 100644 --- a/src/common/k8s-api/api-manager.ts +++ b/src/common/k8s-api/api-manager.ts @@ -32,7 +32,7 @@ export class ApiManager { return iter.find(this.apis.values(), api => api.kind === kind && api.apiVersionWithGroup === apiVersion); } - registerApi(apiBase: string, api: KubeApi) { + registerApi(apiBase: string, api: KubeApi) { if (!api.apiBase) return; if (!this.apis.has(apiBase)) { @@ -46,13 +46,13 @@ export class ApiManager { } } - protected resolveApi(api?: string | KubeApi): KubeApi | undefined { + protected resolveApi(api?: string | KubeApi): KubeApi | undefined { if (!api) { return undefined; } if (typeof api === "string") { - return this.getApi(api) as KubeApi; + return this.getApi(api) as KubeApi; } return api; @@ -69,7 +69,7 @@ export class ApiManager { } @action - registerStore(store: KubeObjectStore, apis: KubeApi[] = [store.api]) { + registerStore(store: KubeObjectStore, apis: KubeApi[] = [store.api]) { apis.filter(Boolean).forEach(api => { if (api.apiBase) this.stores.set(api.apiBase, store); }); From 125a47a56d58540442587db3cc3f87410754f5b0 Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Fri, 4 Mar 2022 10:04:38 +0200 Subject: [PATCH 05/21] Replace WorkloadsOverviewDetailRegistry with reactive solution (#4817) Signed-off-by: Janne Savolainen --- .../extension-loader/extension-loader.ts | 1 - src/extensions/lens-renderer-extension.ts | 3 +- src/extensions/registries/index.ts | 1 - .../workloads-overview-detail-registry.ts | 31 -------- src/renderer/bootstrap.tsx | 3 - .../detail-components.injectable.ts | 70 +++++++++++++++++++ .../+workloads-overview/overview.tsx | 18 +++-- .../workloads-overview-detail-registration.ts | 12 ++++ src/renderer/initializers/index.ts | 1 - src/renderer/initializers/registries.ts | 1 - .../workloads-overview-detail-registry.tsx | 25 ------- 11 files changed, 92 insertions(+), 74 deletions(-) delete mode 100644 src/extensions/registries/workloads-overview-detail-registry.ts create mode 100644 src/renderer/components/+workloads-overview/detail-components.injectable.ts create mode 100644 src/renderer/components/+workloads-overview/workloads-overview-detail-registration.ts delete mode 100644 src/renderer/initializers/workloads-overview-detail-registry.tsx diff --git a/src/extensions/extension-loader/extension-loader.ts b/src/extensions/extension-loader/extension-loader.ts index dee22e9407..5db134dd4c 100644 --- a/src/extensions/extension-loader/extension-loader.ts +++ b/src/extensions/extension-loader/extension-loader.ts @@ -277,7 +277,6 @@ export class ExtensionLoader { registries.ClusterPageRegistry.getInstance().add(extension.clusterPages, extension), registries.ClusterPageMenuRegistry.getInstance().add(extension.clusterPageMenus, extension), registries.KubeObjectDetailRegistry.getInstance().add(extension.kubeObjectDetailItems), - registries.WorkloadsOverviewDetailRegistry.getInstance().add(extension.kubeWorkloadsOverviewItems), ]; this.events.on("remove", (removedExtension: LensRendererExtension) => { diff --git a/src/extensions/lens-renderer-extension.ts b/src/extensions/lens-renderer-extension.ts index ba68306886..0c16b142a7 100644 --- a/src/extensions/lens-renderer-extension.ts +++ b/src/extensions/lens-renderer-extension.ts @@ -20,6 +20,7 @@ import type { AdditionalCategoryColumnRegistration } from "../renderer/component import type { CustomCategoryViewRegistration } from "../renderer/components/+catalog/custom-views"; import type { StatusBarRegistration } from "../renderer/components/status-bar/status-bar-registration"; import type { KubeObjectMenuRegistration } from "../renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-registration"; +import type { WorkloadsOverviewDetailRegistration } from "../renderer/components/+workloads-overview/workloads-overview-detail-registration"; import type { KubeObjectStatusRegistration } from "../renderer/components/kube-object-status-icon/kube-object-status-registration"; export class LensRendererExtension extends LensExtension { @@ -32,7 +33,7 @@ export class LensRendererExtension extends LensExtension { statusBarItems: StatusBarRegistration[] = []; kubeObjectDetailItems: registries.KubeObjectDetailRegistration[] = []; kubeObjectMenuItems: KubeObjectMenuRegistration[] = []; - kubeWorkloadsOverviewItems: registries.WorkloadsOverviewDetailRegistration[] = []; + kubeWorkloadsOverviewItems: WorkloadsOverviewDetailRegistration[] = []; commands: CommandRegistration[] = []; welcomeMenus: WelcomeMenuRegistration[] = []; welcomeBanners: WelcomeBannerRegistration[] = []; diff --git a/src/extensions/registries/index.ts b/src/extensions/registries/index.ts index 6a4a821aaa..23f064a26b 100644 --- a/src/extensions/registries/index.ts +++ b/src/extensions/registries/index.ts @@ -10,5 +10,4 @@ export * from "./page-menu-registry"; export * from "./kube-object-detail-registry"; export * from "./entity-setting-registry"; export * from "./catalog-entity-detail-registry"; -export * from "./workloads-overview-detail-registry"; export * from "./protocol-handler"; diff --git a/src/extensions/registries/workloads-overview-detail-registry.ts b/src/extensions/registries/workloads-overview-detail-registry.ts deleted file mode 100644 index 2688ba72d6..0000000000 --- a/src/extensions/registries/workloads-overview-detail-registry.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { orderBy } from "lodash"; -import type React from "react"; -import { BaseRegistry } from "./base-registry"; - -export interface WorkloadsOverviewDetailComponents { - Details: React.ComponentType<{}>; -} - -export interface WorkloadsOverviewDetailRegistration { - components: WorkloadsOverviewDetailComponents; - priority?: number; -} - -type RegisteredWorkloadsOverviewDetail = Required; - -export class WorkloadsOverviewDetailRegistry extends BaseRegistry { - getItems() { - return orderBy(super.getItems(), "priority", "desc"); - } - - protected getRegisteredItem(item: WorkloadsOverviewDetailRegistration): RegisteredWorkloadsOverviewDetail { - const { priority = 50, ...rest } = item; - - return { priority, ...rest }; - } -} diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index 2c42698997..91e6892e33 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -76,9 +76,6 @@ export async function bootstrap(di: DiContainer) { logger.info(`${logPrefix} initializing KubeObjectDetailRegistry`); initializers.initKubeObjectDetailRegistry(); - logger.info(`${logPrefix} initializing WorkloadsOverviewDetailRegistry`); - initializers.initWorkloadsOverviewDetailRegistry(); - logger.info(`${logPrefix} initializing CatalogEntityDetailRegistry`); initializers.initCatalogEntityDetailRegistry(); diff --git a/src/renderer/components/+workloads-overview/detail-components.injectable.ts b/src/renderer/components/+workloads-overview/detail-components.injectable.ts new file mode 100644 index 0000000000..53b0a8c344 --- /dev/null +++ b/src/renderer/components/+workloads-overview/detail-components.injectable.ts @@ -0,0 +1,70 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; +import { computed } from "mobx"; +import rendererExtensionsInjectable from "../../../extensions/renderer-extensions.injectable"; +import { OverviewStatuses } from "./overview-statuses"; +import { WorkloadEvents } from "../../initializers/workload-events"; +import { orderBy } from "lodash/fp"; +import type { WorkloadsOverviewDetailRegistration } from "./workloads-overview-detail-registration"; + +const detailComponentsInjectable = getInjectable({ + id: "workload-detail-components", + + instantiate: (di) => { + const extensions = di.inject(rendererExtensionsInjectable); + + return computed(() => { + const extensionRegistrations = extensions + .get() + .flatMap((extension) => extension.kubeWorkloadsOverviewItems); + + const allRegistrations = [ + ...coreRegistrations, + ...extensionRegistrations, + ]; + + return getRegistrationsInPriorityOrder(allRegistrations).map( + (item) => item.components.Details, + ); + }); + }, + + lifecycle: lifecycleEnum.singleton, +}); + +const coreRegistrations = [ + { + components: { + Details: OverviewStatuses, + }, + }, + { + priority: 5, + components: { + Details: WorkloadEvents, + }, + }, +]; + +const toRegistrationWithDefaultPriority = ({ + priority = 50, + ...rest +}: WorkloadsOverviewDetailRegistration) => ({ + priority, + ...rest, +}); + +const getRegistrationsInPriorityOrder = ( + allRegistrations: WorkloadsOverviewDetailRegistration[], +) => + orderBy( + "priority", + "desc", + + allRegistrations.map(toRegistrationWithDefaultPriority), + ); + +export default detailComponentsInjectable; diff --git a/src/renderer/components/+workloads-overview/overview.tsx b/src/renderer/components/+workloads-overview/overview.tsx index b4ee166ca9..527fc547b7 100644 --- a/src/renderer/components/+workloads-overview/overview.tsx +++ b/src/renderer/components/+workloads-overview/overview.tsx @@ -16,9 +16,8 @@ import { statefulSetStore } from "../+workloads-statefulsets/statefulset.store"; import { replicaSetStore } from "../+workloads-replicasets/replicasets.store"; import { jobStore } from "../+workloads-jobs/job.store"; import { cronJobStore } from "../+workloads-cronjobs/cronjob.store"; -import { WorkloadsOverviewDetailRegistry } from "../../../extensions/registries"; import type { WorkloadsOverviewRouteParams } from "../../../common/routes"; -import { makeObservable, observable, reaction } from "mobx"; +import { IComputedValue, makeObservable, observable, reaction } from "mobx"; import { NamespaceSelectFilter } from "../+namespaces/namespace-select-filter"; import { Icon } from "../icon"; import { TooltipPosition } from "../tooltip"; @@ -30,11 +29,13 @@ import type { KubeObject } from "../../../common/k8s-api/kube-object"; import type { Disposer } from "../../../common/utils"; import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable"; import type { KubeWatchSubscribeStoreOptions } from "../../kube-watch-api/kube-watch-api"; +import detailComponentsInjectable from "./detail-components.injectable"; export interface WorkloadsOverviewProps extends RouteComponentProps { } interface Dependencies { + detailComponents: IComputedValue[]>; clusterFrameContext: ClusterFrameContext; subscribeStores: (stores: KubeObjectStore[], options: KubeWatchSubscribeStoreOptions) => Disposer; } @@ -91,13 +92,6 @@ class NonInjectedWorkloadsOverview extends React.Component ( -
- )); - return (
@@ -105,7 +99,10 @@ class NonInjectedWorkloadsOverview extends React.Component
- {items} + + {this.props.detailComponents.get().map((Details, index) => ( +
+ ))}
); } @@ -116,6 +113,7 @@ export const WorkloadsOverview = withInjectables ({ + detailComponents: di.inject(detailComponentsInjectable), clusterFrameContext: di.inject(clusterFrameContextInjectable), subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores, ...props, diff --git a/src/renderer/components/+workloads-overview/workloads-overview-detail-registration.ts b/src/renderer/components/+workloads-overview/workloads-overview-detail-registration.ts new file mode 100644 index 0000000000..19e59494da --- /dev/null +++ b/src/renderer/components/+workloads-overview/workloads-overview-detail-registration.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +interface WorkloadsOverviewDetailComponents { + Details: React.ComponentType<{}>; +} + +export interface WorkloadsOverviewDetailRegistration { + components: WorkloadsOverviewDetailComponents; + priority?: number; +} diff --git a/src/renderer/initializers/index.ts b/src/renderer/initializers/index.ts index 11c318090c..b6b458a8eb 100644 --- a/src/renderer/initializers/index.ts +++ b/src/renderer/initializers/index.ts @@ -9,5 +9,4 @@ export * from "./entity-settings-registry"; export * from "./ipc"; export * from "./kube-object-detail-registry"; export * from "./registries"; -export * from "./workloads-overview-detail-registry"; export * from "./catalog-category-registry"; diff --git a/src/renderer/initializers/registries.ts b/src/renderer/initializers/registries.ts index 2f19e758b5..7362bdfbd7 100644 --- a/src/renderer/initializers/registries.ts +++ b/src/renderer/initializers/registries.ts @@ -12,5 +12,4 @@ export function initRegistries() { registries.EntitySettingRegistry.createInstance(); registries.GlobalPageRegistry.createInstance(); registries.KubeObjectDetailRegistry.createInstance(); - registries.WorkloadsOverviewDetailRegistry.createInstance(); } diff --git a/src/renderer/initializers/workloads-overview-detail-registry.tsx b/src/renderer/initializers/workloads-overview-detail-registry.tsx deleted file mode 100644 index 5654281b6b..0000000000 --- a/src/renderer/initializers/workloads-overview-detail-registry.tsx +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { WorkloadsOverviewDetailRegistry } from "../../extensions/registries"; -import { OverviewStatuses } from "../components/+workloads-overview/overview-statuses"; -import { WorkloadEvents } from "./workload-events"; - -export function initWorkloadsOverviewDetailRegistry() { - WorkloadsOverviewDetailRegistry.getInstance() - .add([ - { - components: { - Details: OverviewStatuses, - }, - }, - { - priority: 5, - components: { - Details: WorkloadEvents, - }, - }, - ]); -} From 769a9441f8821f3e394542301c0c6dd372b323be Mon Sep 17 00:00:00 2001 From: Dmitriy Noa Date: Fri, 4 Mar 2022 10:09:15 +0100 Subject: [PATCH 06/21] Fix unselect. Add unit tests (#4961) * Fix unselect. Add unit tests Signed-off-by: DmitriyNoa * Cleanup Signed-off-by: DmitriyNoa * Add additional test for undefined Signed-off-by: DmitriyNoa --- .../components/select/select.test.tsx | 157 ++++++++++++++++++ src/renderer/components/select/select.tsx | 2 +- 2 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 src/renderer/components/select/select.test.tsx diff --git a/src/renderer/components/select/select.test.tsx b/src/renderer/components/select/select.test.tsx new file mode 100644 index 0000000000..157156e02a --- /dev/null +++ b/src/renderer/components/select/select.test.tsx @@ -0,0 +1,157 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import React from "react"; +import "@testing-library/jest-dom/extend-expect"; +import { Select } from "./select"; +import { UserStore } from "../../../common/user-store"; +import { ThemeStore } from "../../theme.store"; +import { getDiForUnitTesting } from "../../getDiForUnitTesting"; +import type { DiContainer } from "@ogre-tools/injectable"; +import { DiRender, renderFor } from "../test-utils/renderFor"; +import mockFs from "mock-fs"; +import directoryForUserDataInjectable + from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import rendererExtensionsInjectable from "../../../extensions/renderer-extensions.injectable"; +import { computed } from "mobx"; +import type { LensRendererExtension } from "../../../extensions/lens-renderer-extension"; + + +describe("); + + expect(container).toBeInstanceOf(HTMLElement); + }); + + it("should show selected option", async () => { + const options = [ + { + label: "Option one label", + value: "optionOneValue", + }, + { + label: "Option two label", + value: "optionTwoValue", + }, + ]; + + const onChange = jest.fn(); + + const { container } = render(); + const selectedValueContainer = container.querySelector(".Select__single-value"); + + expect(selectedValueContainer.textContent).toBe(options[0].label); + + rerender(); + const selectedValueContainer = container.querySelector(".Select__single-value"); + + expect(selectedValueContainer.textContent).toBe(options[0].label); + + rerender(); + const selectedValueContainer = container.querySelector(".Select__single-value"); + + expect(selectedValueContainer.textContent).toBe(options[0].label); + + rerender( userStore.colorTheme = value} themeName="lens" diff --git a/src/renderer/components/dock/__test__/dock-tabs.test.tsx b/src/renderer/components/dock/__test__/dock-tabs.test.tsx index 4be169bf7f..e3c6218909 100644 --- a/src/renderer/components/dock/__test__/dock-tabs.test.tsx +++ b/src/renderer/components/dock/__test__/dock-tabs.test.tsx @@ -33,6 +33,10 @@ jest.mock("electron", () => ({ on: jest.fn(), handle: jest.fn(), }, + ipcRenderer: { + on: jest.fn(), + invoke: jest.fn(), + }, })); const initialTabs: DockTab[] = [ diff --git a/src/renderer/components/dock/logs/__test__/log-resource-selector.test.tsx b/src/renderer/components/dock/logs/__test__/log-resource-selector.test.tsx index b5923b98a0..e4479ff783 100644 --- a/src/renderer/components/dock/logs/__test__/log-resource-selector.test.tsx +++ b/src/renderer/components/dock/logs/__test__/log-resource-selector.test.tsx @@ -36,6 +36,10 @@ jest.mock("electron", () => ({ on: jest.fn(), handle: jest.fn(), }, + ipcRenderer: { + on: jest.fn(), + invoke: jest.fn(), + }, })); function mockLogTabViewModel(tabId: TabId, deps: Partial): LogTabViewModel { diff --git a/src/renderer/components/hotbar/__tests__/hotbar-remove-command.test.tsx b/src/renderer/components/hotbar/__tests__/hotbar-remove-command.test.tsx index ddfc2a949e..9de6a310e3 100644 --- a/src/renderer/components/hotbar/__tests__/hotbar-remove-command.test.tsx +++ b/src/renderer/components/hotbar/__tests__/hotbar-remove-command.test.tsx @@ -26,6 +26,13 @@ const mockHotbars: { [id: string]: any } = { }, }; +jest.mock("electron", () => ({ + ipcRenderer: { + on: jest.fn(), + invoke: jest.fn(), + }, +})); + describe("", () => { let di: DiContainer; let render: DiRender; diff --git a/src/renderer/components/select/select.test.tsx b/src/renderer/components/select/select.test.tsx index 157156e02a..6374199ea0 100644 --- a/src/renderer/components/select/select.test.tsx +++ b/src/renderer/components/select/select.test.tsx @@ -17,6 +17,12 @@ import rendererExtensionsInjectable from "../../../extensions/renderer-extension import { computed } from "mobx"; import type { LensRendererExtension } from "../../../extensions/lens-renderer-extension"; +jest.mock("electron", () => ({ + ipcRenderer: { + on: jest.fn(), + invoke: jest.fn(), + }, +})); describe(" { - console.info("WEBPACK:main", vars); + console.info("WEBPACK:main", { ...vars }); const { mainDir, buildDir, isDevelopment } = vars; return { diff --git a/webpack.renderer.ts b/webpack.renderer.ts index c7865aa7aa..7b21f9214e 100755 --- a/webpack.renderer.ts +++ b/webpack.renderer.ts @@ -16,7 +16,7 @@ import ReactRefreshWebpackPlugin from "@pmmmwh/react-refresh-webpack-plugin"; export function webpackLensRenderer({ showVars = true } = {}): webpack.Configuration { if (showVars) { - console.info("WEBPACK:renderer", vars); + console.info("WEBPACK:renderer", { ...vars }); } const assetsFolderName = "assets"; diff --git a/yarn.lock b/yarn.lock index 3cb00503a9..9c51fff5d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1361,6 +1361,13 @@ dependencies: "@types/node" "*" +"@types/cli-progress@^3.9.2": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.9.2.tgz#6ca355f96268af39bee9f9307f0ac96145639c26" + integrity sha512-VO5/X5Ij+oVgEVjg5u0IXVe3JQSKJX+Ev8C5x+0hPy0AuWyW+bF8tbajR7cPFnDGhs7pidztcac+ccrDtk5teA== + dependencies: + "@types/node" "*" + "@types/color-convert@*": version "1.9.0" resolved "https://registry.yarnpkg.com/@types/color-convert/-/color-convert-1.9.0.tgz#bfa8203e41e7c65471e9841d7e306a7cd8b5172d" @@ -1491,6 +1498,13 @@ dependencies: "@types/node" "*" +"@types/gunzip-maybe@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@types/gunzip-maybe/-/gunzip-maybe-1.4.0.tgz#9410fd15ff68eca8907b7b9198e63e2a7c14d511" + integrity sha512-dFP9GrYAR9KhsjTkWJ8q8Gsfql75YIKcg9DuQOj/IrlPzR7W+1zX+cclw1McV82UXAQ+Lpufvgk3e9bC8+HzgA== + dependencies: + "@types/node" "*" + "@types/history@*", "@types/history@^4.7.8": version "4.7.8" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" @@ -1956,6 +1970,13 @@ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== +"@types/tar-stream@^2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@types/tar-stream/-/tar-stream-2.2.2.tgz#be9d0be9404166e4b114151f93e8442e6ab6fb1d" + integrity sha512-1AX+Yt3icFuU6kxwmPakaiGrJUwG44MpuiqPg4dSolRFk6jmvs4b3IbUol9wKDLIgU76gevn3EwE8y/DkSJCZQ== + dependencies: + "@types/node" "*" + "@types/tar@^4.0.3", "@types/tar@^4.0.5": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/tar/-/tar-4.0.5.tgz#5f953f183e36a15c6ce3f336568f6051b7b183f3" @@ -3158,6 +3179,13 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + integrity sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0= + dependencies: + pako "~0.2.0" + browserslist@^4.14.5: version "4.19.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" @@ -3608,6 +3636,13 @@ cli-columns@^3.1.2: string-width "^2.0.0" strip-ansi "^3.0.1" +cli-progress@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.10.0.tgz#63fd9d6343c598c93542fdfa3563a8b59887d78a" + integrity sha512-kLORQrhYCAtUPLZxqsAt2YJGOvRdt34+O6jl5cQGb7iF3dM55FQZlTR+rQyIK9JUcO9bBMwZsTlND+3dmFU2Cw== + dependencies: + string-width "^4.2.0" + cli-table3@^0.5.0, cli-table3@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -4748,7 +4783,7 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -duplexify@^3.4.2, duplexify@^3.6.0: +duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== @@ -6515,6 +6550,18 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +gunzip-maybe@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz#b913564ae3be0eda6f3de36464837a9cd94b98ac" + integrity sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw== + dependencies: + browserify-zlib "^0.1.4" + is-deflate "^1.0.0" + is-gzip "^1.0.0" + peek-stream "^1.1.0" + pumpify "^1.3.3" + through2 "^2.0.3" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -7236,6 +7283,11 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== +is-deflate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-deflate/-/is-deflate-1.0.0.tgz#c862901c3c161fb09dac7cdc7e784f80e98f2f14" + integrity sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ= + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -7315,6 +7367,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-gzip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" + integrity sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM= + is-in-browser@^1.0.2, is-in-browser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" @@ -10252,6 +10309,11 @@ pacote@^9.1.0, pacote@^9.5.12, pacote@^9.5.3: unique-filename "^1.1.1" which "^1.3.1" +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= + pako@~1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -10390,6 +10452,15 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +peek-stream@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.3.tgz#3b35d84b7ccbbd262fff31dc10da56856ead6d67" + integrity sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA== + dependencies: + buffer-from "^1.0.0" + duplexify "^3.5.0" + through2 "^2.0.3" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -12670,7 +12741,7 @@ tar-fs@^2.0.0, tar-fs@^2.1.1: pump "^3.0.0" tar-stream "^2.1.4" -tar-stream@^2.1.4: +tar-stream@^2.1.4, tar-stream@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -12808,7 +12879,7 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -through2@^2.0.0: +through2@^2.0.0, through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== From 070ef31220cf8079552f85f5507260156ede3f09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Mar 2022 13:47:21 +0300 Subject: [PATCH 12/21] Bump follow-redirects from 1.14.7 to 1.14.8 (#4857) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.7 to 1.14.8. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.7...v1.14.8) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9c51fff5d6..45c1789479 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6047,9 +6047,9 @@ fn.name@1.x.x: integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.0.0: - version "1.14.7" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" - integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== + version "1.14.8" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc" + integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA== for-in@^1.0.2: version "1.0.2" From aaad9262ed4a0e6dfd4ef96ad7ad4638215167c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Mar 2022 13:53:34 +0300 Subject: [PATCH 13/21] Bump url-parse from 1.5.3 to 1.5.10 (#4921) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.10. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.10) --- updated-dependencies: - dependency-name: url-parse dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index bf4467785e..87bf5c2438 100644 --- a/package.json +++ b/package.json @@ -261,7 +261,7 @@ "tar": "^6.1.11", "tcp-port-used": "^1.0.2", "tempy": "1.0.1", - "url-parse": "^1.5.3", + "url-parse": "^1.5.10", "uuid": "^8.3.2", "win-ca": "^3.4.5", "winston": "^3.3.3", diff --git a/yarn.lock b/yarn.lock index 45c1789479..269a1dd9ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13451,10 +13451,10 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" - integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== +url-parse@^1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" From a37bcf36b254e6ce57ce861aa5ed01c58b32a0b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Mar 2022 13:57:09 +0300 Subject: [PATCH 14/21] Bump simple-get from 4.0.0 to 4.0.1 (#4772) Bumps [simple-get](https://github.com/feross/simple-get) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/feross/simple-get/releases) - [Commits](https://github.com/feross/simple-get/compare/v4.0.0...v4.0.1) --- updated-dependencies: - dependency-name: simple-get dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 269a1dd9ec..1f65141cb6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12041,9 +12041,9 @@ simple-concat@^1.0.0: integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.0.tgz#73fa628278d21de83dadd5512d2cc1f4872bd675" - integrity sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== dependencies: decompress-response "^6.0.0" once "^1.3.1" From 65ba094d97d620af6bd0689aaa3cc3913162f7e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Mar 2022 14:47:54 +0300 Subject: [PATCH 15/21] Bump nanoid from 3.1.30 to 3.2.0 (#4736) Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.30 to 3.2.0. - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](https://github.com/ai/nanoid/compare/3.1.30...3.2.0) --- updated-dependencies: - dependency-name: nanoid dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1f65141cb6..0abca06a20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9367,9 +9367,9 @@ nan@^2.14.0: integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== nanoid@^3.1.30: - version "3.1.30" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" - integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== nanomatch@^1.2.9: version "1.2.13" From 8b6f8e5dc39e29f7b9b9a0022658ceeecb6184fc Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 10 Mar 2022 07:06:47 -0500 Subject: [PATCH 16/21] Fix HelmChart validator requiring digest field (#4920) * Fix HelmChart validator requiring digest field Signed-off-by: Sebastian Malton * fix tests Signed-off-by: Sebastian Malton --- .../k8s-api/__tests__/helm-charts.api.test.ts | 15 ++++++++------- .../k8s-api/endpoints/helm-charts.api.ts | 18 +++++++++++------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/common/k8s-api/__tests__/helm-charts.api.test.ts b/src/common/k8s-api/__tests__/helm-charts.api.test.ts index dbe477d333..283c5168f5 100644 --- a/src/common/k8s-api/__tests__/helm-charts.api.test.ts +++ b/src/common/k8s-api/__tests__/helm-charts.api.test.ts @@ -36,13 +36,6 @@ describe("HelmChart tests", () => { version: "!", repo: "!", } as any)).toThrowError('"created" is required'); - expect(() => HelmChart.create({ - apiVersion: "!", - name: "!", - version: "!", - repo: "!", - created: "!", - } as any)).toThrowError('"digest" is required'); }); it("should throw on fields being wrong type", () => { @@ -62,6 +55,14 @@ describe("HelmChart tests", () => { created: "!", digest: "!", } as any)).toThrowError('"name" must be a string'); + expect(() => HelmChart.create({ + apiVersion: "!", + name: "!", + version: "!", + repo: "!", + created: "!", + digest: 1, + } as any)).toThrowError('"digest" must be a string'); expect(() => HelmChart.create({ apiVersion: "1", name: "", diff --git a/src/common/k8s-api/endpoints/helm-charts.api.ts b/src/common/k8s-api/endpoints/helm-charts.api.ts index b73bcfdaf2..163f90ef36 100644 --- a/src/common/k8s-api/endpoints/helm-charts.api.ts +++ b/src/common/k8s-api/endpoints/helm-charts.api.ts @@ -75,7 +75,7 @@ export interface RawHelmChart { version: string; repo: string; created: string; - digest: string; + digest?: string; kubeVersion?: string; description?: string; home?: string; @@ -142,7 +142,7 @@ const helmChartValidator = Joi.object({ .required(), digest: Joi .string() - .required(), + .optional(), kubeVersion: Joi .string() .optional(), @@ -247,22 +247,22 @@ export interface HelmChart { name: string; version: string; repo: string; - kubeVersion?: string; created: string; description: string; - digest: string; keywords: string[]; - home?: string; sources: string[]; urls: string[]; annotations: Record; dependencies: HelmChartDependency[]; maintainers: HelmChartMaintainer[]; + deprecated: boolean; + kubeVersion?: string; + digest?: string; + home?: string; engine?: string; icon?: string; appVersion?: string; type?: string; - deprecated: boolean; tillerVersion?: string; } @@ -324,7 +324,11 @@ export class HelmChart { } getId(): string { - return `${this.repo}:${this.apiVersion}/${this.name}@${this.getAppVersion()}+${this.digest}`; + const digestPart = this.digest + ? `+${this.digest}` + : ""; + + return `${this.repo}:${this.apiVersion}/${this.name}@${this.getAppVersion()}${digestPart}`; } getName(): string { From 98235d17acd2774274b89c85528b52991820941c Mon Sep 17 00:00:00 2001 From: Jim Ehrismann <40840436+jim-docker@users.noreply.github.com> Date: Thu, 10 Mar 2022 09:05:05 -0500 Subject: [PATCH 17/21] fixed non-virtual list row rendering (#4983) --- .../components/item-object-list/content.tsx | 114 ++++++++++-------- 1 file changed, 62 insertions(+), 52 deletions(-) diff --git a/src/renderer/components/item-object-list/content.tsx b/src/renderer/components/item-object-list/content.tsx index 69f72cffb7..eb7b5dedb2 100644 --- a/src/renderer/components/item-object-list/content.tsx +++ b/src/renderer/components/item-object-list/content.tsx @@ -68,67 +68,76 @@ export class ItemListLayoutContent extends React.Component return this.props.store.failedLoading; } + @boundMethod + renderRow(item: I) { + return this.getTableRow(item); + } + + getTableRow(item: I) { + const { + isSelectable, renderTableHeader, renderTableContents, renderItemMenu, + store, hasDetailsView, onDetails, + copyClassNameFromHeadCells, customizeTableRowProps, detailsItem, + } = this.props; + const { isSelected } = store; + + return ( + onDetails(item)) : undefined} + {...customizeTableRowProps(item)} + > + {isSelectable && ( + store.toggleSelection(item))} + /> + )} + {renderTableContents(item).map((content, index) => { + const cellProps: TableCellProps = isReactNode(content) + ? { children: content } + : content; + const headCell = renderTableHeader?.[index]; + + if (copyClassNameFromHeadCells && headCell) { + cellProps.className = cssNames( + cellProps.className, + headCell.className, + ); + } + + if (!headCell || this.showColumn(headCell)) { + return ; + } + + return null; + })} + {renderItemMenu && ( + +
+ {renderItemMenu(item, store)} +
+
+ )} +
+ ); + } + @boundMethod getRow(uid: string) { return (
{() => { - const { - isSelectable, renderTableHeader, renderTableContents, renderItemMenu, - store, hasDetailsView, onDetails, - copyClassNameFromHeadCells, customizeTableRowProps, detailsItem, - } = this.props; - const { isSelected } = store; - const item = this.props.getItems().find(item => item.getId() == uid); + const item = this.props.getItems().find(item => item.getId() === uid); if (!item) return null; - const itemId = item.getId(); - return ( - onDetails(item)) : undefined} - {...customizeTableRowProps(item)} - > - {isSelectable && ( - store.toggleSelection(item))} - /> - )} - {renderTableContents(item).map((content, index) => { - const cellProps: TableCellProps = isReactNode(content) - ? { children: content } - : content; - const headCell = renderTableHeader?.[index]; - - if (copyClassNameFromHeadCells && headCell) { - cellProps.className = cssNames( - cellProps.className, - headCell.className, - ); - } - - if (!headCell || this.showColumn(headCell)) { - return ; - } - - return null; - })} - {renderItemMenu && ( - -
- {renderItemMenu(item, store)} -
-
- )} -
- ); + return this.getTableRow(item); }}
@@ -248,6 +257,7 @@ export class ItemListLayoutContent extends React.Component selectable={hasDetailsView} sortable={sortingCallbacks} getTableRow={this.getRow} + renderRow={virtual ? undefined : this.renderRow} items={items} selectedItemId={selectedItemId} noItems={this.renderNoItems()} From bba3199bb51c4381a8c44be42501747abab13fcf Mon Sep 17 00:00:00 2001 From: Jim Ehrismann <40840436+jim-docker@users.noreply.github.com> Date: Thu, 10 Mar 2022 11:08:31 -0500 Subject: [PATCH 18/21] Remove listener for online event (#4970) --- .../cluster-frame/init-cluster-frame/init-cluster-frame.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts b/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts index 97f2f40565..4fe1081c02 100644 --- a/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts +++ b/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts @@ -75,10 +75,6 @@ export const initClusterFrame = }); }); - window.addEventListener("online", () => { - window.location.reload(); - }); - window.onbeforeunload = () => { logger.info( `${logPrefix} Unload dashboard, clusterId=${(hostedCluster.id)}, frameId=${frameRoutingId}`, From e9c2f273c85a184a6dcf74db40bee49bfaf6897d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Mar 2022 15:05:52 -0500 Subject: [PATCH 19/21] Bump type-fest from 1.0.2 to 1.4.0 (#4985) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 87bf5c2438..343db3c77b 100644 --- a/package.json +++ b/package.json @@ -390,7 +390,7 @@ "ts-jest": "26.5.6", "ts-loader": "^9.2.6", "ts-node": "^10.4.0", - "type-fest": "^1.0.2", + "type-fest": "^1.4.0", "typed-emitter": "^1.4.0", "typedoc": "0.22.10", "typedoc-plugin-markdown": "^3.11.12", diff --git a/yarn.lock b/yarn.lock index 0abca06a20..b3d38b9879 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13193,10 +13193,10 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.0.2.tgz#3f9c39982859f385c77c38b7e5f1432b8a3661c6" - integrity sha512-a720oz3Kjbp3ll0zkeN9qjRhO7I34MKMhPGQiQJAmaZQZQ1lo+NWThK322f7sXV+kTg9B1Ybt16KgBXWgteT8w== +type-fest@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== type-is@~1.6.18: version "1.6.18" From 613d10754578c1d6f642b665983d9a4708e7c9d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Mar 2022 15:11:32 -0500 Subject: [PATCH 20/21] Bump @sentry/types from 6.15.0 to 6.18.2 (#4981) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 343db3c77b..5d09591f28 100644 --- a/package.json +++ b/package.json @@ -275,7 +275,7 @@ "@material-ui/icons": "^4.11.2", "@material-ui/lab": "^4.0.0-alpha.60", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.4", - "@sentry/types": "^6.14.1", + "@sentry/types": "^6.18.2", "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^11.2.7", "@testing-library/user-event": "^13.5.0", diff --git a/yarn.lock b/yarn.lock index b3d38b9879..c7c1ba7644 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1083,7 +1083,7 @@ "@sentry/utils" "6.7.1" tslib "^1.9.3" -"@sentry/types@6.15.0", "@sentry/types@^6.14.1": +"@sentry/types@6.15.0": version "6.15.0" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.15.0.tgz#a2917f8aed91471bdfd6651384ffcd47b95c43ad" integrity sha512-zBw5gPUsofXUSpS3ZAXqRNedLRBvirl3sqkj2Lez7X2EkKRgn5D8m9fQIrig/X3TsKcXUpijDW5Buk5zeCVzJA== @@ -1093,6 +1093,11 @@ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.7.1.tgz#c8263e1886df5e815570c4668eb40a1cfaa1c88b" integrity sha512-9AO7HKoip2MBMNQJEd6+AKtjj2+q9Ze4ooWUdEvdOVSt5drg7BGpK221/p9JEOyJAZwEPEXdcMd3VAIMiOb4MA== +"@sentry/types@^6.18.2": + version "6.18.2" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.18.2.tgz#f528fec8b75c19d5a6976004e71703184c6cf7be" + integrity sha512-WzpJf/Q5aORTzrSwer/As1NlO90dBAQpaHV2ikDDKqOyMWEgjKb5/4gh59p9gH8JMMnLetP1AvQel0fOj5UnUw== + "@sentry/utils@6.15.0": version "6.15.0" resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.15.0.tgz#0c247cb092b1796d39c3d16d8e6977b9cdab9ca2" From 772e879b8181f0e7431286146e8f1f5f3f183656 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Fri, 11 Mar 2022 00:13:22 +0300 Subject: [PATCH 21/21] Fix "logs from" date (#4987) --- src/renderer/components/dock/logs/controls.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/dock/logs/controls.tsx b/src/renderer/components/dock/logs/controls.tsx index 59aead384b..159b135435 100644 --- a/src/renderer/components/dock/logs/controls.tsx +++ b/src/renderer/components/dock/logs/controls.tsx @@ -58,7 +58,7 @@ const NonInjectedLogControls = observer(({ openSaveFileDialog, model }: Dependen {since && ( Logs from{" "} - {new Date(since[0]).toLocaleString()} + {new Date(since).toLocaleString()} )}