From 74f3826235799f3bf9b73abc5ea56cda2119881a Mon Sep 17 00:00:00 2001 From: Juho Heikka Date: Wed, 15 Sep 2021 15:48:12 +0300 Subject: [PATCH 01/88] Second click on list item closes the details view (#3809) Signed-off-by: Juho Heikka --- .../components/+apps-helm-charts/helm-charts.tsx | 10 +++++++++- src/renderer/components/+apps-releases/releases.tsx | 10 +++++++++- src/renderer/components/+catalog/catalog.tsx | 6 +++++- src/renderer/components/+cluster/cluster-issues.tsx | 4 ++-- src/renderer/components/kube-detail-params/params.ts | 10 ++++++++++ .../kube-object-list-layout.tsx | 4 ++-- 6 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/renderer/components/+apps-helm-charts/helm-charts.tsx b/src/renderer/components/+apps-helm-charts/helm-charts.tsx index 8a47654adc..da5f9f8c5a 100644 --- a/src/renderer/components/+apps-helm-charts/helm-charts.tsx +++ b/src/renderer/components/+apps-helm-charts/helm-charts.tsx @@ -55,6 +55,14 @@ export class HelmCharts extends Component { return helmChartStore.getByName(chartName, repo); } + onDetails = (chart: HelmChart) => { + if (chart === this.selectedChart) { + this.hideDetails(); + } else { + this.showDetails(chart); + } + }; + showDetails = (chart: HelmChart) => { if (!chart) { navigation.push(helmChartsURL()); @@ -121,7 +129,7 @@ export class HelmCharts extends Component { { className: "menu" } ]} detailsItem={this.selectedChart} - onDetails={this.showDetails} + onDetails={this.onDetails} /> {this.selectedChart && ( { }); } + onDetails = (item: HelmRelease) => { + if (item === this.selectedRelease) { + this.hideDetails(); + } else { + this.showDetails(item); + } + }; + showDetails = (item: HelmRelease) => { navigation.push(releaseURL({ params: { @@ -169,7 +177,7 @@ export class HelmReleases extends Component { message: this.renderRemoveDialogMessage(selectedItems) })} detailsItem={this.selectedRelease} - onDetails={this.showDetails} + onDetails={this.onDetails} /> { } onDetails = (item: CatalogEntityItem) => { - this.catalogEntityStore.selectedItemId = item.getId(); + if (this.catalogEntityStore.selectedItemId === item.getId()) { + this.catalogEntityStore.selectedItemId = null; + } else { + this.catalogEntityStore.selectedItemId = item.getId(); + } }; onMenuItemClick(menuItem: CatalogEntityContextMenu) { diff --git a/src/renderer/components/+cluster/cluster-issues.tsx b/src/renderer/components/+cluster/cluster-issues.tsx index 9b5f73b9a6..fb5b98bc28 100644 --- a/src/renderer/components/+cluster/cluster-issues.tsx +++ b/src/renderer/components/+cluster/cluster-issues.tsx @@ -33,7 +33,7 @@ import { boundMethod, cssNames, prevDefault } from "../../utils"; import type { ItemObject } from "../../../common/item.store"; import { Spinner } from "../spinner"; import { ThemeStore } from "../../theme.store"; -import { kubeSelectedUrlParam, showDetails } from "../kube-detail-params"; +import { kubeSelectedUrlParam, toggleDetails } from "../kube-detail-params"; import { kubeWatchApi } from "../../../common/k8s-api/kube-watch-api"; import { apiManager } from "../../../common/k8s-api/api-manager"; @@ -124,7 +124,7 @@ export class ClusterIssues extends React.Component { key={getId()} sortItem={warning} selected={selfLink === kubeSelectedUrlParam.get()} - onClick={prevDefault(() => showDetails(selfLink))} + onClick={prevDefault(() => toggleDetails(selfLink))} > {message} diff --git a/src/renderer/components/kube-detail-params/params.ts b/src/renderer/components/kube-detail-params/params.ts index 09256077d0..856f4968a6 100644 --- a/src/renderer/components/kube-detail-params/params.ts +++ b/src/renderer/components/kube-detail-params/params.ts @@ -41,6 +41,16 @@ export const kubeSelectedUrlParam = createPageParam({ } }); +export function toggleDetails(selfLink: string, resetSelected = true) { + const current = kubeSelectedUrlParam.get() === selfLink; + + if (current) { + hideDetails(); + } else { + showDetails(selfLink, resetSelected); + } +} + export function showDetails(selfLink = "", resetSelected = true) { const detailsUrl = getDetailsUrl(selfLink, resetSelected); diff --git a/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx b/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx index d55e30b28f..cefcc4b0f2 100644 --- a/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx +++ b/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx @@ -31,7 +31,7 @@ import { kubeWatchApi } from "../../../common/k8s-api/kube-watch-api"; import { clusterContext } from "../context"; import { NamespaceSelectFilter } from "../+namespaces/namespace-select-filter"; import { ResourceKindMap, ResourceNames } from "../../utils/rbac"; -import { kubeSelectedUrlParam, showDetails } from "../kube-detail-params"; +import { kubeSelectedUrlParam, toggleDetails } from "../kube-detail-params"; export interface KubeObjectListLayoutProps extends ItemListLayoutProps { store: KubeObjectStore; @@ -39,7 +39,7 @@ export interface KubeObjectListLayoutProps extends ItemLis } const defaultProps: Partial> = { - onDetails: (item: KubeObject) => showDetails(item.selfLink), + onDetails: (item: KubeObject) => toggleDetails(item.selfLink), }; @observer From e0a2cea27d1c8123f6cf656da6d544b5c52642f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Sep 2021 16:02:41 +0300 Subject: [PATCH 02/88] Bump mobx-react from 7.1.0 to 7.2.0 (#3727) Bumps [mobx-react](https://github.com/mobxjs/mobx) from 7.1.0 to 7.2.0. - [Release notes](https://github.com/mobxjs/mobx/releases) - [Commits](https://github.com/mobxjs/mobx/compare/mobx-react@7.1.0...mobx-react@7.2.0) --- updated-dependencies: - dependency-name: mobx-react dependency-type: direct:production update-type: version-update:semver-minor ... 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 ef59d10728..dd1923142c 100644 --- a/package.json +++ b/package.json @@ -216,7 +216,7 @@ "md5-file": "^5.0.0", "mobx": "^6.3.0", "mobx-observable-history": "^2.0.1", - "mobx-react": "^7.1.0", + "mobx-react": "^7.2.0", "mock-fs": "^4.14.0", "moment": "^2.29.1", "moment-timezone": "^0.5.33", diff --git a/yarn.lock b/yarn.lock index 3f24e65868..24fa440087 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9715,10 +9715,10 @@ mobx-react-lite@^3.2.0: resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.2.0.tgz#331d7365a6b053378dfe9c087315b4e41c5df69f" integrity sha512-q5+UHIqYCOpBoFm/PElDuOhbcatvTllgRp3M1s+Hp5j0Z6XNgDbgqxawJ0ZAUEyKM8X1zs70PCuhAIzX1f4Q/g== -mobx-react@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-7.1.0.tgz#d947cada3cfad294b4b6f692e969c242b9c16eaf" - integrity sha512-DxvA6VXmnZ+N9f/UTtolWtdRnAAQY2iHWTSPLktfpj8NKlXUe4dabBAjuXrBcZUM8GjLWnxD1ZEjssXq1M0RAw== +mobx-react@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-7.2.0.tgz#241e925e963bb83a31d269f65f9f379e37ecbaeb" + integrity sha512-KHUjZ3HBmZlNnPd1M82jcdVsQRDlfym38zJhZEs33VxyVQTvL77hODCArq6+C1P1k/6erEeo2R7rpE7ZeOL7dg== dependencies: mobx-react-lite "^3.2.0" From 07d8d567deb1dd1383a1e59a0af2a9be998b7883 Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Wed, 15 Sep 2021 16:36:19 +0300 Subject: [PATCH 03/88] Fix fallback to bundled kubectl (#3812) --- src/main/kubectl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kubectl.ts b/src/main/kubectl.ts index fbfd044dab..4695e8272e 100644 --- a/src/main/kubectl.ts +++ b/src/main/kubectl.ts @@ -275,7 +275,7 @@ export class Kubectl { return false; }); - isValid = !await this.checkBinary(this.path, false); + isValid = await this.checkBinary(this.path, false); } if (!isValid) { From f68cbabbc904df3a0431ade4d2d6a1c34fa63b50 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 15 Sep 2021 12:19:15 -0400 Subject: [PATCH 04/88] Fix cluster's accessibleNamespaces being reset on restarting Lens (#3817) Signed-off-by: Sebastian Malton --- src/common/catalog-entities/kubernetes-cluster.ts | 1 + src/main/cluster-manager.ts | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/common/catalog-entities/kubernetes-cluster.ts b/src/common/catalog-entities/kubernetes-cluster.ts index b2ff284069..3335d3803d 100644 --- a/src/common/catalog-entities/kubernetes-cluster.ts +++ b/src/common/catalog-entities/kubernetes-cluster.ts @@ -51,6 +51,7 @@ export interface KubernetesClusterSpec extends CatalogEntitySpec { material?: string; background?: string; }; + accessibleNamespaces?: string[]; } export interface KubernetesClusterMetadata extends CatalogEntityMetadata { diff --git a/src/main/cluster-manager.ts b/src/main/cluster-manager.ts index fdc3bf3e1a..307b4592f1 100644 --- a/src/main/cluster-manager.ts +++ b/src/main/cluster-manager.ts @@ -193,7 +193,10 @@ export class ClusterManager extends Singleton { } else { cluster.kubeConfigPath = entity.spec.kubeconfigPath; cluster.contextName = entity.spec.kubeconfigContext; - cluster.accessibleNamespaces = entity.spec.accessibleNamespaces ?? []; + + if (entity.spec.accessibleNamespace) { + cluster.accessibleNamespaces = entity.spec.accessibleNamespaces; + } this.updateEntityFromCluster(cluster); } From b43086a386bae9bd52a35c8df37ca930931f3e9d Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 15 Sep 2021 12:27:48 -0400 Subject: [PATCH 05/88] Don't change permissions when deleting a cluster (#3798) Signed-off-by: Sebastian Malton --- package.json | 1 - .../delete-cluster-dialog/save-config.ts | 15 ++++----------- yarn.lock | 18 ------------------ 3 files changed, 4 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index dd1923142c..141ec3a5a0 100644 --- a/package.json +++ b/package.json @@ -348,7 +348,6 @@ "jest-canvas-mock": "^2.3.1", "jest-fetch-mock": "^3.0.3", "jest-mock-extended": "^1.0.16", - "json-to-pretty-yaml": "^1.2.2", "make-plural": "^6.2.2", "mini-css-extract-plugin": "^1.6.0", "node-gyp": "7.1.2", diff --git a/src/renderer/components/delete-cluster-dialog/save-config.ts b/src/renderer/components/delete-cluster-dialog/save-config.ts index d9aa03e2a5..536926a6b1 100644 --- a/src/renderer/components/delete-cluster-dialog/save-config.ts +++ b/src/renderer/components/delete-cluster-dialog/save-config.ts @@ -19,25 +19,18 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import type { KubeConfig } from "@kubernetes/client-node"; +import { dumpYaml, KubeConfig } from "@kubernetes/client-node"; import fs from "fs"; -import tempy from "tempy"; import * as lockFile from "proper-lockfile"; -import YAML from "json-to-pretty-yaml"; -import { noop } from "../../utils"; export async function saveKubeconfig(config: KubeConfig, path: string) { - const tmpFilePath = tempy.file(); - try { const release = await lockFile.lock(path); - const contents = YAML.stringify(JSON.parse(config.exportConfig())); + const contents = dumpYaml(JSON.parse(config.exportConfig())); - await fs.promises.writeFile(tmpFilePath, contents); - await fs.promises.rename(tmpFilePath, path); - release(); + await fs.promises.writeFile(path, contents); + await release(); } catch (e) { - await fs.unlink(tmpFilePath, noop); throw new Error(`Failed to acquire lock file.\n${e}`); } } diff --git a/yarn.lock b/yarn.lock index 24fa440087..87a86e853b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8628,14 +8628,6 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json-to-pretty-yaml@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" - integrity sha1-9M0L0KXo/h3yWq9boRiwmf2ZLVs= - dependencies: - remedial "^1.0.7" - remove-trailing-spaces "^1.0.6" - json3@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" @@ -12101,21 +12093,11 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -remedial@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" - integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= -remove-trailing-spaces@^1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz#4354d22f3236374702f58ee373168f6d6887ada7" - integrity sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA== - renderkid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" From 068c78d48d2f35883bdc08ff090bf69bc0a897f2 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 15 Sep 2021 12:28:06 -0400 Subject: [PATCH 06/88] Draggable region on macOS should be the same as the main header (#3800) Signed-off-by: Sebastian Malton --- src/renderer/components/app.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/renderer/components/app.scss b/src/renderer/components/app.scss index 8490f986c8..9d4946cd9f 100755 --- a/src/renderer/components/app.scss +++ b/src/renderer/components/app.scss @@ -39,7 +39,6 @@ --font-weight-normal: 400; --font-weight-bold: 500; --main-layout-header: 40px; - --drag-region-height: 22px; } *, *:before, *:after { @@ -105,7 +104,7 @@ html, body { left: 0; top: 0; width: 100%; - height: var(--drag-region-height); + height: var(--main-layout-header); z-index: 1000; pointer-events: none; } From 056b818cebe42adf997c820803e764e6d01d6b58 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 15 Sep 2021 13:09:57 -0400 Subject: [PATCH 07/88] Fix check for user exec command (#3664) --- package.json | 3 +- src/common/custom-errors.ts | 11 +++--- src/common/kube-helpers.ts | 18 ++++++---- .../components/+add-cluster/add-cluster.scss | 7 ++++ .../components/+add-cluster/add-cluster.tsx | 36 +++++++++++++++---- yarn.lock | 10 +++--- 6 files changed, 62 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 141ec3a5a0..9da0f23cac 100644 --- a/package.json +++ b/package.json @@ -185,6 +185,7 @@ "@kubernetes/client-node": "^0.15.1", "@sentry/electron": "^2.5.0", "@sentry/integrations": "^6.10.0", + "@types/which": "^2.0.1", "abort-controller": "^3.0.0", "array-move": "^3.0.1", "auto-bind": "^4.0.0", @@ -193,7 +194,6 @@ "byline": "^5.0.0", "chalk": "^4.1.0", "chokidar": "^3.4.3", - "command-exists": "1.2.9", "conf": "^7.0.1", "crypto-js": "^4.1.1", "electron-devtools-installer": "^3.2.0", @@ -246,6 +246,7 @@ "tempy": "^0.5.0", "url-parse": "^1.5.1", "uuid": "^8.3.2", + "which": "^2.0.2", "win-ca": "^3.2.0", "winston": "^3.3.3", "winston-console-format": "^1.0.8", diff --git a/src/common/custom-errors.ts b/src/common/custom-errors.ts index 2cbc75ccf0..0016af87ca 100644 --- a/src/common/custom-errors.ts +++ b/src/common/custom-errors.ts @@ -19,15 +19,18 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +import path from "path"; + export class ExecValidationNotFoundError extends Error { - constructor(execPath: string, isAbsolute: boolean) { - super(`User Exec command "${execPath}" not found on host.`); + constructor(execPath: string) { let message = `User Exec command "${execPath}" not found on host.`; - if (!isAbsolute) { + if (!path.isAbsolute(execPath)) { message += ` Please ensure binary is found in PATH or use absolute path to binary in Kubeconfig`; } - this.message = message; + + super(message); + this.name = this.constructor.name; Error.captureStackTrace(this, this.constructor); } diff --git a/src/common/kube-helpers.ts b/src/common/kube-helpers.ts index aff05e68c6..4bd420e7b2 100644 --- a/src/common/kube-helpers.ts +++ b/src/common/kube-helpers.ts @@ -25,11 +25,11 @@ import path from "path"; import os from "os"; import yaml from "js-yaml"; import logger from "../main/logger"; -import commandExists from "command-exists"; import { ExecValidationNotFoundError } from "./custom-errors"; import { Cluster, Context, newClusters, newContexts, newUsers, User } from "@kubernetes/client-node/dist/config_types"; import { resolvePath } from "./utils"; import Joi from "joi"; +import which from "which"; export type KubeConfigValidationOpts = { validateCluster?: boolean; @@ -295,13 +295,17 @@ export function validateKubeConfig(config: KubeConfig, contextName: string, vali // Validate exec command if present if (validateExec && user?.exec) { - const execCommand = user.exec["command"]; - // check if the command is absolute or not - const isAbsolute = path.isAbsolute(execCommand); + try { + which.sync(user.exec.command); - // validate the exec struct in the user object, start with the command field - if (!commandExists.sync(execCommand)) { - return new ExecValidationNotFoundError(execCommand, isAbsolute); + // If this doesn't throw an error it also means that it has found the executable. + } catch (error) { + switch (error?.code) { + case "ENOENT": + return new ExecValidationNotFoundError(user.exec.command); + default: + return error; + } } } diff --git a/src/renderer/components/+add-cluster/add-cluster.scss b/src/renderer/components/+add-cluster/add-cluster.scss index faac757c40..8abb38e9d0 100644 --- a/src/renderer/components/+add-cluster/add-cluster.scss +++ b/src/renderer/components/+add-cluster/add-cluster.scss @@ -50,4 +50,11 @@ display: block; padding-top: 6px; } + + .actions-panel { + .Spinner { + vertical-align: middle; + margin-left: $spacing; + } + } } diff --git a/src/renderer/components/+add-cluster/add-cluster.tsx b/src/renderer/components/+add-cluster/add-cluster.tsx index e987c1d4bb..16a6dec19e 100644 --- a/src/renderer/components/+add-cluster/add-cluster.tsx +++ b/src/renderer/components/+add-cluster/add-cluster.tsx @@ -24,7 +24,7 @@ import "./add-cluster.scss"; import type { KubeConfig } from "@kubernetes/client-node"; import fse from "fs-extra"; import { debounce } from "lodash"; -import { action, computed, observable, makeObservable } from "mobx"; +import { action, computed, observable, makeObservable, runInAction } from "mobx"; import { observer } from "mobx-react"; import path from "path"; import React from "react"; @@ -41,6 +41,7 @@ import { SettingLayout } from "../layout/setting-layout"; import MonacoEditor from "react-monaco-editor"; import { ThemeStore } from "../../theme.store"; import { UserStore } from "../../../common/user-store"; +import { Spinner } from "../spinner"; interface Option { config: KubeConfig; @@ -62,6 +63,7 @@ export class AddCluster extends React.Component { @observable kubeContexts = observable.map(); @observable customConfig = ""; @observable isWaiting = false; + @observable isCheckingInput = false; @observable errorText: string; constructor(props: {}) { @@ -80,14 +82,35 @@ export class AddCluster extends React.Component { ].filter(Boolean); } - @action - refreshContexts = debounce(() => { - const { config, error } = loadConfigFromString(this.customConfig.trim() || "{}"); + _refreshContexts = debounce(() => { + runInAction(() => { + try { + const text = this.customConfig.trim(); - this.kubeContexts.replace(getContexts(config)); - this.errorText = error?.toString(); + if (!text) { + return this.kubeContexts.clear(); + } + + const { config, error } = loadConfigFromString(text); + + this.kubeContexts.replace(getContexts(config)); + this.errorText = error?.toString(); + } catch (error) { + this.kubeContexts.clear(); + this.errorText = error?.toString() || "An error occured"; + } finally { + this.isCheckingInput = false; + } + }); }, 500); + refreshContexts = () => { + // Clear the kubeContexts immediately + this.isCheckingInput = true; + this.kubeContexts.clear(); + this._refreshContexts(); + }; + @action addClusters = async () => { this.isWaiting = true; @@ -145,6 +168,7 @@ export class AddCluster extends React.Component { tooltip={this.kubeContexts.size === 0 || "Paste in at least one cluster to add."} tooltipOverrideDisabled /> + {this.isCheckingInput && } ); diff --git a/yarn.lock b/yarn.lock index 87a86e853b..ce76e9ac72 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2184,6 +2184,11 @@ anymatch "^3.0.0" source-map "^0.6.0" +"@types/which@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/which/-/which-2.0.1.tgz#27ecd67f915b7c3d6ba552135bb1eecd66e63501" + integrity sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ== + "@types/ws@^6.0.1": version "6.0.4" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.4.tgz#7797707c8acce8f76d8c34b370d4645b70421ff1" @@ -4110,11 +4115,6 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -command-exists@1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" From be1a2ebe591cd027321ce8942a38e173046c672a Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 15 Sep 2021 17:40:36 -0400 Subject: [PATCH 08/88] Fix shell connection readiness heuristic (#3795) --- src/renderer/api/terminal-api.ts | 20 ------------------- .../components/dock/terminal.store.ts | 15 ++++++++------ 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/src/renderer/api/terminal-api.ts b/src/renderer/api/terminal-api.ts index 347dfac224..59e248fba5 100644 --- a/src/renderer/api/terminal-api.ts +++ b/src/renderer/api/terminal-api.ts @@ -58,7 +58,6 @@ export class TerminalApi extends WebSocketApi { public onReady = new EventEmitter<[]>(); @observable public isReady = false; - @observable public shellRunCommandsFinished = false; public readonly url: string; constructor(protected options: TerminalApiQuery) { @@ -92,7 +91,6 @@ export class TerminalApi extends WebSocketApi { connect() { this.emitStatus("Connecting ..."); this.onData.addListener(this._onReady, { prepend: true }); - this.onData.addListener(this._onShellRunCommandsFinished); super.connect(this.url); } @@ -109,24 +107,6 @@ export class TerminalApi extends WebSocketApi { this.onReady.removeAllListeners(); } - _onShellRunCommandsFinished = (data: string) => { - if (!data) { - return; - } - - /** - * This is a heuistic for ditermining when a shell has finished executing - * its own rc file (or RunCommands file) such as `.bashrc` or `.zshrc`. - * - * This heuistic assumes that the prompt line of a terminal is a single line - * and ends with a whitespace character. - */ - if (data.match(/\r?\n/) === null && data.match(/\s$/)) { - this.shellRunCommandsFinished = true; - this.onData.removeListener(this._onShellRunCommandsFinished); - } - }; - @boundMethod protected _onReady(data: string) { if (!data) return true; diff --git a/src/renderer/components/dock/terminal.store.ts b/src/renderer/components/dock/terminal.store.ts index dd5251bac2..b5116a94e8 100644 --- a/src/renderer/components/dock/terminal.store.ts +++ b/src/renderer/components/dock/terminal.store.ts @@ -117,15 +117,18 @@ export class TerminalStore extends Singleton { await when(() => this.connections.has(tab.id)); - const rcIsFinished = when(() => this.connections.get(tab.id).shellRunCommandsFinished); + const shellIsReady = when(() => this.connections.get(tab.id).isReady); const notifyVeryLong = setTimeout(() => { - rcIsFinished.cancel(); - Notifications.info("Terminal shell is taking a long time to complete startup. Please check your .rc file. Bypassing shell completion check.", { - timeout: 4_000, - }); + shellIsReady.cancel(); + Notifications.info( + "If terminal shell is not ready please check your shell init files, if applicable.", + { + timeout: 4_000, + }, + ); }, 10_000); - await rcIsFinished.catch(noop); + await shellIsReady.catch(noop); clearTimeout(notifyVeryLong); } From 1ebb8eedf769ddcd73144a553201730275d7d5cc Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 16 Sep 2021 09:02:43 -0400 Subject: [PATCH 09/88] Upgrade all testing linux CI machines to Ubuntu-20.04 (#3799) --- .azure-pipelines-k8s-matrix.yml | 4 ++-- .azure-pipelines.yml | 2 +- .github/workflows/test.yml | 14 ++++---------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/.azure-pipelines-k8s-matrix.yml b/.azure-pipelines-k8s-matrix.yml index 77129460a3..9f1f38ec67 100644 --- a/.azure-pipelines-k8s-matrix.yml +++ b/.azure-pipelines-k8s-matrix.yml @@ -15,7 +15,7 @@ trigger: none jobs: - job: Linux pool: - vmImage: ubuntu-16.04 + vmImage: ubuntu-20.04 strategy: matrix: kube_1.16: @@ -46,7 +46,7 @@ jobs: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube sudo minikube start --driver=none --kubernetes-version $(kubernetes_version) - # Although the kube and minikube config files are in placed $HOME they are owned by root + sudo mv /root/.kube /root/.minikube $HOME sudo chown -R $USER $HOME/.kube $HOME/.minikube displayName: Install integration test dependencies - script: make node_modules diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index 3e1b43f875..e360a818e6 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -109,7 +109,7 @@ jobs: - job: Linux pool: - vmImage: ubuntu-16.04 + vmImage: ubuntu-20.04 strategy: matrix: node_14.x: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b319c97770..25b3327ac0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-16.04, macos-11, windows-2019] + os: [ubuntu-20.04, macos-11, windows-2019] node-version: [14.x] steps: - name: Checkout Release from lens @@ -67,15 +67,9 @@ jobs: - run: make test-extensions name: Run In-tree Extension tests - - run: | - sudo apt-get update - sudo apt-get install libgconf-2-4 conntrack -y - curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 - sudo install minikube-linux-amd64 /usr/local/bin/minikube - sudo minikube start --driver=none - # Although the kube and minikube config files are in placed $HOME they are owned by root - sudo chown -R $USER $HOME/.kube $HOME/.minikube - name: Install integration test dependencies + - name: Install integration test dependencies + id: minikube + uses: medyagh/setup-minikube@5a9a7104d7322fa40424de8855c84685e89cefd7 if: runner.os == 'Linux' - run: xvfb-run --auto-servernum --server-args='-screen 0, 1600x900x24' make integration From e5c9c9a4b5e33369a000df3d3fe0a182bca557ff Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 16 Sep 2021 10:38:31 -0400 Subject: [PATCH 10/88] Fix test GH action to run on all branches (#3822) --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 25b3327ac0..4bc748d235 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,7 @@ name: Test on: pull_request: branches: - - "*" + - "**" push: branches: - master From 53ce818589f394dc131b8787f183b71f98165b13 Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Fri, 17 Sep 2021 11:13:04 +0300 Subject: [PATCH 11/88] Revert "Fix check for user exec command (#3664)" (#3827) This reverts commit 056b818cebe42adf997c820803e764e6d01d6b58. Signed-off-by: Lauri Nevala --- package.json | 3 +- src/common/custom-errors.ts | 11 +++--- src/common/kube-helpers.ts | 18 ++++------ .../components/+add-cluster/add-cluster.scss | 7 ---- .../components/+add-cluster/add-cluster.tsx | 36 ++++--------------- yarn.lock | 10 +++--- 6 files changed, 23 insertions(+), 62 deletions(-) diff --git a/package.json b/package.json index 9da0f23cac..141ec3a5a0 100644 --- a/package.json +++ b/package.json @@ -185,7 +185,6 @@ "@kubernetes/client-node": "^0.15.1", "@sentry/electron": "^2.5.0", "@sentry/integrations": "^6.10.0", - "@types/which": "^2.0.1", "abort-controller": "^3.0.0", "array-move": "^3.0.1", "auto-bind": "^4.0.0", @@ -194,6 +193,7 @@ "byline": "^5.0.0", "chalk": "^4.1.0", "chokidar": "^3.4.3", + "command-exists": "1.2.9", "conf": "^7.0.1", "crypto-js": "^4.1.1", "electron-devtools-installer": "^3.2.0", @@ -246,7 +246,6 @@ "tempy": "^0.5.0", "url-parse": "^1.5.1", "uuid": "^8.3.2", - "which": "^2.0.2", "win-ca": "^3.2.0", "winston": "^3.3.3", "winston-console-format": "^1.0.8", diff --git a/src/common/custom-errors.ts b/src/common/custom-errors.ts index 0016af87ca..2cbc75ccf0 100644 --- a/src/common/custom-errors.ts +++ b/src/common/custom-errors.ts @@ -19,18 +19,15 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import path from "path"; - export class ExecValidationNotFoundError extends Error { - constructor(execPath: string) { + constructor(execPath: string, isAbsolute: boolean) { + super(`User Exec command "${execPath}" not found on host.`); let message = `User Exec command "${execPath}" not found on host.`; - if (!path.isAbsolute(execPath)) { + if (!isAbsolute) { message += ` Please ensure binary is found in PATH or use absolute path to binary in Kubeconfig`; } - - super(message); - + this.message = message; this.name = this.constructor.name; Error.captureStackTrace(this, this.constructor); } diff --git a/src/common/kube-helpers.ts b/src/common/kube-helpers.ts index 4bd420e7b2..aff05e68c6 100644 --- a/src/common/kube-helpers.ts +++ b/src/common/kube-helpers.ts @@ -25,11 +25,11 @@ import path from "path"; import os from "os"; import yaml from "js-yaml"; import logger from "../main/logger"; +import commandExists from "command-exists"; import { ExecValidationNotFoundError } from "./custom-errors"; import { Cluster, Context, newClusters, newContexts, newUsers, User } from "@kubernetes/client-node/dist/config_types"; import { resolvePath } from "./utils"; import Joi from "joi"; -import which from "which"; export type KubeConfigValidationOpts = { validateCluster?: boolean; @@ -295,17 +295,13 @@ export function validateKubeConfig(config: KubeConfig, contextName: string, vali // Validate exec command if present if (validateExec && user?.exec) { - try { - which.sync(user.exec.command); + const execCommand = user.exec["command"]; + // check if the command is absolute or not + const isAbsolute = path.isAbsolute(execCommand); - // If this doesn't throw an error it also means that it has found the executable. - } catch (error) { - switch (error?.code) { - case "ENOENT": - return new ExecValidationNotFoundError(user.exec.command); - default: - return error; - } + // validate the exec struct in the user object, start with the command field + if (!commandExists.sync(execCommand)) { + return new ExecValidationNotFoundError(execCommand, isAbsolute); } } diff --git a/src/renderer/components/+add-cluster/add-cluster.scss b/src/renderer/components/+add-cluster/add-cluster.scss index 8abb38e9d0..faac757c40 100644 --- a/src/renderer/components/+add-cluster/add-cluster.scss +++ b/src/renderer/components/+add-cluster/add-cluster.scss @@ -50,11 +50,4 @@ display: block; padding-top: 6px; } - - .actions-panel { - .Spinner { - vertical-align: middle; - margin-left: $spacing; - } - } } diff --git a/src/renderer/components/+add-cluster/add-cluster.tsx b/src/renderer/components/+add-cluster/add-cluster.tsx index 16a6dec19e..e987c1d4bb 100644 --- a/src/renderer/components/+add-cluster/add-cluster.tsx +++ b/src/renderer/components/+add-cluster/add-cluster.tsx @@ -24,7 +24,7 @@ import "./add-cluster.scss"; import type { KubeConfig } from "@kubernetes/client-node"; import fse from "fs-extra"; import { debounce } from "lodash"; -import { action, computed, observable, makeObservable, runInAction } from "mobx"; +import { action, computed, observable, makeObservable } from "mobx"; import { observer } from "mobx-react"; import path from "path"; import React from "react"; @@ -41,7 +41,6 @@ import { SettingLayout } from "../layout/setting-layout"; import MonacoEditor from "react-monaco-editor"; import { ThemeStore } from "../../theme.store"; import { UserStore } from "../../../common/user-store"; -import { Spinner } from "../spinner"; interface Option { config: KubeConfig; @@ -63,7 +62,6 @@ export class AddCluster extends React.Component { @observable kubeContexts = observable.map(); @observable customConfig = ""; @observable isWaiting = false; - @observable isCheckingInput = false; @observable errorText: string; constructor(props: {}) { @@ -82,35 +80,14 @@ export class AddCluster extends React.Component { ].filter(Boolean); } - _refreshContexts = debounce(() => { - runInAction(() => { - try { - const text = this.customConfig.trim(); + @action + refreshContexts = debounce(() => { + const { config, error } = loadConfigFromString(this.customConfig.trim() || "{}"); - if (!text) { - return this.kubeContexts.clear(); - } - - const { config, error } = loadConfigFromString(text); - - this.kubeContexts.replace(getContexts(config)); - this.errorText = error?.toString(); - } catch (error) { - this.kubeContexts.clear(); - this.errorText = error?.toString() || "An error occured"; - } finally { - this.isCheckingInput = false; - } - }); + this.kubeContexts.replace(getContexts(config)); + this.errorText = error?.toString(); }, 500); - refreshContexts = () => { - // Clear the kubeContexts immediately - this.isCheckingInput = true; - this.kubeContexts.clear(); - this._refreshContexts(); - }; - @action addClusters = async () => { this.isWaiting = true; @@ -168,7 +145,6 @@ export class AddCluster extends React.Component { tooltip={this.kubeContexts.size === 0 || "Paste in at least one cluster to add."} tooltipOverrideDisabled /> - {this.isCheckingInput && } ); diff --git a/yarn.lock b/yarn.lock index ce76e9ac72..87a86e853b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2184,11 +2184,6 @@ anymatch "^3.0.0" source-map "^0.6.0" -"@types/which@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/which/-/which-2.0.1.tgz#27ecd67f915b7c3d6ba552135bb1eecd66e63501" - integrity sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ== - "@types/ws@^6.0.1": version "6.0.4" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.4.tgz#7797707c8acce8f76d8c34b370d4645b70421ff1" @@ -4115,6 +4110,11 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +command-exists@1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" From 8b3d237f3b50f07509e6d1d7eaeb4d42bb670c88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Sep 2021 11:41:10 +0300 Subject: [PATCH 12/88] Bump sass from 1.39.0 to 1.41.1 (#3825) Bumps [sass](https://github.com/sass/dart-sass) from 1.39.0 to 1.41.1. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.39.0...1.41.1) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 141ec3a5a0..f9652a5cac 100644 --- a/package.json +++ b/package.json @@ -367,7 +367,7 @@ "react-select-event": "^5.1.0", "react-table": "^7.7.0", "react-window": "^1.8.5", - "sass": "^1.39.0", + "sass": "^1.41.1", "sass-loader": "^8.0.2", "sharp": "^0.29.0", "style-loader": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 87a86e853b..46af019646 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12418,17 +12418,10 @@ sass-loader@^8.0.2: schema-utils "^2.6.1" semver "^6.3.0" -sass@^1.32.13: - version "1.35.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.35.2.tgz#b732314fcdaf7ef8d0f1698698adc378043cb821" - integrity sha512-jhO5KAR+AMxCEwIH3v+4zbB2WB0z67V1X0jbapfVwQQdjHZUGUyukpnoM6+iCMfsIUC016w9OPKQ5jrNOS9uXw== - dependencies: - chokidar ">=3.0.0 <4.0.0" - -sass@^1.39.0: - version "1.39.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.39.0.tgz#6c64695d1c437767c8f1a4e471288e831f81d035" - integrity sha512-F4o+RhJkNOIG0b6QudYU8c78ZADKZjKDk5cyrf8XTKWfrgbtyVVXImFstJrc+1pkQDCggyidIOytq6gS4gCCZg== +sass@^1.32.13, sass@^1.41.1: + version "1.41.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.41.1.tgz#bca5bed2154192779c29f48fca9c644c60c38d98" + integrity sha512-vIjX7izRxw3Wsiez7SX7D+j76v7tenfO18P59nonjr/nzCkZuoHuF7I/Fo0ZRZPKr88v29ivIdE9BqGDgQD/Nw== dependencies: chokidar ">=3.0.0 <4.0.0" From e251194cb511685371dba026c410e1273b3ad28a Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 20 Sep 2021 06:01:05 -0400 Subject: [PATCH 13/88] Fix reference error when opening cluster view (#3824) Signed-off-by: Sebastian Malton --- src/renderer/api/catalog-entity-registry.ts | 18 +++++++++++++++++- src/renderer/components/app.tsx | 10 ++-------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/renderer/api/catalog-entity-registry.ts b/src/renderer/api/catalog-entity-registry.ts index 7b09ff273b..d731e2562a 100644 --- a/src/renderer/api/catalog-entity-registry.ts +++ b/src/renderer/api/catalog-entity-registry.ts @@ -31,7 +31,7 @@ import { once } from "lodash"; export type EntityFilter = (entity: CatalogEntity) => any; export class CatalogEntityRegistry { - @observable.ref activeEntity: CatalogEntity; + @observable protected activeEntityId: string | undefined = undefined; protected _entities = observable.map([], { deep: true }); protected filters = observable.set([], { deep: false, @@ -46,6 +46,22 @@ export class CatalogEntityRegistry { makeObservable(this); } + get activeEntity(): CatalogEntity | null { + return this._entities.get(this.activeEntityId) || null; + } + + set activeEntity(raw: CatalogEntity | string | null) { + if (raw) { + const id = typeof raw === "string" + ? raw + : raw.getId(); + + this.activeEntityId = id; + } else { + this.activeEntityId = undefined; + } + } + init() { ipcRendererOn("catalog:items", (event, items: (CatalogEntityData & CatalogEntityKindData)[]) => { this.updateItems(items); diff --git a/src/renderer/components/app.tsx b/src/renderer/components/app.tsx index 3f8dbf7d8b..c7d60f3b4f 100755 --- a/src/renderer/components/app.tsx +++ b/src/renderer/components/app.tsx @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import React from "react"; -import { observable, makeObservable, reaction } from "mobx"; +import { observable, makeObservable } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import { Redirect, Route, Router, Switch } from "react-router"; import { history } from "../navigation"; @@ -97,13 +97,7 @@ export class App extends React.Component { await cluster.whenReady; // cluster.activate() is done at this point - const activeEntityDisposer = reaction(() => catalogEntityRegistry.getById(App.clusterId), (entity) => { - if (!entity) { - return; - } - catalogEntityRegistry.activeEntity = entity; - activeEntityDisposer(); - }, {fireImmediately: true}); + catalogEntityRegistry.activeEntity = App.clusterId; ExtensionLoader.getInstance().loadOnClusterRenderer(); setTimeout(() => { From d448017f334a39b0ee9d974d867e236b4e0104e2 Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Mon, 20 Sep 2021 15:15:26 +0300 Subject: [PATCH 14/88] Fix node-fetch load on renderer (#3836) * fix node-fetch load on renderer Signed-off-by: Jari Kolehmainen * cleanup Signed-off-by: Jari Kolehmainen * cleanup Signed-off-by: Jari Kolehmainen --- src/main/window-manager.ts | 2 -- webpack.main.ts | 39 +------------------------------------- webpack.renderer.ts | 3 +++ 3 files changed, 4 insertions(+), 40 deletions(-) diff --git a/src/main/window-manager.ts b/src/main/window-manager.ts index be6d71498e..80e3224fd4 100644 --- a/src/main/window-manager.ts +++ b/src/main/window-manager.ts @@ -31,7 +31,6 @@ import { IpcRendererNavigationEvents } from "../renderer/navigation/events"; import logger from "./logger"; import { productName } from "../common/vars"; import { LensProxy } from "./lens-proxy"; -import * as path from "path"; function isHideable(window: BrowserWindow | null): boolean { return Boolean(window && !window.isDestroyed()); @@ -85,7 +84,6 @@ export class WindowManager extends Singleton { titleBarStyle: "hiddenInset", backgroundColor: "#1e2124", webPreferences: { - preload: path.join(__static, "build", "preload.js"), nodeIntegration: true, nodeIntegrationInSubFrames: true, enableRemoteModule: true, diff --git a/webpack.main.ts b/webpack.main.ts index 33d9daf6af..62e51bf4a2 100755 --- a/webpack.main.ts +++ b/webpack.main.ts @@ -22,7 +22,7 @@ import path from "path"; import type webpack from "webpack"; import ForkTsCheckerPlugin from "fork-ts-checker-webpack-plugin"; -import { isProduction, mainDir, buildDir, isDevelopment, preloadEntrypoint } from "./src/common/vars"; +import { isProduction, mainDir, buildDir, isDevelopment } from "./src/common/vars"; import nodeExternals from "webpack-node-externals"; import ProgressBarPlugin from "progress-bar-webpack-plugin"; import * as vars from "./src/common/vars"; @@ -68,41 +68,4 @@ configs.push((): webpack.Configuration => { }; }); -configs.push((): webpack.Configuration => { - console.info("WEBPACK:preload", vars); - - return { - context: __dirname, - target: "electron-main", - mode: isProduction ? "production" : "development", - devtool: isProduction ? "source-map" : "cheap-eval-source-map", - cache: isDevelopment, - entry: { - main: path.resolve(preloadEntrypoint), - }, - output: { - libraryTarget: "global", - path: buildDir, - filename: "preload.js" - }, - resolve: { - extensions: [".json", ".js", ".ts"], - mainFields: ["main"] - }, - module: { - rules: [ - { - test: /\.node$/, - use: "node-loader" - }, - getTSLoader(/\.ts$/) - ] - }, - plugins: [ - new ProgressBarPlugin(), - new ForkTsCheckerPlugin(), - ].filter(Boolean) - }; -}); - export default configs; diff --git a/webpack.renderer.ts b/webpack.renderer.ts index 5be6ba09dc..5e43213bd0 100755 --- a/webpack.renderer.ts +++ b/webpack.renderer.ts @@ -79,6 +79,9 @@ export function webpackLensRenderer({ showVars = true } = {}): webpack.Configura ".ts", ".tsx", ] }, + externals: { + "node-fetch": "commonjs node-fetch" + }, optimization: { minimize: false }, From dfa0a35695d09c9fffc2e291550d65bec8ba4c31 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 20 Sep 2021 09:54:12 -0400 Subject: [PATCH 15/88] Fix error due to async validators for (#3823) Signed-off-by: Sebastian Malton --- src/renderer/components/input/input.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/input/input.tsx b/src/renderer/components/input/input.tsx index e5276ffcb5..f9054ceeb8 100644 --- a/src/renderer/components/input/input.tsx +++ b/src/renderer/components/input/input.tsx @@ -91,7 +91,7 @@ const defaultProps: Partial = { export class Input extends React.Component { static defaultProps = defaultProps as object; - public input: InputElement; + public input: InputElement | null = null; public validators: InputValidator[] = []; public state: State = { @@ -191,7 +191,7 @@ export class Input extends React.Component { } } - this.input.setCustomValidity(errors.length ? errors[0].toString() : ""); + this.input?.setCustomValidity(errors.length ? errors[0].toString() : ""); } setValidation(errors: React.ReactNode[]) { From 429418a1e2b4f17d50bef4140560e1566abdda6e Mon Sep 17 00:00:00 2001 From: Panu Horsmalahti Date: Mon, 20 Sep 2021 17:09:51 +0300 Subject: [PATCH 16/88] Emit contextMenuOpen for WebLink CatalogEntity (#3842) Signed-off-by: Panu Horsmalahti --- src/common/catalog-entities/web-link.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/common/catalog-entities/web-link.ts b/src/common/catalog-entities/web-link.ts index d54aa8533a..8309945f24 100644 --- a/src/common/catalog-entities/web-link.ts +++ b/src/common/catalog-entities/web-link.ts @@ -57,6 +57,10 @@ export class WebLink extends CatalogEntity(this) + ?.emit("contextMenuOpen", this, context); } } From 070fc1bb443d5b0e3eee02989b98549d0b91e647 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Wed, 22 Sep 2021 07:42:05 +0300 Subject: [PATCH 17/88] Fix long name layout in Cluster Settings (#3854) * Fix long name layout in Cluster Settings Signed-off-by: Alex Andreev * Clean up Signed-off-by: Alex Andreev --- ...ttings.scss => entity-settings.module.css} | 32 ++++++------------- .../+entity-settings/entity-settings.tsx | 7 ++-- 2 files changed, 13 insertions(+), 26 deletions(-) rename src/renderer/components/+entity-settings/{entity-settings.scss => entity-settings.module.css} (76%) diff --git a/src/renderer/components/+entity-settings/entity-settings.scss b/src/renderer/components/+entity-settings/entity-settings.module.css similarity index 76% rename from src/renderer/components/+entity-settings/entity-settings.scss rename to src/renderer/components/+entity-settings/entity-settings.module.css index 30c01b8a67..604ecd5c5b 100644 --- a/src/renderer/components/+entity-settings/entity-settings.scss +++ b/src/renderer/components/+entity-settings/entity-settings.module.css @@ -19,26 +19,12 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -.EntitySettings { - $spacing: $padding * 3; - - - // TODO: move sub-component styles to separate files - .admin-note { - font-size: small; - opacity: 0.5; - margin-left: $margin; - } - - .button-area { - margin-top: $margin * 2; - } - - .file-loader { - margin-top: $margin * 2; - } - - .Input, .Select { - margin-top: $padding; - } -} +.entityName { + @apply font-bold overflow-hidden; + word-break: break-word; + color: var(--textColorAccent); + display: -webkit-box; + /* Simulate text-overflow:ellipsis styles but for multiple text lines */ + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; +} \ No newline at end of file diff --git a/src/renderer/components/+entity-settings/entity-settings.tsx b/src/renderer/components/+entity-settings/entity-settings.tsx index f656b6fa9d..bcb5895413 100644 --- a/src/renderer/components/+entity-settings/entity-settings.tsx +++ b/src/renderer/components/+entity-settings/entity-settings.tsx @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import "./entity-settings.scss"; +import styles from "./entity-settings.module.css"; import React from "react"; import { observable, makeObservable } from "mobx"; @@ -98,7 +98,9 @@ export class EntitySettings extends React.Component { source={this.entity.metadata.source} src={this.entity.spec.icon?.src} /> -

{this.entity.metadata.name}

+
+ {this.entity.metadata.name} +
{ groups.map((group, groupIndex) => ( @@ -138,7 +140,6 @@ export class EntitySettings extends React.Component { return ( From eb789a0ab15cffa83c6585011ddf27aa79ad8c60 Mon Sep 17 00:00:00 2001 From: Juho Heikka Date: Tue, 21 Sep 2021 23:53:11 +0300 Subject: [PATCH 18/88] Fix menu rendering on when slightly off screen Menu would bounce around in some cases because the refreshPosition() would calculate different results based on different state of the component and previous render cycle CSS classes. Also I found that the render function calls causes in an infinite loop while open because of refreshPosition will cause a state change which will rerender the function. Fixed that with the shouldComponentUpdate which checks if state has actually changed in between renders. Signed-off-by: Juho Heikka --- src/renderer/components/menu/menu.scss | 8 ---- src/renderer/components/menu/menu.tsx | 54 +++++++++++++++----------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/renderer/components/menu/menu.scss b/src/renderer/components/menu/menu.scss index d94cbff63e..0db62e278a 100644 --- a/src/renderer/components/menu/menu.scss +++ b/src/renderer/components/menu/menu.scss @@ -35,14 +35,6 @@ &.portal { left: -1000px; top: -1000px; - - &.top { - margin-top: -$margin; - } - - &.bottom { - margin-top: $margin; - } } &:not(.portal) { diff --git a/src/renderer/components/menu/menu.tsx b/src/renderer/components/menu/menu.tsx index 30780e7ac4..8ceef6bf8e 100644 --- a/src/renderer/components/menu/menu.tsx +++ b/src/renderer/components/menu/menu.tsx @@ -26,6 +26,7 @@ import { createPortal } from "react-dom"; import { autoBind, cssNames, noop } from "../../utils"; import { Animate } from "../animate"; import { Icon, IconProps } from "../icon"; +import isEqual from "lodash/isEqual"; export const MenuContext = React.createContext(null); export type MenuContextValue = Menu; @@ -85,6 +86,10 @@ export class Menu extends React.Component { return !!this.props.isOpen; } + shouldComponentUpdate(nextProps: MenuProps, nextState: State) { + return !isEqual(nextState, this.state) || !isEqual(nextProps, this.props); + } + componentDidMount() { if (!this.props.usePortal) { const parent = this.elem.parentElement; @@ -150,39 +155,42 @@ export class Menu extends React.Component { return; } - const { width, height } = this.opener.getBoundingClientRect(); - let { left, top, bottom, right } = this.opener.getBoundingClientRect(); + const openerClientRect = this.opener.getBoundingClientRect(); + let { left: openerLeft, top: openerTop, bottom: openerBottom, right: openerRight } = this.opener.getBoundingClientRect(); const withScroll = window.getComputedStyle(this.elem).position !== "fixed"; // window global scroll corrections if (withScroll) { - left += window.pageXOffset; - top += window.pageYOffset; - right = left + width; - bottom = top + height; + openerLeft += window.pageXOffset; + openerTop += window.pageYOffset; + openerRight = openerLeft + openerClientRect.width; + openerBottom = openerTop + openerClientRect.height; } - // setup initial position - const position: MenuPosition = { left: true, bottom: true }; + const extraMargin = this.props.usePortal ? 8 : 0; - this.elem.style.left = `${left}px`; - this.elem.style.top = `${bottom}px`; + const { width: menuWidth, height: menuHeight } = this.elem.getBoundingClientRect(); - // correct position if menu doesn't fit to viewport - const menuPos = this.elem.getBoundingClientRect(); + const rightSideOfMenu = openerLeft + menuWidth; + const renderMenuLeft = rightSideOfMenu > window.innerWidth; + const menuOnLeftSidePosition = `${openerRight - this.elem.offsetWidth}px`; + const menuOnRightSidePosition = `${openerLeft}px`; - if (menuPos.right > window.innerWidth) { - this.elem.style.left = `${right - this.elem.offsetWidth}px`; - position.right = true; - delete position.left; - } + this.elem.style.left = renderMenuLeft ? menuOnLeftSidePosition : menuOnRightSidePosition; - if (menuPos.bottom > window.innerHeight) { - this.elem.style.top = `${top - this.elem.offsetHeight}px`; - position.top = true; - delete position.bottom; - } - this.setState({ position }); + const bottomOfMenu = openerBottom + extraMargin + menuHeight; + const renderMenuOnTop = bottomOfMenu > window.innerHeight; + const menuOnTopPosition = `${openerTop - this.elem.offsetHeight - extraMargin}px`; + const menuOnBottomPosition = `${openerBottom + extraMargin}px`; + + this.elem.style.top = renderMenuOnTop ? menuOnTopPosition : menuOnBottomPosition; + + this.setState({ position: { + top: renderMenuOnTop, + bottom: !renderMenuOnTop, + left: renderMenuLeft, + right: !renderMenuLeft + } }); }; open() { From e2a9d5213e2201cb6a00a51ec5481a5464916a1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Sep 2021 08:50:38 -0400 Subject: [PATCH 19/88] Bump tmpl from 1.0.4 to 1.0.5 in /extensions/pod-menu (#3862) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- extensions/pod-menu/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/pod-menu/package-lock.json b/extensions/pod-menu/package-lock.json index 3abe5a107f..b2c2e736fe 100644 --- a/extensions/pod-menu/package-lock.json +++ b/extensions/pod-menu/package-lock.json @@ -6561,9 +6561,9 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-arraybuffer": { From 963d801cf75bd0a08947c46149db40ab5e100cdf Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 22 Sep 2021 16:42:16 +0300 Subject: [PATCH 20/88] [UX]: navigation to cluster overview from sidebar's top icon (#3867) * UX: navigate to "/cluster" overview page from sidebar's top icon * highlight hotbar-icon border on click --- .../components/hotbar/hotbar-icon.scss | 35 +++++++------------ src/renderer/components/layout/sidebar.tsx | 5 +-- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/src/renderer/components/hotbar/hotbar-icon.scss b/src/renderer/components/hotbar/hotbar-icon.scss index 2f9ad6a696..e713b20432 100644 --- a/src/renderer/components/hotbar/hotbar-icon.scss +++ b/src/renderer/components/hotbar/hotbar-icon.scss @@ -31,12 +31,20 @@ } .HotbarIcon { + --iconActiveShadow: 0 0 0px 3px var(--clusterMenuBackground), 0 0 0px 6px var(--textColorAccent); + --iconHoverShadow: 0 0 0px 3px var(--clusterMenuBackground), 0 0 0px 6px #ffffff50; + border-radius: 6px; user-select: none; cursor: pointer; transition: none; text-shadow: 0 0 4px #0000008f; position: relative; + z-index: 0; // allows to catch state of :active pseudo-selector + + &:active .MuiAvatar-root { + box-shadow: var(--iconActiveShadow) !important; + } div.MuiAvatar-colorDefault { font-weight:500; @@ -64,20 +72,17 @@ box-shadow: none; } - div.MuiAvatar-root { + .MuiAvatar-root { width: var(--size); height: var(--size); + border-radius: 6px; &.active { - box-shadow: 0 0 0px 3px var(--clusterMenuBackground), 0 0 0px 6px var(--textColorAccent); + box-shadow: var(--iconActiveShadow); } - &.interactive { - &:hover { - &:not(.active) { - box-shadow: 0 0 0px 3px var(--clusterMenuBackground), 0 0 0px 6px #ffffff50; - } - } + &.interactive:not(.active):hover { + box-shadow: var(--iconHoverShadow); } } @@ -117,20 +122,6 @@ } } - img { - border-radius: 6px; - - &.active { - box-shadow: 0 0 0px 3px var(--clusterMenuBackground), 0 0 0px 6px var(--textColorAccent); - } - - &:hover { - &:not(.active) { - box-shadow: 0 0 0px 3px var(--clusterMenuBackground), 0 0 0px 6px #ffffff50; - } - } - } - .materialIcon { margin-left: 1px; margin-top: 1px; diff --git a/src/renderer/components/layout/sidebar.tsx b/src/renderer/components/layout/sidebar.tsx index 92dd03f311..66860fa399 100644 --- a/src/renderer/components/layout/sidebar.tsx +++ b/src/renderer/components/layout/sidebar.tsx @@ -32,7 +32,7 @@ import { Storage } from "../+storage"; import { Network } from "../+network"; import { crdStore } from "../+custom-resources/crd.store"; import { CustomResources } from "../+custom-resources/custom-resources"; -import { isActiveRoute } from "../../navigation"; +import { isActiveRoute, navigate } from "../../navigation"; import { isAllowedResource } from "../../../common/utils/allowed-resource"; import { Spinner } from "../spinner"; import { ClusterPageMenuRegistration, ClusterPageMenuRegistry, ClusterPageRegistry, getExtensionPageUrl } from "../../../extensions/registries"; @@ -110,7 +110,7 @@ export class Sidebar extends React.Component { const routes: TabLayoutRoute[] = []; const subMenus = ClusterPageMenuRegistry.getInstance().getSubItems(menu); - const clusterPageRegistry= ClusterPageRegistry.getInstance(); + const clusterPageRegistry = ClusterPageRegistry.getInstance(); for (const subMenu of subMenus) { const page = clusterPageRegistry.getByPageTarget(subMenu.target); @@ -193,6 +193,7 @@ export class Sidebar extends React.Component { source={metadata.source} src={spec.icon?.src} className="mr-5" + onClick={() => navigate(routes.clusterURL())} />
{metadata.name} From e2a85031b60c8b5c059bddbaeaf90e326e1625cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Sep 2021 09:43:20 -0400 Subject: [PATCH 21/88] Bump tmpl from 1.0.4 to 1.0.5 in /extensions/metrics-cluster-feature (#3863) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- extensions/metrics-cluster-feature/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/metrics-cluster-feature/package-lock.json b/extensions/metrics-cluster-feature/package-lock.json index 981cb43dff..1d2e2217cb 100644 --- a/extensions/metrics-cluster-feature/package-lock.json +++ b/extensions/metrics-cluster-feature/package-lock.json @@ -6645,9 +6645,9 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-arraybuffer": { From 39e2fce47350a4328417a8ec9a5b598a89b9f434 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Sep 2021 09:43:27 -0400 Subject: [PATCH 22/88] Bump tmpl from 1.0.4 to 1.0.5 in /extensions/node-menu (#3864) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- extensions/node-menu/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/node-menu/package-lock.json b/extensions/node-menu/package-lock.json index 02d953b830..88ada2da7e 100644 --- a/extensions/node-menu/package-lock.json +++ b/extensions/node-menu/package-lock.json @@ -6608,9 +6608,9 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-arraybuffer": { From 3a989bbb364ef9cf7cec9fbaf8f00ababcff49c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Sep 2021 09:43:33 -0400 Subject: [PATCH 23/88] Bump tmpl from 1.0.4 to 1.0.5 (#3860) 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 46af019646..d132c386e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13680,9 +13680,9 @@ tmp@^0.2.0, tmp@^0.2.1: rimraf "^3.0.0" tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-arraybuffer@^1.0.0: version "1.0.1" From 49e8b9cc0a46047be470ac500d9d9c9fab78a5b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Sep 2021 09:43:49 -0400 Subject: [PATCH 24/88] Bump npm from 6.14.13 to 6.14.15 (#3838) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 95 +++++++++++++++++++++++++++++++++++----------------- 2 files changed, 66 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index f9652a5cac..64f4476423 100644 --- a/package.json +++ b/package.json @@ -223,7 +223,7 @@ "monaco-editor": "^0.26.1", "node-fetch": "^2.6.1", "node-pty": "^0.10.1", - "npm": "^6.14.8", + "npm": "^6.14.15", "openid-client": "^3.15.2", "p-limit": "^3.1.0", "path-to-regexp": "^6.1.0", diff --git a/yarn.lock b/yarn.lock index d132c386e8..e5ea295dd7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4683,7 +4683,7 @@ debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.6: dependencies: ms "^2.1.1" -debuglog@^1.0.1: +debuglog@*, debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -6411,7 +6411,7 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^1.2.5: +fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== @@ -6823,12 +6823,7 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.2, graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== @@ -7397,7 +7392,7 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -imurmurhash@^0.1.4: +imurmurhash@*, imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -9165,6 +9160,11 @@ lodash-es@^4.17.20: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" + integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= + lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -9173,11 +9173,33 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" +lodash._bindcallback@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= + +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= + +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= + dependencies: + lodash._getnative "^3.0.0" + lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= +lodash._getnative@*, lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + lodash._root@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" @@ -9203,6 +9225,11 @@ lodash.isequal@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= +lodash.restparam@*: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + lodash.toarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" @@ -9622,7 +9649,7 @@ minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: +minipass@^2.3.5, minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== @@ -9637,7 +9664,7 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" -minizlib@^1.2.1: +minizlib@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== @@ -9686,7 +9713,7 @@ mkdirp@1.x, mkdirp@^1.0.3, mkdirp@~1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.0: +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -10214,10 +10241,10 @@ npm-user-validate@^1.0.1: resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.1.tgz#31428fc5475fe8416023f178c0ab47935ad8c561" integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw== -npm@^6.14.8: - version "6.14.13" - resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.13.tgz#e88bcb6c48209869c40b5cedad8a1508e58e6f30" - integrity sha512-SRl4jJi0EBHY2xKuu98FLRMo3VhYQSA6otyLnjSEiHoSG/9shXCFNJy9tivpUJvtkN9s6VDdItHa5Rn+fNBzag== +npm@^6.14.15: + version "6.14.15" + resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.15.tgz#97dd51af5b5d6225b611b40c5cb4d31da1d467fe" + integrity sha512-dkcQc4n+DiJAMYG2haNAMyJbmuvevjXz+WC9dCUzodw8EovwTIc6CATSsTEplCY6c0jG4OshxFGFJsrnKJguWA== dependencies: JSONStream "^1.3.5" abbrev "~1.1.1" @@ -10237,6 +10264,7 @@ npm@^6.14.8: cmd-shim "^3.0.3" columnify "~1.5.4" config-chain "^1.1.12" + debuglog "*" detect-indent "~5.0.0" detect-newline "^2.1.0" dezalgo "~1.0.3" @@ -10251,6 +10279,7 @@ npm@^6.14.8: has-unicode "~2.0.1" hosted-git-info "^2.8.9" iferr "^1.0.2" + imurmurhash "*" infer-owner "^1.0.4" inflight "~1.0.6" inherits "^2.0.4" @@ -10269,8 +10298,14 @@ npm@^6.14.8: libnpx "^10.2.4" lock-verify "^2.1.0" lockfile "^1.0.4" + lodash._baseindexof "*" lodash._baseuniq "~4.6.0" + lodash._bindcallback "*" + lodash._cacheindexof "*" + lodash._createcache "*" + lodash._getnative "*" lodash.clonedeep "~4.5.0" + lodash.restparam "*" lodash.union "~4.6.0" lodash.uniq "~4.5.0" lodash.without "~4.4.0" @@ -10320,7 +10355,7 @@ npm@^6.14.8: sorted-union-stream "~2.1.3" ssri "^6.0.2" stringify-package "^1.0.1" - tar "^4.4.13" + tar "^4.4.19" text-table "~0.2.0" tiny-relative-date "^1.3.0" uid-number "0.0.6" @@ -12363,7 +12398,7 @@ rxjs@^6.5.2: dependencies: tslib "^1.9.0" -safe-buffer@*, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@*, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -13496,18 +13531,18 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^4.4.10, tar@^4.4.12, tar@^4.4.13: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== +tar@^4.4.10, tar@^4.4.12, tar@^4.4.19: + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" tar@^6.0.2, tar@^6.1.10: version "6.1.10" @@ -14899,7 +14934,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== From 3fc5b83461d3dcf94eccc055c63954e6b842ba8e Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 22 Sep 2021 07:25:48 -0700 Subject: [PATCH 25/88] Add error message for no contexts in add cluster page (#3868) --- .../components/+add-cluster/add-cluster.tsx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/+add-cluster/add-cluster.tsx b/src/renderer/components/+add-cluster/add-cluster.tsx index e987c1d4bb..81a75019fa 100644 --- a/src/renderer/components/+add-cluster/add-cluster.tsx +++ b/src/renderer/components/+add-cluster/add-cluster.tsx @@ -62,7 +62,7 @@ export class AddCluster extends React.Component { @observable kubeContexts = observable.map(); @observable customConfig = ""; @observable isWaiting = false; - @observable errorText: string; + @observable errors: string[] = []; constructor(props: {}) { super(props); @@ -75,7 +75,7 @@ export class AddCluster extends React.Component { @computed get allErrors(): string[] { return [ - this.errorText, + ...this.errors, ...iter.map(this.kubeContexts.values(), ({ error }) => error) ].filter(Boolean); } @@ -85,7 +85,14 @@ export class AddCluster extends React.Component { const { config, error } = loadConfigFromString(this.customConfig.trim() || "{}"); this.kubeContexts.replace(getContexts(config)); - this.errorText = error?.toString(); + + if (error) { + this.errors.push(error.toString()); + } + + if (config.contexts.length === 0) { + this.errors.push('No contexts defined, either missing the "contexts" field, or it is empty.'); + } }, 500); @action @@ -124,7 +131,7 @@ export class AddCluster extends React.Component { value={this.customConfig} onChange={value => { this.customConfig = value; - this.errorText = ""; + this.errors.length = 0; this.refreshContexts(); }} /> From 02c90c760d667a085f9b82664324a0c07ecde329 Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Thu, 23 Sep 2021 12:23:00 +0300 Subject: [PATCH 26/88] fix missing query parameter (#3875) Signed-off-by: Jari Kolehmainen --- src/common/k8s-api/kube-object.store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/k8s-api/kube-object.store.ts b/src/common/k8s-api/kube-object.store.ts index dc428eb08b..f90eaab8e5 100644 --- a/src/common/k8s-api/kube-object.store.ts +++ b/src/common/k8s-api/kube-object.store.ts @@ -159,7 +159,7 @@ export abstract class KubeObjectStore extends ItemStore this.loadedNamespaces = namespaces; return Promise // load resources per namespace - .all(namespaces.map(namespace => api.list({ namespace, reqInit }))) + .all(namespaces.map(namespace => api.list({ namespace, reqInit }, this.query))) .then(items => items.flat().filter(Boolean)); } } From 06854b4cac2b54b41099c4795db497088df0322d Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Thu, 23 Sep 2021 12:36:53 +0300 Subject: [PATCH 27/88] Disable log file writing on renderer (#3874) Signed-off-by: Jari Kolehmainen --- src/common/logger.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/common/logger.ts b/src/common/logger.ts index 825fa2493b..ca975871b8 100644 --- a/src/common/logger.ts +++ b/src/common/logger.ts @@ -59,24 +59,24 @@ if (ipcMain) { ), }) ); + + if (!isTestEnv) { + transports.push( + new winston.transports.File({ + handleExceptions: false, + level: logLevel, + filename: "lens.log", + dirname: getPath("logs"), + maxsize: 16 * 1024, + maxFiles: 16, + tailable: true, + }) + ); + } } else { transports.push(new BrowserConsole()); } -if (!isTestEnv) { - transports.push( - new winston.transports.File({ - handleExceptions: false, - level: logLevel, - filename: "lens.log", - dirname: getPath("logs"), - maxsize: 16 * 1024, - maxFiles: 16, - tailable: true, - }) - ); -} - export default winston.createLogger({ format: format.simple(), transports, From 3c55cba40db33c975f3f704c48294588229f9148 Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Thu, 23 Sep 2021 15:14:24 +0300 Subject: [PATCH 28/88] use ubuntu 18.04 for builds (#3877) Signed-off-by: Jari Kolehmainen --- .azure-pipelines-k8s-matrix.yml | 2 +- .azure-pipelines.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.azure-pipelines-k8s-matrix.yml b/.azure-pipelines-k8s-matrix.yml index 9f1f38ec67..cdcc18b740 100644 --- a/.azure-pipelines-k8s-matrix.yml +++ b/.azure-pipelines-k8s-matrix.yml @@ -15,7 +15,7 @@ trigger: none jobs: - job: Linux pool: - vmImage: ubuntu-20.04 + vmImage: ubuntu-18.04 strategy: matrix: kube_1.16: diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index e360a818e6..3c928430ed 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -109,7 +109,7 @@ jobs: - job: Linux pool: - vmImage: ubuntu-20.04 + vmImage: ubuntu-18.04 strategy: matrix: node_14.x: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4bc748d235..7590f42289 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-20.04, macos-11, windows-2019] + os: [ubuntu-18.04, macos-11, windows-2019] node-version: [14.x] steps: - name: Checkout Release from lens From 3c77c06519c2d9b72eb23946d2f2f7ddd1eaf938 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 23 Sep 2021 13:18:31 -0400 Subject: [PATCH 29/88] Add ability to search and activate entities via the command dialog (#3692) --- src/extensions/registries/base-registry.ts | 2 +- src/extensions/registries/command-registry.ts | 4 +- .../activate-entity-command.tsx | 58 +++++++++++++++++++ .../activate-entity-command/index.ts | 22 +++++++ .../initializers/command-registry.tsx | 7 +++ 5 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 src/renderer/components/activate-entity-command/activate-entity-command.tsx create mode 100644 src/renderer/components/activate-entity-command/index.ts diff --git a/src/extensions/registries/base-registry.ts b/src/extensions/registries/base-registry.ts index af00fb48fd..9b596172c9 100644 --- a/src/extensions/registries/base-registry.ts +++ b/src/extensions/registries/base-registry.ts @@ -25,7 +25,7 @@ import { Singleton } from "../../common/utils"; import { LensExtension } from "../lens-extension"; export class BaseRegistry extends Singleton { - private items = observable.map([], {deep: false}); + private items = observable.map([], { deep: false }); constructor() { super(); diff --git a/src/extensions/registries/command-registry.ts b/src/extensions/registries/command-registry.ts index 5c38e32c71..3916b0f721 100644 --- a/src/extensions/registries/command-registry.ts +++ b/src/extensions/registries/command-registry.ts @@ -25,9 +25,9 @@ import { BaseRegistry } from "./base-registry"; import type { LensExtension } from "../lens-extension"; import type { CatalogEntity } from "../../common/catalog"; -export type CommandContext = { +export interface CommandContext { entity?: CatalogEntity; -}; +} export interface CommandRegistration { id: string; diff --git a/src/renderer/components/activate-entity-command/activate-entity-command.tsx b/src/renderer/components/activate-entity-command/activate-entity-command.tsx new file mode 100644 index 0000000000..110afd6b3c --- /dev/null +++ b/src/renderer/components/activate-entity-command/activate-entity-command.tsx @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { computed } from "mobx"; +import { observer } from "mobx-react"; +import React from "react"; +import { CatalogEntity, catalogEntityRunContext } from "../../api/catalog-entity"; +import { catalogEntityRegistry } from "../../api/catalog-entity-registry"; +import { CommandOverlay } from "../command-palette"; +import { Select } from "../select"; + +@observer +export class ActivateEntityCommand extends React.Component { + @computed get options() { + return catalogEntityRegistry.items.map(entity => ({ + label: `${entity.kind}: ${entity.getName()}`, + value: entity, + })); + } + + onSelect(entity: CatalogEntity): void { + entity.onRun?.(catalogEntityRunContext); + CommandOverlay.close(); + } + + render() { + return ( + +
+ + + ); + } + + render() { + const { className, ...dialogProps } = this.props; + const resourceName = this.portForward?.name ?? ""; + const header = ( +
+ Port Forwarding for {resourceName} +
+ ); + + return ( + + + + {this.renderContents()} + + + + ); + } +} diff --git a/src/renderer/port-forward/port-forward-item.ts b/src/renderer/port-forward/port-forward-item.ts new file mode 100644 index 0000000000..9251b0fcef --- /dev/null +++ b/src/renderer/port-forward/port-forward-item.ts @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +import type { ItemObject } from "../../common/item.store"; +import { autoBind } from "../../common/utils"; + +export interface ForwardedPort { + clusterId?: string; + kind: string; + namespace: string; + name: string; + port: number; + forwardPort: number; +} + +export class PortForwardItem implements ItemObject { + clusterId: string; + kind: string; + namespace: string; + name: string; + port: number; + forwardPort: number; + + constructor(pf: ForwardedPort) { + this.clusterId = pf.clusterId; + this.kind = pf.kind; + this.namespace = pf.namespace; + this.name = pf.name; + this.port = pf.port; + this.forwardPort = pf.forwardPort; + + autoBind(this); + } + + getName() { + return this.name; + } + + getNs() { + return this.namespace; + } + + get id() { + return this.forwardPort; + } + + getId() { + return String(this.forwardPort); + } + + getKind() { + return this.kind; + } + + getPort() { + return this.port; + } + + getForwardPort() { + return this.forwardPort; + } + + getSearchFields() { + return [ + this.name, + this.id, + this.kind, + this.port, + this.forwardPort, + ]; + } +} diff --git a/src/renderer/port-forward/port-forward.store.ts b/src/renderer/port-forward/port-forward.store.ts new file mode 100644 index 0000000000..49ebee61d4 --- /dev/null +++ b/src/renderer/port-forward/port-forward.store.ts @@ -0,0 +1,179 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +import { makeObservable, observable, reaction } from "mobx"; +import { ItemStore } from "../../common/item.store"; +import { autoBind, createStorage, disposer, getHostedClusterId, openExternal } from "../utils"; +import { ForwardedPort, PortForwardItem } from "./port-forward-item"; +import { apiBase } from "../api"; +import { waitUntilFree } from "tcp-port-used"; +import { Notifications } from "../components/notifications"; +import logger from "../../common/logger"; + +export class PortForwardStore extends ItemStore { + private storage = createStorage("port_forwards", undefined); + + @observable portForwards: PortForwardItem[]; + + constructor() { + super(); + makeObservable(this); + autoBind(this); + + this.init(); + } + + private async init() { + await this.storage.whenReady; + + const savedPortForwards = this.storage.get(); // undefined on first load + + if (Array.isArray(savedPortForwards)) { + logger.info("[PORT_FORWARD] starting saved port-forwards"); + await Promise.all(savedPortForwards.map(addPortForward)); + } + } + + watch() { + return disposer( + reaction(() => this.portForwards, () => this.loadAll()), + ); + } + + loadAll() { + return this.loadItems(async () => { + let portForwards = await getPortForwards(); + + // filter out any not for this cluster + portForwards = portForwards.filter(pf => pf.clusterId == getHostedClusterId()); + this.storage.set(portForwards); + + this.reset(); + portForwards.map(pf => this.portForwards.push(new PortForwardItem(pf))); + + return this.portForwards; + }); + } + + reset() { + this.portForwards = []; + } + + async removeSelectedItems() { + return Promise.all(this.selectedItems.map(removePortForward)); + } +} + +interface PortForwardResult { + port: number; +} + +interface PortForwardsResult { + portForwards: ForwardedPort[]; +} + +export async function addPortForward(portForward: ForwardedPort): Promise { + let response: PortForwardResult; + + try { + response = await apiBase.post(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}?port=${portForward.port}&forwardPort=${portForward.forwardPort}`); + + if (response?.port && response.port != +portForward.forwardPort) { + logger.warn(`specified ${portForward.forwardPort} got ${response.port}`); + } + } catch (error) { + logger.warn(error); // don't care, caller must check + } + portForwardStore.reset(); + + return response?.port; +} + +export async function getPortForward(portForward: ForwardedPort): Promise { + let response: PortForwardResult; + + try { + response = await apiBase.get(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}?port=${portForward.port}&forwardPort=${portForward.forwardPort}`); + } catch (error) { + logger.warn(error); // don't care, caller must check + } + + return response?.port; +} + +export async function modifyPortForward(portForward: ForwardedPort, desiredPort: number): Promise { + let port = 0; + + try { + await removePortForward(portForward); + portForward.forwardPort = desiredPort; + port = await addPortForward(portForward); + } catch (error) { + logger.warn(error); // don't care, caller must check + } + portForwardStore.reset(); + + return port; +} + + +export async function removePortForward(portForward: ForwardedPort) { + try { + await apiBase.del(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}?port=${portForward.port}&forwardPort=${portForward.forwardPort}`); + await waitUntilFree(+portForward.forwardPort, 200, 1000); + } catch (error) { + logger.warn(error); // don't care, caller must check + } + portForwardStore.reset(); +} + +export async function getPortForwards(): Promise { + try { + const response = await apiBase.get(`/pods/port-forwards`); + + return response.portForwards; + } catch (error) { + logger.warn(error); // don't care, caller must check + + return []; + } +} + +export function openPortForward(portForward: ForwardedPort) { + const browseTo = `http://localhost:${portForward.forwardPort}`; + + openExternal(browseTo) + .catch(error => { + logger.error(`failed to open in browser: ${error}`, { + clusterId: portForward.clusterId, + port: portForward.port, + kind: portForward.kind, + namespace: portForward.namespace, + name: portForward.name, + }); + Notifications.error(`Failed to open ${browseTo} in browser`); + } + ); + +} + +export const portForwardStore = new PortForwardStore(); From cdb57f4c974ba5f9bd132df992e72d541dc9adce Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 8 Oct 2021 09:02:32 -0400 Subject: [PATCH 83/88] Remove directly depending on openid-client (#3935) --- package.json | 2 +- yarn.lock | 68 +--------------------------------------------------- 2 files changed, 2 insertions(+), 68 deletions(-) diff --git a/package.json b/package.json index a5677e0154..b0760c50eb 100644 --- a/package.json +++ b/package.json @@ -202,6 +202,7 @@ "filehound": "^1.17.4", "fs-extra": "^9.0.1", "glob-to-regexp": "^0.4.1", + "got": "^11.8.2", "grapheme-splitter": "^1.0.4", "handlebars": "^4.7.7", "http-proxy": "^1.18.1", @@ -224,7 +225,6 @@ "node-fetch": "^2.6.1", "node-pty": "^0.10.1", "npm": "^6.14.15", - "openid-client": "^3.15.2", "p-limit": "^3.1.0", "path-to-regexp": "^6.2.0", "proper-lockfile": "^4.1.2", diff --git a/yarn.lock b/yarn.lock index be0a206792..6a6f10a18c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1503,15 +1503,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/got@^9.6.9": - version "9.6.11" - resolved "https://registry.yarnpkg.com/@types/got/-/got-9.6.11.tgz#482b402cc5ee459481aeeadb08142ebb1a9afb26" - integrity sha512-dr3IiDNg5TDesGyuwTrN77E1Cd7DCdmCFtEfSGqr83jMMtcwhf/SGPbN2goY4JUWQfvxwY56+e5tjfi+oXeSdA== - dependencies: - "@types/node" "*" - "@types/tough-cookie" "*" - form-data "^2.5.0" - "@types/graceful-fs@^4.1.2": version "4.1.3" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" @@ -2554,14 +2545,6 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - aggregate-error@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -3109,11 +3092,6 @@ base64-js@^1.5.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64url@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" - integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== - base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -6708,7 +6686,7 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -got@^11.8.0: +got@^11.8.0, got@^11.8.2: version "11.8.2" resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ== @@ -8412,13 +8390,6 @@ joi@^17.3.0, joi@^17.4.2: "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" -jose@^1.27.1: - version "1.27.1" - resolved "https://registry.yarnpkg.com/jose/-/jose-1.27.1.tgz#a1de2ecb5b3ae1ae28f0d9d0cc536349ada27ec8" - integrity sha512-VyHM6IJPw0TTGqHVNlPWg16/ASDPAmcChcLqSb3WNBvwWFoWPeFqlmAUCm8/oIG1GjZwAlUDuRKFfycowarcVA== - dependencies: - "@panva/asn1.js" "^1.0.0" - jose@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/jose/-/jose-2.0.5.tgz#29746a18d9fff7dcf9d5d2a6f62cb0c7cd27abd3" @@ -10430,11 +10401,6 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -oidc-token-hash@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.0.tgz#acdfb1f4310f58e64d5d74a4e8671a426986e888" - integrity sha512-8Yr4CZSv+Tn8ZkN3iN2i2w2G92mUKClp4z7EGUfdsERiYSbj7P4i/NHm72ft+aUdsiFx9UdIPSTwbyzQ6C4URg== - oidc-token-hash@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz#ae6beec3ec20f0fd885e5400d175191d6e2f10c6" @@ -10492,22 +10458,6 @@ opener@^1.5.2: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -openid-client@^3.15.2: - version "3.15.2" - resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-3.15.2.tgz#d48a6d7991d5d6117f4598bb1d19399262164128" - integrity sha512-50aBsfiSZds48ec/VvUZ3hwtpEW0L5s7gGxlsJSvo5mAeK4TG3gv0VRWI+SvCAae4MEwRegLJD3YjpkJMLi2GQ== - dependencies: - "@types/got" "^9.6.9" - base64url "^3.0.1" - got "^9.6.0" - jose "^1.27.1" - lodash "^4.17.15" - lru-cache "^5.1.1" - make-error "^1.3.6" - object-hash "^2.0.1" - oidc-token-hash "^5.0.0" - p-any "^3.0.0" - openid-client@^4.1.1: version "4.7.4" resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-4.7.4.tgz#bd9978456d53d38adb89856b14a8fbd094f7732e" @@ -10591,14 +10541,6 @@ osenv@^0.1.4, osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-any@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-any/-/p-any-3.0.0.tgz#79847aeed70b5d3a10ea625296c0c3d2e90a87b9" - integrity sha512-5rqbqfsRWNb0sukt0awwgJMlaep+8jV45S15SKKB34z4UuzjcofIfnriCBhWjZP2jbVtjt9yRl7buB6RlKsu9w== - dependencies: - p-cancelable "^2.0.0" - p-some "^5.0.0" - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -10680,14 +10622,6 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" -p-some@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-some/-/p-some-5.0.0.tgz#8b730c74b4fe5169d7264a240ad010b6ebc686a4" - integrity sha512-Js5XZxo6vHjB9NOYAzWDYAIyyiPvva0DWESAIWIK7uhSpGsyg5FwUPxipU/SOQx5x9EqhOh545d1jo6cVkitig== - dependencies: - aggregate-error "^3.0.0" - p-cancelable "^2.0.0" - p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" From a5b432bff08b2af1b33fad01e8551e3d6f8a6e45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Oct 2021 09:10:24 -0400 Subject: [PATCH 84/88] Bump tcp-port-used from 1.0.1 to 1.0.2 (#3992) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 41 +++++++++++++++++++++++------------------ 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index b0760c50eb..bbd212e02e 100644 --- a/package.json +++ b/package.json @@ -243,7 +243,7 @@ "shell-env": "^3.0.1", "spdy": "^4.0.2", "tar": "^6.1.10", - "tcp-port-used": "^1.0.1", + "tcp-port-used": "^1.0.2", "tempy": "1.0.1", "url-parse": "^1.5.3", "uuid": "^8.3.2", diff --git a/yarn.lock b/yarn.lock index 6a6f10a18c..9aab21279b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4626,12 +4626,12 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: dependencies: ms "2.1.2" -debug@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" - integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== +debug@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: - ms "^2.1.1" + ms "2.1.2" debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.6: version "3.2.7" @@ -7412,6 +7412,11 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= +ip-regex@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + ip@1.1.5, ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -7842,7 +7847,7 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-url@^1.2.2: +is-url@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== @@ -7874,14 +7879,14 @@ is-yarn-global@^0.3.0: resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -is2@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.1.tgz#8ac355644840921ce435d94f05d3a94634d3481a" - integrity sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA== +is2@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.7.tgz#d084e10cab3bd45d6c9dfde7a48599fcbb93fcac" + integrity sha512-4vBQoURAXC6hnLFxD4VW7uc04XiwTTl/8ydYJxKvPwkWQrSjInkuM5VZVg6BGr1/natq69zDuvO9lGpLClJqvA== dependencies: deep-is "^0.1.3" - ip-regex "^2.1.0" - is-url "^1.2.2" + ip-regex "^4.1.0" + is-url "^1.2.4" isarray@0.0.1: version "0.0.1" @@ -13403,13 +13408,13 @@ tar@^6.0.2, tar@^6.1.10: mkdirp "^1.0.3" yallist "^4.0.0" -tcp-port-used@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.1.tgz#46061078e2d38c73979a2c2c12b5a674e6689d70" - integrity sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q== +tcp-port-used@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.2.tgz#9652b7436eb1f4cfae111c79b558a25769f6faea" + integrity sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA== dependencies: - debug "4.1.0" - is2 "2.0.1" + debug "4.3.1" + is2 "^2.0.6" temp-dir@^2.0.0: version "2.0.0" From 40835ae3a23a3cc0e7b832c08eca08dcc22a6bfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Oct 2021 09:10:44 -0400 Subject: [PATCH 85/88] Bump @types/proper-lockfile from 4.1.1 to 4.1.2 (#3991) 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 bbd212e02e..4a80f58d98 100644 --- a/package.json +++ b/package.json @@ -291,7 +291,7 @@ "@types/node-fetch": "^2.5.12", "@types/npm": "^2.0.32", "@types/progress-bar-webpack-plugin": "^2.1.2", - "@types/proper-lockfile": "^4.1.1", + "@types/proper-lockfile": "^4.1.2", "@types/randomcolor": "^0.5.6", "@types/react": "^17.0.0", "@types/react-beautiful-dnd": "^13.1.1", diff --git a/yarn.lock b/yarn.lock index 9aab21279b..00f0b29fae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1798,10 +1798,10 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/proper-lockfile@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@types/proper-lockfile/-/proper-lockfile-4.1.1.tgz#99f026cbfdbe6305bdd454ffd5fefc1bd064beb1" - integrity sha512-HAjVfDa73pFgivViHyDu8HHHcds+W4MgOuZZAdyFJrHS8ngtCXmhl4hc2YXqSOwO6Bsa+iF2Sgxb2+gv874VOQ== +"@types/proper-lockfile@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@types/proper-lockfile/-/proper-lockfile-4.1.2.tgz#49537cee7134055ee13a1833b76a1c298f39bb26" + integrity sha512-kd4LMvcnpYkspDcp7rmXKedn8iJSCoa331zRRamUp5oanKt/CefbEGPQP7G89enz7sKD4bvsr8mHSsC8j5WOvA== dependencies: "@types/retry" "*" From 0cd3931d671dfceaa5834db12d3b96b942f955be Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 8 Oct 2021 09:15:40 -0400 Subject: [PATCH 86/88] Don't run store migrations on renderer (#3968) --- src/common/base-store.ts | 4 ++++ src/common/user-store/user-store.ts | 8 ++++++-- src/migrations/user-store/file-name-migration.ts | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/common/base-store.ts b/src/common/base-store.ts index 54f6d2a5a2..c5fc7383b1 100644 --- a/src/common/base-store.ts +++ b/src/common/base-store.ts @@ -46,6 +46,10 @@ export abstract class BaseStore extends Singleton { protected constructor(protected params: BaseStoreParams) { super(); makeObservable(this); + + if (ipcRenderer) { + params.migrations = undefined; // don't run migrations on renderer + } } /** diff --git a/src/common/user-store/user-store.ts b/src/common/user-store/user-store.ts index 8cababf3c6..1bd18e06e8 100644 --- a/src/common/user-store/user-store.ts +++ b/src/common/user-store/user-store.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { app } from "electron"; +import { app, ipcMain } from "electron"; import semver from "semver"; import { action, computed, observable, reaction, makeObservable } from "mobx"; import { BaseStore } from "../base-store"; @@ -48,7 +48,11 @@ export class UserStore extends BaseStore /* implements UserStore }); makeObservable(this); - fileNameMigration(); + + if (ipcMain) { + fileNameMigration(); + } + this.load(); } diff --git a/src/migrations/user-store/file-name-migration.ts b/src/migrations/user-store/file-name-migration.ts index 10d7a7c99b..932e542642 100644 --- a/src/migrations/user-store/file-name-migration.ts +++ b/src/migrations/user-store/file-name-migration.ts @@ -19,12 +19,12 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +import { app } from "electron"; import fse from "fs-extra"; import path from "path"; -import { getPath } from "../../common/utils/getPath"; export function fileNameMigration() { - const userDataPath = getPath("userData"); + const userDataPath = app.getPath("userData"); const configJsonPath = path.join(userDataPath, "config.json"); const lensUserStoreJsonPath = path.join(userDataPath, "lens-user-store.json"); From 7193231422aaffd8ea1f16c5aadf757490fd5ad1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Oct 2021 09:47:43 -0400 Subject: [PATCH 87/88] Bump typescript from 4.3.2 to 4.4.3 (#3993) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 4a80f58d98..76f572cde7 100644 --- a/package.json +++ b/package.json @@ -382,7 +382,7 @@ "typedoc": "0.22.5", "typedoc-plugin-markdown": "^3.9.0", "typeface-roboto": "^1.1.13", - "typescript": "^4.3.2", + "typescript": "^4.4.3", "typescript-plugin-css-modules": "^3.4.0", "url-loader": "^4.1.1", "webpack": "^4.46.0", diff --git a/yarn.lock b/yarn.lock index 00f0b29fae..a47235cad4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13901,15 +13901,10 @@ typescript-plugin-css-modules@^3.4.0: stylus "^0.54.8" tsconfig-paths "^3.9.0" -typescript@^4.0.3: - version "4.1.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.2.tgz#6369ef22516fe5e10304aae5a5c4862db55380e9" - integrity sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ== - -typescript@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" - integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== +typescript@^4.0.3, typescript@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== uglify-js@^3.1.4: version "3.9.4" From a3765211de7817923326f9db4eca585b4b514537 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Oct 2021 12:26:54 -0400 Subject: [PATCH 88/88] Bump ts-node from 10.1.0 to 10.2.1 (#3994) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 48 +++++++++++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 76f572cde7..e8288fde7b 100644 --- a/package.json +++ b/package.json @@ -376,7 +376,7 @@ "tailwindcss": "^2.2.4", "ts-jest": "26.5.6", "ts-loader": "^7.0.5", - "ts-node": "^10.1.0", + "ts-node": "^10.2.1", "type-fest": "^1.0.2", "typed-emitter": "^1.3.1", "typedoc": "0.22.5", diff --git a/yarn.lock b/yarn.lock index a47235cad4..02d9b55fff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -325,6 +325,18 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" + integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + "@dabh/diagnostics@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31" @@ -1284,7 +1296,7 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== -"@tsconfig/node16@^1.0.1": +"@tsconfig/node16@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== @@ -2492,15 +2504,15 @@ acorn-node@^1.6.1: acorn-walk "^7.0.0" xtend "^4.0.2" -acorn-walk@^7.0.0: +acorn-walk@^7.0.0, acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" - integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^6.4.1: version "6.4.1" @@ -2512,10 +2524,10 @@ acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4: - version "8.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" - integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== +acorn@^8.2.4, acorn@^8.4.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" + integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== agent-base@4, agent-base@^4.3.0: version "4.3.0" @@ -12777,7 +12789,7 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" -source-map-support@^0.5.17, source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@~0.5.12: +source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -13715,20 +13727,22 @@ ts-loader@^7.0.5: micromatch "^4.0.0" semver "^6.0.0" -ts-node@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.1.0.tgz#e656d8ad3b61106938a867f69c39a8ba6efc966e" - integrity sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA== +ts-node@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5" + integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw== dependencies: + "@cspotcode/source-map-support" "0.6.1" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.1" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" arg "^4.1.0" create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - source-map-support "^0.5.17" yn "3.1.1" tsconfig-paths@^3.9.0: