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 (
+
);
From 0c2140de8f62c554078d94f9494a582ac3876814 Mon Sep 17 00:00:00 2001
From: Korvin Szanto
Date: Mon, 4 Oct 2021 08:50:40 -0700
Subject: [PATCH 55/88] Make editor editable when user-supplied values is
selected (#3776)
---
src/renderer/components/+apps-releases/release-details.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/renderer/components/+apps-releases/release-details.tsx b/src/renderer/components/+apps-releases/release-details.tsx
index 74c9875e91..4af4af4b0f 100644
--- a/src/renderer/components/+apps-releases/release-details.tsx
+++ b/src/renderer/components/+apps-releases/release-details.tsx
@@ -165,7 +165,7 @@ export class ReleaseDetails extends Component {
onChange={text => this.values = text}
theme={ThemeStore.getInstance().activeTheme.monacoTheme}
className={cssNames("MonacoEditor", {loading: valuesLoading})}
- options={{readOnly: valuesLoading || this.showOnlyUserSuppliedValues, ...UserStore.getInstance().getEditorOptions()}}
+ options={{readOnly: valuesLoading, ...UserStore.getInstance().getEditorOptions()}}
>
{valuesLoading && }
From e3a112b955faae2d44beed5f7771ac5a77533403 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 4 Oct 2021 13:14:36 -0400
Subject: [PATCH 56/88] Bump @types/webpack-env from 1.15.2 to 1.16.2 (#3949)
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 a894ec4ce1..df894e18e7 100644
--- a/package.json
+++ b/package.json
@@ -315,7 +315,7 @@
"@types/webdriverio": "^4.13.0",
"@types/webpack": "^4.41.17",
"@types/webpack-dev-server": "^3.11.6",
- "@types/webpack-env": "^1.15.2",
+ "@types/webpack-env": "^1.16.2",
"@types/webpack-node-externals": "^1.7.1",
"@typescript-eslint/eslint-plugin": "^4.29.0",
"@typescript-eslint/parser": "^4.29.1",
diff --git a/yarn.lock b/yarn.lock
index 40dc36732b..03e99280bb 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2137,10 +2137,10 @@
"@types/webpack" "^4"
http-proxy-middleware "^1.0.0"
-"@types/webpack-env@^1.15.2":
- version "1.15.2"
- resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.2.tgz#927997342bb9f4a5185a86e6579a0a18afc33b0a"
- integrity sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ==
+"@types/webpack-env@^1.16.2":
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.2.tgz#8db514b059c1b2ae14ce9d7bb325296de6a9a0fa"
+ integrity sha512-vKx7WNQNZDyJveYcHAm9ZxhqSGLYwoyLhrHjLBOkw3a7cT76sTdjgtwyijhk1MaHyRIuSztcVwrUOO/NEu68Dw==
"@types/webpack-node-externals@^1.7.1":
version "1.7.1"
From 220c775d77e5f06bfbf5a2281f8cea0d46470c30 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 4 Oct 2021 13:14:47 -0400
Subject: [PATCH 57/88] Bump @types/webpack from 4.41.30 to 4.41.31 (#3948)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
yarn.lock | 25 ++++++-------------------
2 files changed, 7 insertions(+), 20 deletions(-)
diff --git a/package.json b/package.json
index df894e18e7..b188670e86 100644
--- a/package.json
+++ b/package.json
@@ -313,7 +313,7 @@
"@types/url-parse": "^1.4.3",
"@types/uuid": "^8.3.1",
"@types/webdriverio": "^4.13.0",
- "@types/webpack": "^4.41.17",
+ "@types/webpack": "^4.41.31",
"@types/webpack-dev-server": "^3.11.6",
"@types/webpack-env": "^1.16.2",
"@types/webpack-node-externals": "^1.7.1",
diff --git a/yarn.lock b/yarn.lock
index 03e99280bb..5010980d15 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1755,12 +1755,7 @@
"@types/node" "*"
form-data "^3.0.0"
-"@types/node@*", "@types/node@^14.6.2":
- version "14.17.5"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.5.tgz#b59daf6a7ffa461b5648456ca59050ba8e40ed54"
- integrity sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==
-
-"@types/node@14.17.14":
+"@types/node@*", "@types/node@14.17.14", "@types/node@^14.6.2":
version "14.17.14"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.14.tgz#6fda9785b41570eb628bac27be4b602769a3f938"
integrity sha512-rsAj2u8Xkqfc332iXV12SqIsjVi07H479bOP4q94NAcjzmAvapumEhuVIt53koEf7JFrpjgNKjBga5Pnn/GL8A==
@@ -2158,10 +2153,10 @@
"@types/source-list-map" "*"
source-map "^0.7.3"
-"@types/webpack@*", "@types/webpack@^4", "@types/webpack@^4.41.17", "@types/webpack@^4.41.8":
- version "4.41.30"
- resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.30.tgz#fd3db6d0d41e145a8eeeafcd3c4a7ccde9068ddc"
- integrity sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA==
+"@types/webpack@*", "@types/webpack@^4", "@types/webpack@^4.41.31", "@types/webpack@^4.41.8":
+ version "4.41.31"
+ resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.31.tgz#c35f252a3559ddf9c85c0d8b0b42019025e581aa"
+ integrity sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==
dependencies:
"@types/node" "*"
"@types/tapable" "^1"
@@ -2706,7 +2701,7 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
-anymatch@^3.0.0, anymatch@~3.1.2:
+anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
@@ -2714,14 +2709,6 @@ anymatch@^3.0.0, anymatch@~3.1.2:
normalize-path "^3.0.0"
picomatch "^2.0.4"
-anymatch@^3.0.3:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
- integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
app-builder-bin@3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.7.1.tgz#cb0825c5e12efc85b196ac3ed9c89f076c61040e"
From 1d045ec62cf0b76e7e9a7942da2e95bace9794ed Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 4 Oct 2021 13:14:59 -0400
Subject: [PATCH 58/88] Bump deepdash from 5.3.5 to 5.3.9 (#3947)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
yarn.lock | 14 +++++++-------
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/package.json b/package.json
index b188670e86..0f4a15ede2 100644
--- a/package.json
+++ b/package.json
@@ -325,7 +325,7 @@
"color": "^3.1.2",
"concurrently": "^5.2.0",
"css-loader": "^5.2.7",
- "deepdash": "^5.3.5",
+ "deepdash": "^5.3.9",
"dompurify": "^2.3.1",
"electron": "^13.5.1",
"electron-builder": "^22.11.11",
diff --git a/yarn.lock b/yarn.lock
index 5010980d15..9445119ce6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4719,13 +4719,13 @@ deep-is@^0.1.3, deep-is@~0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
-deepdash@^5.3.5:
- version "5.3.5"
- resolved "https://registry.yarnpkg.com/deepdash/-/deepdash-5.3.5.tgz#611bec9c1f2829832d21971dcbefe712e408647d"
- integrity sha512-1ZdPPCI1pCEqeAWGSw+Nbpb/2iIV4w3sGPc22H/PDtcApb8+psTzPIoOVD040iBaT2wqZab29Kjrz6G+cd5mqQ==
+deepdash@^5.3.9:
+ version "5.3.9"
+ resolved "https://registry.yarnpkg.com/deepdash/-/deepdash-5.3.9.tgz#2aa92570d7b1787ed281e2fafe0be24df00ddfe4"
+ integrity sha512-GRzJ0q9PDj2T+J2fX+b+TlUa2NlZ11l6vJ8LHNKVGeZ8CfxCuJaCychTq07iDRTvlfO8435jlvVS1QXBrW9kMg==
dependencies:
- lodash "^4.17.20"
- lodash-es "^4.17.20"
+ lodash "^4.17.21"
+ lodash-es "^4.17.21"
deepmerge@^4.2.2:
version "4.2.2"
@@ -9139,7 +9139,7 @@ lockfile@^1.0.4:
dependencies:
signal-exit "^3.0.2"
-lodash-es@^4.17.20:
+lodash-es@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
From 2ff91b0ecf7be6edd4c36090b8cc622ec05bcfe5 Mon Sep 17 00:00:00 2001
From: Gabriel Henriques
Date: Mon, 4 Oct 2021 14:15:08 -0300
Subject: [PATCH 59/88] Added tooltipOnParentHover to taint tooltip on nodes
list page (#3939)
Co-authored-by: gabriel.henriques gabriel.henriques
---
src/renderer/components/+nodes/nodes.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/renderer/components/+nodes/nodes.tsx b/src/renderer/components/+nodes/nodes.tsx
index e8a70b99d0..1b1b9c18c0 100644
--- a/src/renderer/components/+nodes/nodes.tsx
+++ b/src/renderer/components/+nodes/nodes.tsx
@@ -236,7 +236,7 @@ export class Nodes extends React.Component {
this.renderDiskUsage(node),
<>
{node.getTaints().length}
-
+
{node.getTaints().map(({ key, effect }) => `${key}: ${effect}`).join("\n")}
>,
From f2c623f89e3973401817d35db5fe76ce6eb17341 Mon Sep 17 00:00:00 2001
From: Sebastian Malton
Date: Mon, 4 Oct 2021 14:32:15 -0400
Subject: [PATCH 60/88] Specify tableId for DeploymentReplicaSets (#3950)
---
.../components/+workloads-deployments/deployment-replicasets.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/renderer/components/+workloads-deployments/deployment-replicasets.tsx b/src/renderer/components/+workloads-deployments/deployment-replicasets.tsx
index e332b19fe8..13770b0abf 100644
--- a/src/renderer/components/+workloads-deployments/deployment-replicasets.tsx
+++ b/src/renderer/components/+workloads-deployments/deployment-replicasets.tsx
@@ -75,6 +75,7 @@ export class DeploymentReplicaSets extends React.Component {
sortable={this.sortingCallbacks}
sortByDefault={{ sortBy: sortBy.pods, orderBy: "desc" }}
sortSyncWithUrl={false}
+ tableId="deployment_replica_sets_view"
className="box grow"
>
From 8b1de233f22a9fcd7a4be3aa46f450fc1ec6f17f Mon Sep 17 00:00:00 2001
From: Sebastian Malton
Date: Mon, 4 Oct 2021 14:38:14 -0400
Subject: [PATCH 61/88] Don't override entity source on cluster icons (#3928)
---
src/main/cluster-manager.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/main/cluster-manager.ts b/src/main/cluster-manager.ts
index 307b4592f1..a5c9179499 100644
--- a/src/main/cluster-manager.ts
+++ b/src/main/cluster-manager.ts
@@ -131,11 +131,11 @@ export class ClusterManager extends Singleton {
entity.spec.metrics.prometheus = prometheus;
}
+ // Only set the icon if the preference is set. If the preference is not set
+ // then let the source determine if a cluster has an icon.
if (cluster.preferences.icon) {
entity.spec.icon ??= {};
entity.spec.icon.src = cluster.preferences.icon;
- } else {
- entity.spec.icon = null;
}
catalogEntityRegistry.items.splice(index, 1, entity);
From 4705a66632a7a4402f904f698869d3ce21bcec57 Mon Sep 17 00:00:00 2001
From: Sebastian Malton
Date: Mon, 4 Oct 2021 16:28:19 -0400
Subject: [PATCH 62/88] Use JSON patch for editing components (#3674)
---
package.json | 1 +
.../k8s-api/endpoints/resource-applier.api.ts | 34 ++++---
src/common/k8s-api/kube-object.store.ts | 21 +++--
src/common/k8s-api/kube-object.ts | 59 ++++++++----
src/main/resource-applier.ts | 89 ++++++++++++++-----
src/main/router.ts | 1 +
src/main/routes/resource-applier-route.ts | 14 ++-
src/main/utils/http-responses.ts | 27 +++++-
.../+config-maps/config-map-details.tsx | 2 +
.../deployment-scale-dialog.test.tsx | 1 +
.../replicaset-scale-dialog.test.tsx | 1 +
.../statefulset-scale-dialog.test.tsx | 1 +
.../components/dock/create-resource.tsx | 48 +++++-----
.../components/dock/edit-resource.store.ts | 5 ++
.../components/dock/edit-resource.tsx | 26 +++---
src/renderer/components/dock/editor-panel.tsx | 5 +-
.../kube-object-menu/kube-object-menu.tsx | 8 +-
yarn.lock | 5 ++
18 files changed, 242 insertions(+), 106 deletions(-)
diff --git a/package.json b/package.json
index 0f4a15ede2..286ac7f97a 100644
--- a/package.json
+++ b/package.json
@@ -237,6 +237,7 @@
"readable-stream": "^3.6.0",
"request": "^2.88.2",
"request-promise-native": "^1.0.9",
+ "rfc6902": "^4.0.2",
"semver": "^7.3.2",
"serializr": "^2.0.5",
"shell-env": "^3.0.1",
diff --git a/src/common/k8s-api/endpoints/resource-applier.api.ts b/src/common/k8s-api/endpoints/resource-applier.api.ts
index b6a35d3a60..14b5d5ad46 100644
--- a/src/common/k8s-api/endpoints/resource-applier.api.ts
+++ b/src/common/k8s-api/endpoints/resource-applier.api.ts
@@ -22,19 +22,27 @@
import jsYaml from "js-yaml";
import type { KubeJsonApiData } from "../kube-json-api";
import { apiBase } from "../index";
+import type { Patch } from "rfc6902";
-export const resourceApplierApi = {
- annotations: [
- "kubectl.kubernetes.io/last-applied-configuration"
- ],
+export const annotations = [
+ "kubectl.kubernetes.io/last-applied-configuration"
+];
- async update(resource: object | string): Promise {
- if (typeof resource === "string") {
- resource = jsYaml.safeLoad(resource);
- }
-
- const [data = null] = await apiBase.post("/stack", { data: resource });
-
- return data;
+export async function update(resource: object | string): Promise {
+ if (typeof resource === "string") {
+ resource = jsYaml.safeLoad(resource);
}
-};
+
+ return apiBase.post("/stack", { data: resource });
+}
+
+export async function patch(name: string, kind: string, ns: string, patch: Patch): Promise {
+ return apiBase.patch("/stack", {
+ data: {
+ name,
+ kind,
+ ns,
+ patch,
+ },
+ });
+}
diff --git a/src/common/k8s-api/kube-object.store.ts b/src/common/k8s-api/kube-object.store.ts
index f90eaab8e5..7c8118da1f 100644
--- a/src/common/k8s-api/kube-object.store.ts
+++ b/src/common/k8s-api/kube-object.store.ts
@@ -32,6 +32,7 @@ import { parseKubeApi } from "./kube-api-parse";
import type { KubeJsonApiData } from "./kube-json-api";
import type { RequestInit } from "node-fetch";
import AbortController from "abort-controller";
+import type { Patch } from "rfc6902";
export interface KubeObjectStoreLoadingParams {
namespaces: string[];
@@ -279,19 +280,29 @@ export abstract class KubeObjectStore extends ItemStore
return newItem;
}
- async update(item: T, data: Partial): Promise {
- const rawItem = await item.update(data);
+ private postUpdate(rawItem: KubeJsonApiData): T {
const newItem = new this.api.objectConstructor(rawItem);
+ const index = this.items.findIndex(item => item.getId() === newItem.getId());
ensureObjectSelfLink(this.api, newItem);
- const index = this.items.findIndex(item => item.getId() === newItem.getId());
-
- this.items.splice(index, 1, newItem);
+ if (index < 0) {
+ this.items.push(newItem);
+ } else {
+ this.items[index] = newItem;
+ }
return newItem;
}
+ async patch(item: T, patch: Patch): Promise {
+ return this.postUpdate(await item.patch(patch));
+ }
+
+ async update(item: T, data: Partial): Promise {
+ return this.postUpdate(await item.update(data));
+ }
+
async remove(item: T) {
await item.delete();
this.items.remove(item);
diff --git a/src/common/k8s-api/kube-object.ts b/src/common/k8s-api/kube-object.ts
index c1e40eb2e5..bcbe6bf05f 100644
--- a/src/common/k8s-api/kube-object.ts
+++ b/src/common/k8s-api/kube-object.ts
@@ -27,9 +27,9 @@ import { autoBind, formatDuration } from "../utils";
import type { ItemObject } from "../item.store";
import { apiKube } from "./index";
import type { JsonApiParams } from "./json-api";
-import { resourceApplierApi } from "./endpoints/resource-applier.api";
+import * as resourceApplierApi from "./endpoints/resource-applier.api";
import { hasOptionalProperty, hasTypedProperty, isObject, isString, bindPredicate, isTypedArray, isRecord } from "../../common/utils/type-narrowing";
-import _ from "lodash";
+import type { Patch } from "rfc6902";
export type KubeObjectConstructor = (new (data: KubeJsonApiData | any) => K) & {
kind?: string;
@@ -191,18 +191,28 @@ export class KubeObject `${name}=${value}`);
}
- protected static readonly nonEditableFields = [
- "apiVersion",
- "kind",
- "metadata.name",
- "metadata.selfLink",
- "metadata.resourceVersion",
- "metadata.uid",
- "managedFields",
- "status",
+ /**
+ * These must be RFC6902 compliant paths
+ */
+ private static readonly nonEditiablePathPrefixes = [
+ "/metadata/managedFields",
+ "/status",
];
+ private static readonly nonEditablePaths = new Set([
+ "/apiVersion",
+ "/kind",
+ "/metadata/name",
+ "/metadata/selfLink",
+ "/metadata/resourceVersion",
+ "/metadata/uid",
+ ...KubeObject.nonEditiablePathPrefixes,
+ ]);
constructor(data: KubeJsonApiData) {
+ if (typeof data !== "object") {
+ throw new TypeError(`Cannot create a KubeObject from ${typeof data}`);
+ }
+
Object.assign(this, data);
autoBind(this);
}
@@ -286,14 +296,31 @@ export class KubeObject): Promise {
- for (const field of KubeObject.nonEditableFields) {
- if (!_.isEqual(_.get(this, field), _.get(data, field))) {
- throw new Error(`Failed to update Kube Object: ${field} has been modified`);
+ async patch(patch: Patch): Promise {
+ for (const op of patch) {
+ if (KubeObject.nonEditablePaths.has(op.path)) {
+ throw new Error(`Failed to update ${this.kind}: JSON pointer ${op.path} has been modified`);
+ }
+
+ for (const pathPrefix of KubeObject.nonEditiablePathPrefixes) {
+ if (op.path.startsWith(`${pathPrefix}/`)) {
+ throw new Error(`Failed to update ${this.kind}: Child JSON pointer of ${op.path} has been modified`);
+ }
}
}
+ return resourceApplierApi.patch(this.getName(), this.kind, this.getNs(), patch);
+ }
+
+ /**
+ * Perform a full update (or more specifically a replace)
+ *
+ * Note: this is brittle if `data` is not actually partial (but instead whole).
+ * As fields such as `resourceVersion` will probably out of date. This is a
+ * common race condition.
+ */
+ async update(data: Partial): Promise {
+ // use unified resource-applier api for updating all k8s objects
return resourceApplierApi.update({
...this.toPlainObject(),
...data,
diff --git a/src/main/resource-applier.ts b/src/main/resource-applier.ts
index f4772c5275..a305ff1091 100644
--- a/src/main/resource-applier.ts
+++ b/src/main/resource-applier.ts
@@ -22,55 +22,96 @@
import type { Cluster } from "./cluster";
import type { KubernetesObject } from "@kubernetes/client-node";
import { exec } from "child_process";
-import fs from "fs";
+import fs from "fs-extra";
import * as yaml from "js-yaml";
import path from "path";
import * as tempy from "tempy";
import logger from "./logger";
import { appEventBus } from "../common/event-bus";
import { cloneJsonObject } from "../common/utils";
+import type { Patch } from "rfc6902";
+import { promiseExecFile } from "./promise-exec";
export class ResourceApplier {
- constructor(protected cluster: Cluster) {
+ constructor(protected cluster: Cluster) {}
+
+ /**
+ * Patch a kube resource's manifest, throwing any error that occurs.
+ * @param name The name of the kube resource
+ * @param kind The kind of the kube resource
+ * @param patch The list of JSON operations
+ * @param ns The optional namespace of the kube resource
+ */
+ async patch(name: string, kind: string, patch: Patch, ns?: string): Promise {
+ appEventBus.emit({ name: "resource", action: "patch" });
+
+ const kubectl = await this.cluster.ensureKubectl();
+ const kubectlPath = await kubectl.getPath();
+ const proxyKubeconfigPath = await this.cluster.getProxyKubeconfigPath();
+ const args = [
+ "--kubeconfig", proxyKubeconfigPath,
+ "patch",
+ kind,
+ name,
+ ];
+
+ if (ns) {
+ args.push("--namespace", ns);
+ }
+
+ args.push(
+ "--type", "json",
+ "--patch", JSON.stringify(patch),
+ "-o", "json"
+ );
+
+ try {
+ const { stdout } = await promiseExecFile(kubectlPath, args);
+
+ return stdout;
+ } catch (error) {
+ throw error.stderr ?? error;
+ }
}
async apply(resource: KubernetesObject | any): Promise {
resource = this.sanitizeObject(resource);
appEventBus.emit({ name: "resource", action: "apply" });
- return await this.kubectlApply(yaml.safeDump(resource));
+ return this.kubectlApply(yaml.safeDump(resource));
}
protected async kubectlApply(content: string): Promise {
const kubectl = await this.cluster.ensureKubectl();
const kubectlPath = await kubectl.getPath();
const proxyKubeconfigPath = await this.cluster.getProxyKubeconfigPath();
+ const fileName = tempy.file({ name: "resource.yaml" });
+ const args = [
+ "apply",
+ "--kubeconfig", proxyKubeconfigPath,
+ "-o", "json",
+ "-f", fileName,
+ ];
- return new Promise((resolve, reject) => {
- const fileName = tempy.file({ name: "resource.yaml" });
+ logger.debug(`shooting manifests with ${kubectlPath}`, { args });
- fs.writeFileSync(fileName, content);
- const cmd = `"${kubectlPath}" apply --kubeconfig "${proxyKubeconfigPath}" -o json -f "${fileName}"`;
+ const execEnv = { ...process.env };
+ const httpsProxy = this.cluster.preferences?.httpsProxy;
- logger.debug(`shooting manifests with: ${cmd}`);
- const execEnv: NodeJS.ProcessEnv = Object.assign({}, process.env);
- const httpsProxy = this.cluster.preferences?.httpsProxy;
+ if (httpsProxy) {
+ execEnv.HTTPS_PROXY = httpsProxy;
+ }
- if (httpsProxy) {
- execEnv["HTTPS_PROXY"] = httpsProxy;
- }
- exec(cmd, { env: execEnv },
- (error, stdout, stderr) => {
- if (stderr != "") {
- fs.unlinkSync(fileName);
- reject(stderr);
+ try {
+ await fs.writeFile(fileName, content);
+ const { stdout } = await promiseExecFile(kubectlPath, args);
- return;
- }
- fs.unlinkSync(fileName);
- resolve(JSON.parse(stdout));
- });
- });
+ return stdout;
+ } catch (error) {
+ throw error?.stderr ?? error;
+ } finally {
+ await fs.unlink(fileName);
+ }
}
public async kubectlApplyAll(resources: string[], extraArgs = ["-o", "json"]): Promise {
diff --git a/src/main/router.ts b/src/main/router.ts
index 50175aa9de..d758cc2314 100644
--- a/src/main/router.ts
+++ b/src/main/router.ts
@@ -198,5 +198,6 @@ export class Router {
// Resource Applier API
this.router.add({ method: "post", path: `${apiPrefix}/stack` }, ResourceApplierApiRoute.applyResource);
+ this.router.add({ method: "patch", path: `${apiPrefix}/stack` }, ResourceApplierApiRoute.patchResource);
}
}
diff --git a/src/main/routes/resource-applier-route.ts b/src/main/routes/resource-applier-route.ts
index cb716cf1f5..0adf916188 100644
--- a/src/main/routes/resource-applier-route.ts
+++ b/src/main/routes/resource-applier-route.ts
@@ -30,7 +30,19 @@ export class ResourceApplierApiRoute {
try {
const resource = await new ResourceApplier(cluster).apply(payload);
- respondJson(response, [resource], 200);
+ respondJson(response, resource, 200);
+ } catch (error) {
+ respondText(response, error, 422);
+ }
+ }
+
+ static async patchResource(request: LensApiRequest) {
+ const { response, cluster, payload } = request;
+
+ try {
+ const resource = await new ResourceApplier(cluster).patch(payload.name, payload.kind, payload.patch, payload.ns);
+
+ respondJson(response, resource, 200);
} catch (error) {
respondText(response, error, 422);
}
diff --git a/src/main/utils/http-responses.ts b/src/main/utils/http-responses.ts
index 36287806f1..5d57b6dd76 100644
--- a/src/main/utils/http-responses.ts
+++ b/src/main/utils/http-responses.ts
@@ -21,14 +21,37 @@
import type http from "http";
-export function respondJson(res: http.ServerResponse, content: any, status = 200) {
- respond(res, JSON.stringify(content), "application/json", status);
+/**
+ * Respond to a HTTP request with a body of JSON data
+ * @param res The HTTP response to write data to
+ * @param content The data or its JSON stringified version of it
+ * @param status [200] The status code to respond with
+ */
+export function respondJson(res: http.ServerResponse, content: Object | string, status = 200) {
+ const normalizedContent = typeof content === "object"
+ ? JSON.stringify(content)
+ : content;
+
+ respond(res, normalizedContent, "application/json", status);
}
+/**
+ * Respond to a HTTP request with a body of plain text data
+ * @param res The HTTP response to write data to
+ * @param content The string data to respond with
+ * @param status [200] The status code to respond with
+ */
export function respondText(res: http.ServerResponse, content: string, status = 200) {
respond(res, content, "text/plain", status);
}
+/**
+ * Respond to a HTTP request with a body of plain text data
+ * @param res The HTTP response to write data to
+ * @param content The string data to respond with
+ * @param contentType The HTTP Content-Type header value
+ * @param status [200] The status code to respond with
+ */
export function respond(res: http.ServerResponse, content: string, contentType: string, status = 200) {
res.setHeader("Content-Type", contentType);
res.statusCode = status;
diff --git a/src/renderer/components/+config-maps/config-map-details.tsx b/src/renderer/components/+config-maps/config-map-details.tsx
index abbd31c97a..6150aa1ad9 100644
--- a/src/renderer/components/+config-maps/config-map-details.tsx
+++ b/src/renderer/components/+config-maps/config-map-details.tsx
@@ -72,6 +72,8 @@ export class ConfigMapDetails extends React.Component {
<>ConfigMap {configMap.getName()} successfully updated.>
);
+ } catch (error) {
+ Notifications.error(`Failed to save config map: ${error}`);
} finally {
this.isSaving = false;
}
diff --git a/src/renderer/components/+workloads-deployments/deployment-scale-dialog.test.tsx b/src/renderer/components/+workloads-deployments/deployment-scale-dialog.test.tsx
index 22c90dda2c..3bc22b8263 100644
--- a/src/renderer/components/+workloads-deployments/deployment-scale-dialog.test.tsx
+++ b/src/renderer/components/+workloads-deployments/deployment-scale-dialog.test.tsx
@@ -112,6 +112,7 @@ const dummyDeployment: Deployment = {
toPlainObject: jest.fn(),
update: jest.fn(),
delete: jest.fn(),
+ patch: jest.fn(),
};
describe("", () => {
diff --git a/src/renderer/components/+workloads-replicasets/replicaset-scale-dialog.test.tsx b/src/renderer/components/+workloads-replicasets/replicaset-scale-dialog.test.tsx
index 7f8c31e99c..e948d3a339 100755
--- a/src/renderer/components/+workloads-replicasets/replicaset-scale-dialog.test.tsx
+++ b/src/renderer/components/+workloads-replicasets/replicaset-scale-dialog.test.tsx
@@ -107,6 +107,7 @@ const dummyReplicaSet: ReplicaSet = {
toPlainObject: jest.fn(),
update: jest.fn(),
delete: jest.fn(),
+ patch: jest.fn(),
};
describe("", () => {
diff --git a/src/renderer/components/+workloads-statefulsets/statefulset-scale-dialog.test.tsx b/src/renderer/components/+workloads-statefulsets/statefulset-scale-dialog.test.tsx
index b27d8b0892..016d431eb2 100755
--- a/src/renderer/components/+workloads-statefulsets/statefulset-scale-dialog.test.tsx
+++ b/src/renderer/components/+workloads-statefulsets/statefulset-scale-dialog.test.tsx
@@ -117,6 +117,7 @@ const dummyStatefulSet: StatefulSet = {
toPlainObject: jest.fn(),
update: jest.fn(),
delete: jest.fn(),
+ patch: jest.fn(),
};
describe("", () => {
diff --git a/src/renderer/components/dock/create-resource.tsx b/src/renderer/components/dock/create-resource.tsx
index a357d0dc62..c7de411e3c 100644
--- a/src/renderer/components/dock/create-resource.tsx
+++ b/src/renderer/components/dock/create-resource.tsx
@@ -33,10 +33,10 @@ import { createResourceStore } from "./create-resource.store";
import type { DockTab } from "./dock.store";
import { EditorPanel } from "./editor-panel";
import { InfoPanel } from "./info-panel";
-import { resourceApplierApi } from "../../../common/k8s-api/endpoints/resource-applier.api";
-import type { JsonApiErrorParsed } from "../../../common/k8s-api/json-api";
+import * as resourceApplierApi from "../../../common/k8s-api/endpoints/resource-applier.api";
import { Notifications } from "../notifications";
import { monacoModelsManager } from "./monaco-model-manager";
+import logger from "../../../common/logger";
interface Props {
className?: string;
@@ -95,7 +95,7 @@ export class CreateResource extends React.Component {
});
};
- create = async () => {
+ create = async (): Promise => {
if (this.error || !this.data.trim()) {
// do not save when field is empty or there is an error
return null;
@@ -103,31 +103,31 @@ export class CreateResource extends React.Component {
// skip empty documents if "---" pasted at the beginning or end
const resources = jsYaml.safeLoadAll(this.data).filter(Boolean);
- const createdResources: string[] = [];
- const errors: string[] = [];
- await Promise.all(
- resources.map(data => {
- return resourceApplierApi.update(data)
- .then(item => createdResources.push(item.metadata.name))
- .catch((err: JsonApiErrorParsed) => errors.push(err.toString()));
- })
- );
-
- if (errors.length) {
- errors.forEach(error => Notifications.error(error));
- if (!createdResources.length) throw errors[0];
+ if (resources.length === 0) {
+ return void logger.info("Nothing to create");
}
- const successMessage = (
-
- {createdResources.length === 1 ? "Resource" : "Resources"}{" "}
- {createdResources.join(", ")} successfully created
-
- );
- Notifications.ok(successMessage);
+ const createdResources: string[] = [];
- return successMessage;
+ for (const result of await Promise.allSettled(resources.map(resourceApplierApi.update))) {
+ if (result.status === "fulfilled") {
+ createdResources.push(result.value.metadata.name);
+ } else {
+ Notifications.error(result.reason.toString());
+ }
+ }
+
+ if (createdResources.length > 0) {
+ Notifications.ok((
+
+ {createdResources.length === 1 ? "Resource" : "Resources"}{" "}
+ {createdResources.join(", ")} successfully created
+
+ ));
+ }
+
+ return undefined;
};
renderControls(){
diff --git a/src/renderer/components/dock/edit-resource.store.ts b/src/renderer/components/dock/edit-resource.store.ts
index b5be580313..d8b6d06d6b 100644
--- a/src/renderer/components/dock/edit-resource.store.ts
+++ b/src/renderer/components/dock/edit-resource.store.ts
@@ -31,6 +31,7 @@ import {monacoModelsManager} from "./monaco-model-manager";
export interface EditingResource {
resource: string; // resource path, e.g. /api/v1/namespaces/default
draft?: string; // edited draft in yaml
+ firstDraft?: string;
}
export class EditResourceStore extends DockTabStore {
@@ -106,6 +107,10 @@ export class EditResourceStore extends DockTabStore {
return dockStore.getTabById(tabId);
}
+ clearInitialDraft(tabId: TabId): void {
+ delete this.getData(tabId)?.firstDraft;
+ }
+
reset() {
super.reset();
Array.from(this.watchers).forEach(([tabId, dispose]) => {
diff --git a/src/renderer/components/dock/edit-resource.tsx b/src/renderer/components/dock/edit-resource.tsx
index 19a238ab30..068855eebb 100644
--- a/src/renderer/components/dock/edit-resource.tsx
+++ b/src/renderer/components/dock/edit-resource.tsx
@@ -24,7 +24,7 @@ import "./edit-resource.scss";
import React from "react";
import { action, computed, makeObservable, observable } from "mobx";
import { observer } from "mobx-react";
-import jsYaml from "js-yaml";
+import yaml from "js-yaml";
import type { DockTab } from "./dock.store";
import { cssNames } from "../../utils";
import { editResourceStore } from "./edit-resource.store";
@@ -33,6 +33,7 @@ import { Badge } from "../badge";
import { EditorPanel } from "./editor-panel";
import { Spinner } from "../spinner";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
+import { createPatch } from "rfc6902";
interface Props {
className?: string;
@@ -71,16 +72,17 @@ export class EditResource extends React.Component {
return draft;
}
- return jsYaml.safeDump(this.resource.toPlainObject()); // dump resource first time
+ return yaml.safeDump(this.resource.toPlainObject()); // dump resource first time
}
@action
saveDraft(draft: string | object) {
if (typeof draft === "object") {
- draft = draft ? jsYaml.safeDump(draft) : undefined;
+ draft = draft ? yaml.safeDump(draft) : undefined;
}
editResourceStore.setData(this.tabId, {
+ firstDraft: draft, // this must be before the next line
...editResourceStore.getData(this.tabId),
draft,
});
@@ -95,16 +97,18 @@ export class EditResource extends React.Component {
if (this.error) {
return null;
}
- const store = editResourceStore.getStore(this.tabId);
- const updatedResource: KubeObject = await store.update(this.resource, jsYaml.safeLoad(this.draft));
- this.saveDraft(updatedResource.toPlainObject()); // update with new resourceVersion to avoid further errors on save
- const resourceType = updatedResource.kind;
- const resourceName = updatedResource.getName();
+ const store = editResourceStore.getStore(this.tabId);
+ const currentVersion = yaml.safeLoad(this.draft);
+ const firstVersion = yaml.safeLoad(editResourceStore.getData(this.tabId).firstDraft ?? this.draft);
+ const patches = createPatch(firstVersion, currentVersion);
+ const updatedResource = await store.patch(this.resource, patches);
+
+ editResourceStore.clearInitialDraft(this.tabId);
return (
- {resourceType} {resourceName} updated.
+ {updatedResource.kind} {updatedResource.getName()} updated.
);
};
@@ -126,9 +130,9 @@ export class EditResource extends React.Component {
submittingMessage="Applying.."
controls={(
- Kind:
+ Kind:
Name:
- Namespace:
+ Namespace:
)}
/>
diff --git a/src/renderer/components/dock/editor-panel.tsx b/src/renderer/components/dock/editor-panel.tsx
index 31ccc5b2e2..bbf0b96e53 100644
--- a/src/renderer/components/dock/editor-panel.tsx
+++ b/src/renderer/components/dock/editor-panel.tsx
@@ -91,10 +91,7 @@ export class EditorPanel extends React.Component {
onChange = (value: string) => {
this.validate(value);
-
- if (this.props.onChange) {
- this.props.onChange(value, this.yamlError);
- }
+ this.props.onChange?.(value, this.yamlError);
};
render() {
diff --git a/src/renderer/components/kube-object-menu/kube-object-menu.tsx b/src/renderer/components/kube-object-menu/kube-object-menu.tsx
index 1848fa2906..ac2a99cc88 100644
--- a/src/renderer/components/kube-object-menu/kube-object-menu.tsx
+++ b/src/renderer/components/kube-object-menu/kube-object-menu.tsx
@@ -44,15 +44,11 @@ export class KubeObjectMenu extends React.Component
Date: Tue, 5 Oct 2021 09:01:07 -0400
Subject: [PATCH 63/88] Bump electron-updater from 4.5.2 to 4.6.0 (#3952)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
yarn.lock | 18 +++++++++++++-----
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/package.json b/package.json
index 286ac7f97a..a5b5dcd202 100644
--- a/package.json
+++ b/package.json
@@ -197,7 +197,7 @@
"conf": "^7.0.1",
"crypto-js": "^4.1.1",
"electron-devtools-installer": "^3.2.0",
- "electron-updater": "^4.4.3",
+ "electron-updater": "^4.6.0",
"electron-window-state": "^5.0.3",
"filehound": "^1.17.4",
"fs-extra": "^9.0.1",
diff --git a/yarn.lock b/yarn.lock
index 59ab4a2ca2..bfbe773857 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3474,6 +3474,14 @@ builder-util-runtime@8.8.1:
debug "^4.3.2"
sax "^1.2.4"
+builder-util-runtime@8.9.0:
+ version "8.9.0"
+ resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.0.tgz#5d8e7ef101c0bf8a54fec3a70f0c551e8fdd58c2"
+ integrity sha512-XT7asdRMiSqUj/7EtvSW1mzVARvnhj0Nv4Ei4kD0p8GrKMFJt1Nadm4XwD+PrI2+srrtU+l8JMoBgSe4LX8EmQ==
+ dependencies:
+ debug "^4.3.2"
+ sax "^1.2.4"
+
builder-util@22.13.1:
version "22.13.1"
resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.13.1.tgz#fb2165c725b9405f0605a765cf91ec1870995ada"
@@ -5219,13 +5227,13 @@ electron-publish@22.13.1:
lazy-val "^1.0.5"
mime "^2.5.2"
-electron-updater@^4.4.3:
- version "4.5.2"
- resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.5.2.tgz#2a2bf3659a83ea41519bf809069aad2005bc970a"
- integrity sha512-W6V+nOcSYTQnRyHaxQsDoPdyPvPW4D78VP7HJx1125mkXVbbejEWAPsHmheQVSTEPDcy3YKkVGbFZAKuH5/H4w==
+electron-updater@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.6.0.tgz#17fc25a16d28f749cd3980430461bf7e6927d925"
+ integrity sha512-evvAwfDn100sIBZ/GLDpcWtWfaug48RGxVuYiSp0foKQkaXJGFyqYy5ADyt+HPML/mSTMPBvUq55cLEW45BroQ==
dependencies:
"@types/semver" "^7.3.6"
- builder-util-runtime "8.8.1"
+ builder-util-runtime "8.9.0"
fs-extra "^10.0.0"
js-yaml "^4.1.0"
lazy-val "^1.0.5"
From 7b9798de783c18adb41c8b21f0c5a3dbf7d2df46 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 5 Oct 2021 09:12:37 -0400
Subject: [PATCH 64/88] Bump eslint from 7.7.0 to 7.32.0 (#3954)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
yarn.lock | 356 +++++++++++++++++++++++----------------------------
2 files changed, 164 insertions(+), 194 deletions(-)
diff --git a/package.json b/package.json
index a5b5dcd202..35e184cd36 100644
--- a/package.json
+++ b/package.json
@@ -333,7 +333,7 @@
"electron-notarize": "^0.3.0",
"esbuild": "^0.12.24",
"esbuild-loader": "^2.15.1",
- "eslint": "^7.7.0",
+ "eslint": "^7.32.0",
"eslint-plugin-header": "^3.1.1",
"eslint-plugin-react": "^7.24.0",
"eslint-plugin-react-hooks": "^4.2.0",
diff --git a/yarn.lock b/yarn.lock
index bfbe773857..a109a84ab2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7,27 +7,20 @@
resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876"
integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3":
+"@babel/code-frame@7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
+ integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
+ dependencies:
+ "@babel/highlight" "^7.10.4"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.8.3":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==
dependencies:
"@babel/highlight" "^7.14.5"
-"@babel/code-frame@^7.10.1":
- version "7.10.1"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff"
- integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==
- dependencies:
- "@babel/highlight" "^7.10.1"
-
-"@babel/code-frame@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
- integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
- dependencies:
- "@babel/highlight" "^7.10.4"
-
"@babel/core@^7.1.0", "@babel/core@^7.7.5":
version "7.10.2"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a"
@@ -164,15 +157,6 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/highlight@^7.10.1", "@babel/highlight@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
- integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
- dependencies:
- "@babel/helper-validator-identifier" "^7.14.5"
- chalk "^2.0.0"
- js-tokens "^4.0.0"
-
"@babel/highlight@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
@@ -182,6 +166,15 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
+"@babel/highlight@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
+ integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.14.5"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
"@babel/parser@^7.1.0", "@babel/parser@^7.10.1", "@babel/parser@^7.10.2":
version "7.10.2"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0"
@@ -473,19 +466,18 @@
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
-"@eslint/eslintrc@^0.2.1":
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c"
- integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==
+"@eslint/eslintrc@^0.4.3":
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
+ integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
dependencies:
ajv "^6.12.4"
debug "^4.1.1"
espree "^7.3.0"
- globals "^12.1.0"
+ globals "^13.9.0"
ignore "^4.0.6"
import-fresh "^3.2.1"
js-yaml "^3.13.1"
- lodash "^4.17.19"
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
@@ -595,6 +587,20 @@
"@hapi/bourne" "2.x.x"
"@hapi/hoek" "9.x.x"
+"@humanwhocodes/config-array@^0.5.0":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
+ integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.0"
+ debug "^4.1.1"
+ minimatch "^3.0.4"
+
+"@humanwhocodes/object-schema@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf"
+ integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==
+
"@iarna/cli@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@iarna/cli/-/cli-1.2.0.tgz#0f7af5e851afe895104583c4ca07377a8094d641"
@@ -2504,10 +2510,10 @@ acorn-globals@^6.0.0:
acorn "^7.1.1"
acorn-walk "^7.1.1"
-acorn-jsx@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
- integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
+acorn-jsx@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn-node@^1.6.1:
version "1.8.2"
@@ -2607,6 +2613,16 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.2, ajv@^6.12.4, ajv
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
+ajv@^8.0.1:
+ version "8.6.3"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764"
+ integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
+
ansi-align@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
@@ -2658,6 +2674,11 @@ ansi-regex@^5.0.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -2921,10 +2942,10 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-astral-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
- integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
async-each@^1.0.1:
version "1.0.3"
@@ -5591,7 +5612,7 @@ eslint-scope@^4.0.3:
esrecurse "^4.1.0"
estraverse "^4.1.1"
-eslint-scope@^5.1.0, eslint-scope@^5.1.1:
+eslint-scope@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -5623,29 +5644,32 @@ eslint-visitor-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
-eslint@^7.11.0:
- version "7.14.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.14.0.tgz#2d2cac1d28174c510a97b377f122a5507958e344"
- integrity sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA==
+eslint@^7.11.0, eslint@^7.32.0:
+ version "7.32.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
+ integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==
dependencies:
- "@babel/code-frame" "^7.0.0"
- "@eslint/eslintrc" "^0.2.1"
+ "@babel/code-frame" "7.12.11"
+ "@eslint/eslintrc" "^0.4.3"
+ "@humanwhocodes/config-array" "^0.5.0"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
debug "^4.0.1"
doctrine "^3.0.0"
enquirer "^2.3.5"
+ escape-string-regexp "^4.0.0"
eslint-scope "^5.1.1"
eslint-utils "^2.1.0"
eslint-visitor-keys "^2.0.0"
- espree "^7.3.0"
- esquery "^1.2.0"
+ espree "^7.3.1"
+ esquery "^1.4.0"
esutils "^2.0.2"
- file-entry-cache "^5.0.1"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
functional-red-black-tree "^1.0.1"
- glob-parent "^5.0.0"
- globals "^12.1.0"
+ glob-parent "^5.1.2"
+ globals "^13.6.0"
ignore "^4.0.6"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
@@ -5653,7 +5677,7 @@ eslint@^7.11.0:
js-yaml "^3.13.1"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
- lodash "^4.17.19"
+ lodash.merge "^4.6.2"
minimatch "^3.0.4"
natural-compare "^1.4.0"
optionator "^0.9.1"
@@ -5662,59 +5686,17 @@ eslint@^7.11.0:
semver "^7.2.1"
strip-ansi "^6.0.0"
strip-json-comments "^3.1.0"
- table "^5.2.3"
+ table "^6.0.9"
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
-eslint@^7.7.0:
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.7.0.tgz#18beba51411927c4b64da0a8ceadefe4030d6073"
- integrity sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- ajv "^6.10.0"
- chalk "^4.0.0"
- cross-spawn "^7.0.2"
- debug "^4.0.1"
- doctrine "^3.0.0"
- enquirer "^2.3.5"
- eslint-scope "^5.1.0"
- eslint-utils "^2.1.0"
- eslint-visitor-keys "^1.3.0"
- espree "^7.2.0"
- esquery "^1.2.0"
- esutils "^2.0.2"
- file-entry-cache "^5.0.1"
- functional-red-black-tree "^1.0.1"
- glob-parent "^5.0.0"
- globals "^12.1.0"
- ignore "^4.0.6"
- import-fresh "^3.0.0"
- imurmurhash "^0.1.4"
- is-glob "^4.0.0"
- js-yaml "^3.13.1"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.4.1"
- lodash "^4.17.19"
- minimatch "^3.0.4"
- natural-compare "^1.4.0"
- optionator "^0.9.1"
- progress "^2.0.0"
- regexpp "^3.1.0"
- semver "^7.2.1"
- strip-ansi "^6.0.0"
- strip-json-comments "^3.1.0"
- table "^5.2.3"
- text-table "^0.2.0"
- v8-compile-cache "^2.0.3"
-
-espree@^7.2.0, espree@^7.3.0:
- version "7.3.0"
- resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348"
- integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==
+espree@^7.3.0, espree@^7.3.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
+ integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
dependencies:
acorn "^7.4.0"
- acorn-jsx "^5.2.0"
+ acorn-jsx "^5.3.1"
eslint-visitor-keys "^1.3.0"
esprima@1.2.2:
@@ -5727,10 +5709,10 @@ esprima@^4.0.0, esprima@^4.0.1:
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-esquery@^1.2.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
- integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
+esquery@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
+ integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
dependencies:
estraverse "^5.1.0"
@@ -6007,7 +5989,7 @@ extsprintf@^1.2.0:
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
-fast-deep-equal@^3.1.1:
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
@@ -6094,12 +6076,12 @@ figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
-file-entry-cache@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
- integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
dependencies:
- flat-cache "^2.0.1"
+ flat-cache "^3.0.4"
file-js@0.3.0:
version "0.3.0"
@@ -6228,19 +6210,18 @@ findup-sync@^3.0.0:
micromatch "^3.0.4"
resolve-dir "^1.0.1"
-flat-cache@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
- integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
+flat-cache@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+ integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
dependencies:
- flatted "^2.0.0"
- rimraf "2.6.3"
- write "1.0.3"
+ flatted "^3.1.0"
+ rimraf "^3.0.2"
-flatted@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
- integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
+flatted@^3.1.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561"
+ integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==
flex.box@^3.4.4:
version "3.4.4"
@@ -6588,10 +6569,10 @@ glob-parent@^3.1.0:
is-glob "^3.1.0"
path-dirname "^1.0.0"
-glob-parent@^5.0.0, glob-parent@^5.1.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
- integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
@@ -6602,13 +6583,6 @@ glob-parent@^6.0.0:
dependencies:
is-glob "^4.0.1"
-glob-parent@~5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
- integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
- dependencies:
- is-glob "^4.0.1"
-
glob-to-regexp@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
@@ -6711,12 +6685,12 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^12.1.0:
- version "12.4.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
- integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
+globals@^13.6.0, globals@^13.9.0:
+ version "13.11.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7"
+ integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==
dependencies:
- type-fest "^0.8.1"
+ type-fest "^0.20.2"
globalthis@^1.0.1:
version "1.0.1"
@@ -7327,15 +7301,7 @@ import-cwd@^3.0.0:
dependencies:
import-from "^3.0.0"
-import-fresh@^3.0.0:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
- integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
- dependencies:
- parent-module "^1.0.0"
- resolve-from "^4.0.0"
-
-import-fresh@^3.1.0:
+import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
@@ -7343,14 +7309,6 @@ import-fresh@^3.1.0:
parent-module "^1.0.0"
resolve-from "^4.0.0"
-import-fresh@^3.2.1:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e"
- integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==
- dependencies:
- parent-module "^1.0.0"
- resolve-from "^4.0.0"
-
import-from@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966"
@@ -8595,6 +8553,11 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
json-schema-typed@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9"
@@ -9190,6 +9153,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.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
lodash.toarray@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
@@ -9200,6 +9168,11 @@ lodash.topath@^4.5.2:
resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009"
integrity sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=
+lodash.truncate@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
+ integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
+
lodash.union@~4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
@@ -12153,6 +12126,11 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
@@ -12290,13 +12268,6 @@ rfc6902@^4.0.2:
resolved "https://registry.yarnpkg.com/rfc6902/-/rfc6902-4.0.2.tgz#ce99d3562b9e3287d403462e6bcc81eead8fcea0"
integrity sha512-MJOC4iDSv3Qn5/QvhPbrNoRongti6moXSShcRmtbNqOk0WPxlviEdMV4bb9PaULhSxLUXzWd4AjAMKQ3j3y54w==
-rimraf@2.6.3:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
- integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
- dependencies:
- glob "^7.1.3"
-
rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@@ -12760,14 +12731,14 @@ slice-ansi@^1.0.0:
dependencies:
is-fullwidth-code-point "^2.0.0"
-slice-ansi@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
- integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
dependencies:
- ansi-styles "^3.2.0"
- astral-regex "^1.0.0"
- is-fullwidth-code-point "^2.0.0"
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
slide@^1.1.6, slide@~1.1.3, slide@~1.1.6:
version "1.1.6"
@@ -13168,6 +13139,15 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.0"
+string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
string.prototype.matchall@^4.0.5:
version "4.0.5"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da"
@@ -13293,12 +13273,12 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
-strip-ansi@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
- integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
- ansi-regex "^5.0.0"
+ ansi-regex "^5.0.1"
strip-bom@^3.0.0:
version "3.0.0"
@@ -13327,12 +13307,7 @@ strip-indent@^3.0.0:
dependencies:
min-indent "^1.0.0"
-strip-json-comments@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
- integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
-
-strip-json-comments@^3.1.1:
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
@@ -13410,15 +13385,17 @@ symbol-tree@^3.2.4:
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
-table@^5.2.3:
- version "5.4.6"
- resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
- integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
+table@^6.0.9:
+ version "6.7.2"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.7.2.tgz#a8d39b9f5966693ca8b0feba270a78722cbaf3b0"
+ integrity sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==
dependencies:
- ajv "^6.10.2"
- lodash "^4.17.14"
- slice-ansi "^2.1.0"
- string-width "^3.0.0"
+ ajv "^8.0.1"
+ lodash.clonedeep "^4.5.0"
+ lodash.truncate "^4.4.2"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
tailwindcss@^2.2.4:
version "2.2.4"
@@ -14795,13 +14772,6 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
-write@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
- integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
- dependencies:
- mkdirp "^0.5.1"
-
ws@^6.2.1:
version "6.2.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
From 81bc350dfe64baab34318e9195ba76020d93ace6 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 5 Oct 2021 09:17:50 -0400
Subject: [PATCH 65/88] Bump @types/jest from 26.0.22 to 26.0.24 (#3951)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
yarn.lock | 56 ++++++----------------------------------------------
2 files changed, 7 insertions(+), 51 deletions(-)
diff --git a/package.json b/package.json
index 35e184cd36..88d8226be0 100644
--- a/package.json
+++ b/package.json
@@ -277,7 +277,7 @@
"@types/hoist-non-react-statics": "^3.3.1",
"@types/html-webpack-plugin": "^3.2.6",
"@types/http-proxy": "^1.17.7",
- "@types/jest": "^26.0.22",
+ "@types/jest": "^26.0.24",
"@types/js-yaml": "^3.12.4",
"@types/jsdom": "^16.2.4",
"@types/jsonpath": "^0.2.0",
diff --git a/yarn.lock b/yarn.lock
index a109a84ab2..a98f41e807 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -786,17 +786,6 @@
source-map "^0.6.1"
write-file-atomic "^3.0.0"
-"@jest/types@^26.6.1":
- version "26.6.1"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.1.tgz#2638890e8031c0bc8b4681e0357ed986e2f866c5"
- integrity sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==
- dependencies:
- "@types/istanbul-lib-coverage" "^2.0.0"
- "@types/istanbul-reports" "^3.0.0"
- "@types/node" "*"
- "@types/yargs" "^15.0.0"
- chalk "^4.0.0"
-
"@jest/types@^26.6.2":
version "26.6.2"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e"
@@ -1623,18 +1612,10 @@
dependencies:
"@types/istanbul-lib-report" "*"
-"@types/jest@*":
- version "26.0.15"
- resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.15.tgz#12e02c0372ad0548e07b9f4e19132b834cb1effe"
- integrity sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog==
- dependencies:
- jest-diff "^26.0.0"
- pretty-format "^26.0.0"
-
-"@types/jest@^26.0.22":
- version "26.0.22"
- resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.22.tgz#8308a1debdf1b807aa47be2838acdcd91e88fbe6"
- integrity sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw==
+"@types/jest@*", "@types/jest@^26.0.24":
+ version "26.0.24"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a"
+ integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==
dependencies:
jest-diff "^26.0.0"
pretty-format "^26.0.0"
@@ -4918,11 +4899,6 @@ didyoumean@^1.2.1:
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.1.tgz#e92edfdada6537d484d73c0172fd1eba0c4976ff"
integrity sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=
-diff-sequences@^26.5.0:
- version "26.5.0"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.5.0.tgz#ef766cf09d43ed40406611f11c6d8d9dd8b2fefd"
- integrity sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==
-
diff-sequences@^26.6.2:
version "26.6.2"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
@@ -8079,17 +8055,7 @@ jest-config@^26.6.3:
micromatch "^4.0.2"
pretty-format "^26.6.2"
-jest-diff@^26.0.0:
- version "26.6.1"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.1.tgz#38aa194979f454619bb39bdee299fb64ede5300c"
- integrity sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==
- dependencies:
- chalk "^4.0.0"
- diff-sequences "^26.5.0"
- jest-get-type "^26.3.0"
- pretty-format "^26.6.1"
-
-jest-diff@^26.6.2:
+jest-diff@^26.0.0, jest-diff@^26.6.2:
version "26.6.2"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394"
integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==
@@ -11273,17 +11239,7 @@ pretty-error@^2.1.1:
renderkid "^2.0.1"
utila "~0.4"
-pretty-format@^26.0.0, pretty-format@^26.6.1:
- version "26.6.1"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.1.tgz#af9a2f63493a856acddeeb11ba6bcf61989660a8"
- integrity sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==
- dependencies:
- "@jest/types" "^26.6.1"
- ansi-regex "^5.0.0"
- ansi-styles "^4.0.0"
- react-is "^17.0.1"
-
-pretty-format@^26.6.2:
+pretty-format@^26.0.0, pretty-format@^26.6.2:
version "26.6.2"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93"
integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==
From e329ffd52c29713cf6d3b8e481be64fe96c15d2d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 5 Oct 2021 09:17:56 -0400
Subject: [PATCH 66/88] Bump @types/react-table from 7.7.0 to 7.7.6 (#3953)
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 88d8226be0..6842828c8a 100644
--- a/package.json
+++ b/package.json
@@ -298,7 +298,7 @@
"@types/react-dom": "^17.0.9",
"@types/react-router-dom": "^5.1.6",
"@types/react-select": "3.1.2",
- "@types/react-table": "^7.7.0",
+ "@types/react-table": "^7.7.6",
"@types/react-virtualized-auto-sizer": "^1.0.1",
"@types/react-window": "^1.8.5",
"@types/readable-stream": "^2.3.9",
diff --git a/yarn.lock b/yarn.lock
index a98f41e807..ed3127b816 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1884,10 +1884,10 @@
"@types/react-dom" "*"
"@types/react-transition-group" "*"
-"@types/react-table@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-7.7.0.tgz#cb441a03af7303efd570b816b5ed0ea4d35ce705"
- integrity sha512-xx2PJO9a0FEY7s96KWmadrhWNGxkNZgMnoKbXKPepqzz4FHKVds1tPDqWOU7NpP+dAsRli/wn0ysZ4MxWZI4Nw==
+"@types/react-table@^7.7.6":
+ version "7.7.6"
+ resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-7.7.6.tgz#4899ccc46b4a1de08cc1daf120842e37e112e51e"
+ integrity sha512-ZMFHh1sG5AGDmhVRpz9mgGByGmBFAqnZ7QnyqGa5iAlKtcSC3vb/gul47lM0kJ1uvlawc+qN5k+++pe+GBdJ+g==
dependencies:
"@types/react" "*"
From 851274d314b144559751c0e19fcc1cad03294f23 Mon Sep 17 00:00:00 2001
From: Marc Bachmann
Date: Tue, 5 Oct 2021 18:35:57 +0200
Subject: [PATCH 67/88] Fix prometheus operator support (#3653)
---
.../endpoints/persistent-volume-claims.api.ts | 8 ++--
src/main/prometheus/operator.ts | 46 +++++++++----------
2 files changed, 28 insertions(+), 26 deletions(-)
diff --git a/src/common/k8s-api/endpoints/persistent-volume-claims.api.ts b/src/common/k8s-api/endpoints/persistent-volume-claims.api.ts
index 1ac5d8df9a..a8822aed7b 100644
--- a/src/common/k8s-api/endpoints/persistent-volume-claims.api.ts
+++ b/src/common/k8s-api/endpoints/persistent-volume-claims.api.ts
@@ -31,11 +31,13 @@ export class PersistentVolumeClaimsApi extends KubeApi {
}
export function getMetricsForPvc(pvc: PersistentVolumeClaim): Promise {
+ const opts = { category: "pvc", pvc: pvc.getName(), namespace: pvc.getNs() };
+
return metricsApi.getMetrics({
- diskUsage: { category: "pvc", pvc: pvc.getName() },
- diskCapacity: { category: "pvc", pvc: pvc.getName() }
+ diskUsage: opts,
+ diskCapacity: opts
}, {
- namespace: pvc.getNs()
+ namespace: opts.namespace
});
}
diff --git a/src/main/prometheus/operator.ts b/src/main/prometheus/operator.ts
index f037ef8a53..6fb2cb5cc6 100644
--- a/src/main/prometheus/operator.ts
+++ b/src/main/prometheus/operator.ts
@@ -38,9 +38,9 @@ export class PrometheusOperator extends PrometheusProvider {
case "cluster":
switch (queryName) {
case "memoryUsage":
- return `sum(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes))`.replace(/_bytes/g, `_bytes * on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"}`);
+ return `sum(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes))`.replace(/_bytes/g, `_bytes{node=~"${opts.nodes}"}`);
case "workloadMemoryUsage":
- return `sum(container_memory_working_set_bytes{container!="POD",container!="",instance=~"${opts.nodes}"}) by (component)`;
+ return `sum(container_memory_working_set_bytes{container!="", instance=~"${opts.nodes}"}) by (component)`;
case "memoryRequests":
return `sum(kube_pod_container_resource_requests{node=~"${opts.nodes}", resource="memory"})`;
case "memoryLimits":
@@ -50,7 +50,7 @@ export class PrometheusOperator extends PrometheusProvider {
case "memoryAllocatableCapacity":
return `sum(kube_node_status_allocatable{node=~"${opts.nodes}", resource="memory"})`;
case "cpuUsage":
- return `sum(rate(node_cpu_seconds_total{mode=~"user|system"}[${this.rateAccuracy}])* on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"})`;
+ return `sum(rate(node_cpu_seconds_total{node=~"${opts.nodes}", mode=~"user|system"}[${this.rateAccuracy}]))`;
case "cpuRequests":
return `sum(kube_pod_container_resource_requests{node=~"${opts.nodes}", resource="cpu"})`;
case "cpuLimits":
@@ -66,61 +66,61 @@ export class PrometheusOperator extends PrometheusProvider {
case "podAllocatableCapacity":
return `sum(kube_node_status_allocatable{node=~"${opts.nodes}", resource="pods"})`;
case "fsSize":
- return `sum(node_filesystem_size_bytes{mountpoint="/"} * on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"})`;
+ return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint="/"}) by (node)`;
case "fsUsage":
- return `sum(node_filesystem_size_bytes{mountpoint="/"} * on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"} - node_filesystem_avail_bytes{mountpoint="/"} * on (pod,namespace) group_left(node) kube_pod_info{node=~"${opts.nodes}"})`;
+ return `sum(node_filesystem_size_bytes{node=~"${opts.nodes}", mountpoint="/"} - node_filesystem_avail_bytes{node=~"${opts.nodes}", mountpoint="/"}) by (node)`;
}
break;
case "nodes":
switch (queryName) {
case "memoryUsage":
- return `sum((node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) * on (pod,namespace) group_left(node) kube_pod_info) by (node)`;
+ return `sum (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) by (node)`;
case "workloadMemoryUsage":
- return `sum(container_memory_working_set_bytes{container!="POD",container!=""}) by (node)`;
+ return `sum(container_memory_working_set_bytes{container!=""}) by (node)`;
case "memoryCapacity":
return `sum(kube_node_status_capacity{resource="memory"}) by (node)`;
case "memoryAllocatableCapacity":
return `sum(kube_node_status_allocatable{resource="memory"}) by (node)`;
case "cpuUsage":
- return `sum(rate(node_cpu_seconds_total{mode=~"user|system"}[${this.rateAccuracy}]) * on (pod,namespace) group_left(node) kube_pod_info) by (node)`;
+ return `sum(rate(node_cpu_seconds_total{mode=~"user|system"}[${this.rateAccuracy}])) by(node)`;
case "cpuCapacity":
return `sum(kube_node_status_allocatable{resource="cpu"}) by (node)`;
case "cpuAllocatableCapacity":
return `sum(kube_node_status_allocatable{resource="cpu"}) by (node)`;
case "fsSize":
- return `sum(node_filesystem_size_bytes{mountpoint="/"} * on (pod,namespace) group_left(node) kube_pod_info) by (node)`;
+ return `sum(node_filesystem_size_bytes{mountpoint="/"}) by (node)`;
case "fsUsage":
- return `sum((node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) * on (pod,namespace) group_left(node) kube_pod_info) by (node)`;
+ return `sum(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) by (node)`;
}
break;
case "pods":
switch (queryName) {
case "cpuUsage":
- return `sum(rate(container_cpu_usage_seconds_total{container!="POD",container!="",image!="",pod=~"${opts.pods}",namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
+ return `sum(rate(container_cpu_usage_seconds_total{container!="", image!="", pod=~"${opts.pods}", namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
case "cpuRequests":
- return `sum(kube_pod_container_resource_requests{pod=~"${opts.pods}",resource="cpu",namespace="${opts.namespace}"}) by (${opts.selector})`;
+ return `sum(kube_pod_container_resource_requests{pod=~"${opts.pods}", resource="cpu", namespace="${opts.namespace}"}) by (${opts.selector})`;
case "cpuLimits":
- return `sum(kube_pod_container_resource_limits{pod=~"${opts.pods}",resource="cpu",namespace="${opts.namespace}"}) by (${opts.selector})`;
+ return `sum(kube_pod_container_resource_limits{pod=~"${opts.pods}", resource="cpu", namespace="${opts.namespace}"}) by (${opts.selector})`;
case "memoryUsage":
- return `sum(container_memory_working_set_bytes{container!="POD",container!="",image!="",pod=~"${opts.pods}",namespace="${opts.namespace}"}) by (${opts.selector})`;
+ return `sum(container_memory_working_set_bytes{container!="", image!="", pod=~"${opts.pods}", namespace="${opts.namespace}"}) by (${opts.selector})`;
case "memoryRequests":
- return `sum(kube_pod_container_resource_requests{pod=~"${opts.pods}",resource="memory",namespace="${opts.namespace}"}) by (${opts.selector})`;
+ return `sum(kube_pod_container_resource_requests{pod=~"${opts.pods}", resource="memory", namespace="${opts.namespace}"}) by (${opts.selector})`;
case "memoryLimits":
- return `sum(kube_pod_container_resource_limits{pod=~"${opts.pods}",resource="memory",namespace="${opts.namespace}"}) by (${opts.selector})`;
+ return `sum(kube_pod_container_resource_limits{pod=~"${opts.pods}", resource="memory", namespace="${opts.namespace}"}) by (${opts.selector})`;
case "fsUsage":
- return `sum(container_fs_usage_bytes{container!="POD",container!="",pod=~"${opts.pods}",namespace="${opts.namespace}"}) by (${opts.selector})`;
+ return `sum(container_fs_usage_bytes{container!="", pod=~"${opts.pods}", namespace="${opts.namespace}"}) by (${opts.selector})`;
case "networkReceive":
- return `sum(rate(container_network_receive_bytes_total{pod=~"${opts.pods}",namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
+ return `sum(rate(container_network_receive_bytes_total{pod=~"${opts.pods}", namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
case "networkTransmit":
- return `sum(rate(container_network_transmit_bytes_total{pod=~"${opts.pods}",namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
+ return `sum(rate(container_network_transmit_bytes_total{pod=~"${opts.pods}", namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (${opts.selector})`;
}
break;
case "pvc":
switch (queryName) {
case "diskUsage":
- return `sum(kubelet_volume_stats_used_bytes{persistentvolumeclaim="${opts.pvc}",namespace="${opts.namespace}"}) by (persistentvolumeclaim, namespace)`;
+ return `sum(kubelet_volume_stats_used_bytes{persistentvolumeclaim="${opts.pvc}", namespace="${opts.namespace}"}) by (persistentvolumeclaim, namespace)`;
case "diskCapacity":
- return `sum(kubelet_volume_stats_capacity_bytes{persistentvolumeclaim="${opts.pvc}",namespace="${opts.namespace}"}) by (persistentvolumeclaim, namespace)`;
+ return `sum(kubelet_volume_stats_capacity_bytes{persistentvolumeclaim="${opts.pvc}", namespace="${opts.namespace}"}) by (persistentvolumeclaim, namespace)`;
}
break;
case "ingress":
@@ -130,9 +130,9 @@ export class PrometheusOperator extends PrometheusProvider {
case "bytesSentFailure":
return this.bytesSent(opts.ingress, opts.namespace, "^5\\\\d*");
case "requestDurationSeconds":
- return `sum(rate(nginx_ingress_controller_request_duration_seconds_sum{ingress="${opts.ingress}",namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (ingress, namespace)`;
+ return `sum(rate(nginx_ingress_controller_request_duration_seconds_sum{ingress="${opts.ingress}", namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (ingress, namespace)`;
case "responseDurationSeconds":
- return `sum(rate(nginx_ingress_controller_response_duration_seconds_sum{ingress="${opts.ingress}",namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (ingress, namespace)`;
+ return `sum(rate(nginx_ingress_controller_response_duration_seconds_sum{ingress="${opts.ingress}", namespace="${opts.namespace}"}[${this.rateAccuracy}])) by (ingress, namespace)`;
}
break;
}
From 4af796c53255874c16bee43ec1c5005ab14f8ba1 Mon Sep 17 00:00:00 2001
From: chh <1474479+chenhunghan@users.noreply.github.com>
Date: Tue, 5 Oct 2021 22:36:44 +0300
Subject: [PATCH 68/88] Before hook for onRun of Catalog entities (#3911)
Co-authored-by: Sebastian Malton
---
package.json | 1 +
src/extensions/lens-renderer-extension.ts | 2 +-
src/extensions/renderer-api/catalog.ts | 13 +-
src/jest.setup.ts | 7 +
src/renderer/api/catalog-entity-registry.ts | 77 +++-
.../+catalog/catalog-entity-details.tsx | 9 +-
.../+catalog/catalog-entity-drawer-menu.tsx | 2 +-
.../+catalog/catalog-entity-item.tsx | 114 ++++++
.../+catalog/catalog-entity.store.tsx | 116 +-----
.../+catalog/catalog-menu.module.css | 2 +-
.../components/+catalog/catalog-menu.tsx | 12 +-
.../components/+catalog/catalog.test.tsx | 375 ++++++++++++++++++
src/renderer/components/+catalog/catalog.tsx | 17 +-
.../activate-entity-command.tsx | 4 +-
.../components/hotbar/hotbar-menu.tsx | 4 +-
src/renderer/components/icon/icon.tsx | 4 +-
yarn.lock | 5 +
17 files changed, 636 insertions(+), 128 deletions(-)
create mode 100644 src/renderer/components/+catalog/catalog-entity-item.tsx
create mode 100644 src/renderer/components/+catalog/catalog.test.tsx
diff --git a/package.json b/package.json
index 6842828c8a..09804b171a 100644
--- a/package.json
+++ b/package.json
@@ -358,6 +358,7 @@
"postcss": "^8.3.6",
"postcss-loader": "4.3.0",
"postinstall-postinstall": "^2.1.0",
+ "prettier": "^2.4.1",
"progress-bar-webpack-plugin": "^2.1.0",
"randomcolor": "^0.6.2",
"raw-loader": "^4.0.2",
diff --git a/src/extensions/lens-renderer-extension.ts b/src/extensions/lens-renderer-extension.ts
index abaac22308..4a5abadbad 100644
--- a/src/extensions/lens-renderer-extension.ts
+++ b/src/extensions/lens-renderer-extension.ts
@@ -77,7 +77,7 @@ export class LensRendererExtension extends LensExtension {
}
/**
- * Add a filtering function for the catalog catogries. This will be removed if the extension is disabled.
+ * Add a filtering function for the catalog categories. This will be removed if the extension is disabled.
* @param fn The function which should return a truthy value for those categories which should be kept.
* @returns A function to clean up the filter
*/
diff --git a/src/extensions/renderer-api/catalog.ts b/src/extensions/renderer-api/catalog.ts
index 2843bf8737..389107c80d 100644
--- a/src/extensions/renderer-api/catalog.ts
+++ b/src/extensions/renderer-api/catalog.ts
@@ -22,7 +22,8 @@
import type { CatalogCategory, CatalogEntity } from "../../common/catalog";
import { catalogEntityRegistry as registry } from "../../renderer/api/catalog-entity-registry";
-
+import type { CatalogEntityOnBeforeRun } from "../../renderer/api/catalog-entity-registry";
+import type { Disposer } from "../../common/utils";
export { catalogCategoryRegistry as catalogCategories } from "../../common/catalog/catalog-category-registry";
export class CatalogEntityRegistry {
@@ -48,6 +49,16 @@ export class CatalogEntityRegistry {
getItemsForCategory(category: CatalogCategory): T[] {
return registry.getItemsForCategory(category);
}
+
+ /**
+ * Add a onBeforeRun hook to a catalog entity. If `onBeforeRun` was previously added then it will not be added again
+ * @param catalogEntityUid The uid of the catalog entity
+ * @param onBeforeRun The function that should return a boolean if the onRun of catalog entity should be triggered.
+ * @returns A function to remove that hook
+ */
+ addOnBeforeRun(entity: CatalogEntity, onBeforeRun: CatalogEntityOnBeforeRun): Disposer {
+ return registry.addOnBeforeRun(entity, onBeforeRun);
+ }
}
export const catalogEntities = new CatalogEntityRegistry();
diff --git a/src/jest.setup.ts b/src/jest.setup.ts
index 29b0465c8b..a234960386 100644
--- a/src/jest.setup.ts
+++ b/src/jest.setup.ts
@@ -21,10 +21,17 @@
import fetchMock from "jest-fetch-mock";
import configurePackages from "./common/configure-packages";
+import { configure } from "mobx";
// setup default configuration for external npm-packages
configurePackages();
+configure({
+ // Needed because we want to use jest.spyOn()
+ // ref https://github.com/mobxjs/mobx/issues/2784
+ safeDescriptors: false,
+});
+
// rewire global.fetch to call 'fetchMock'
fetchMock.enableMocks();
diff --git a/src/renderer/api/catalog-entity-registry.ts b/src/renderer/api/catalog-entity-registry.ts
index d731e2562a..f9c59fce09 100644
--- a/src/renderer/api/catalog-entity-registry.ts
+++ b/src/renderer/api/catalog-entity-registry.ts
@@ -19,7 +19,7 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-import { computed, observable, makeObservable, action } from "mobx";
+import { computed, observable, makeObservable, action, ObservableSet } from "mobx";
import { ipcRendererOn } from "../../common/ipc";
import { CatalogCategory, CatalogEntity, CatalogEntityData, catalogCategoryRegistry, CatalogCategoryRegistry, CatalogEntityKindData } from "../../common/catalog";
import "../../common/catalog-entities";
@@ -27,8 +27,13 @@ import type { Cluster } from "../../main/cluster";
import { ClusterStore } from "../../common/cluster-store";
import { Disposer, iter } from "../utils";
import { once } from "lodash";
+import logger from "../../common/logger";
+import { catalogEntityRunContext } from "./catalog-entity";
export type EntityFilter = (entity: CatalogEntity) => any;
+export type CatalogEntityOnBeforeRun = (entity: CatalogEntity) => boolean | Promise;
+
+type CatalogEntityUid = CatalogEntity["metadata"]["uid"];
export class CatalogEntityRegistry {
@observable protected activeEntityId: string | undefined = undefined;
@@ -36,6 +41,9 @@ export class CatalogEntityRegistry {
protected filters = observable.set([], {
deep: false,
});
+ protected onBeforeRunHooks = observable.map>({}, {
+ deep: false,
+ });
/**
* Buffer for keeping entities that don't yet have CatalogCategory synced
@@ -169,6 +177,73 @@ export class CatalogEntityRegistry {
return once(() => void this.filters.delete(fn));
}
+
+ /**
+ * Add a onBeforeRun hook to a catalog entity. If `onBeforeRun` was previously added then it will not be added again
+ * @param catalogEntityUid The uid of the catalog entity
+ * @param onBeforeRun The function that should return a boolean if the onRun of catalog entity should be triggered.
+ * @returns A function to remove that hook
+ */
+ addOnBeforeRun(entityOrId: CatalogEntity | CatalogEntityUid, onBeforeRun: CatalogEntityOnBeforeRun): Disposer {
+ logger.debug(`[CATALOG-ENTITY-REGISTRY]: adding onBeforeRun to ${entityOrId}`);
+
+ const id = typeof entityOrId === "string"
+ ? entityOrId
+ : entityOrId.getId();
+ const hooks = this.onBeforeRunHooks.get(id) ??
+ this.onBeforeRunHooks.set(id, observable.set([], { deep: false })).get(id);
+
+ hooks.add(onBeforeRun);
+
+ return once(() => void hooks.delete(onBeforeRun));
+ }
+
+ /**
+ * Runs all the registered `onBeforeRun` hooks, short circuiting on the first falsy returned/resolved valued
+ * @param entity The entity to run the hooks on
+ * @returns Whether the entities `onRun` method should be executed
+ */
+ async onBeforeRun(entity: CatalogEntity): Promise {
+ logger.debug(`[CATALOG-ENTITY-REGISTRY]: run onBeforeRun on ${entity.getId()}`);
+
+ const hooks = this.onBeforeRunHooks.get(entity.getId());
+
+ if (!hooks) {
+ return true;
+ }
+
+ for (const onBeforeRun of hooks) {
+ try {
+ if (!await onBeforeRun(entity)) {
+ return false;
+ }
+ } catch (error) {
+ logger.warn(`[CATALOG-ENTITY-REGISTRY]: entity ${entity.getId()} onBeforeRun threw an error`, error);
+
+ // If a handler throws treat it as if it has returned `false`
+ // Namely: assume that its internal logic has failed and didn't complete as expected
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Perform the onBeforeRun check and, if successful, then proceed to call `entity`'s onRun method
+ * @param entity The instance to invoke the hooks and then execute the onRun
+ */
+ onRun(entity: CatalogEntity): void {
+ this.onBeforeRun(entity)
+ .then(doOnRun => {
+ if (doOnRun) {
+ return entity.onRun?.(catalogEntityRunContext);
+ } else {
+ logger.debug(`onBeforeRun for ${entity.getId()} returned false`);
+ }
+ })
+ .catch(error => logger.error(`[CATALOG-ENTITY-REGISTRY]: entity ${entity.getId()} onRun threw an error`, error));
+ }
}
export const catalogEntityRegistry = new CatalogEntityRegistry(catalogCategoryRegistry);
diff --git a/src/renderer/components/+catalog/catalog-entity-details.tsx b/src/renderer/components/+catalog/catalog-entity-details.tsx
index fd1b874c82..bff73a3fa2 100644
--- a/src/renderer/components/+catalog/catalog-entity-details.tsx
+++ b/src/renderer/components/+catalog/catalog-entity-details.tsx
@@ -23,13 +23,12 @@ import "./catalog-entity-details.scss";
import React, { Component } from "react";
import { observer } from "mobx-react";
import { Drawer, DrawerItem } from "../drawer";
-import { catalogEntityRunContext } from "../../api/catalog-entity";
import type { CatalogCategory, CatalogEntity } from "../../../common/catalog";
import { Icon } from "../icon";
import { CatalogEntityDrawerMenu } from "./catalog-entity-drawer-menu";
import { CatalogEntityDetailRegistry } from "../../../extensions/registries";
import { HotbarIcon } from "../hotbar/hotbar-icon";
-import type { CatalogEntityItem } from "./catalog-entity.store";
+import type { CatalogEntityItem } from "./catalog-entity-item";
import { isDevelopment } from "../../../common/vars";
interface Props {
@@ -68,8 +67,10 @@ export class CatalogEntityDetails extends Component item.onRun(catalogEntityRunContext)}
- size={128} />
+ onClick={() => item.onRun()}
+ size={128}
+ data-testid="detail-panel-hot-bar-icon"
+ />
{item?.enabled && (
Click to open
diff --git a/src/renderer/components/+catalog/catalog-entity-drawer-menu.tsx b/src/renderer/components/+catalog/catalog-entity-drawer-menu.tsx
index af3104afe2..ac4d31092a 100644
--- a/src/renderer/components/+catalog/catalog-entity-drawer-menu.tsx
+++ b/src/renderer/components/+catalog/catalog-entity-drawer-menu.tsx
@@ -30,7 +30,7 @@ import { MenuItem } from "../menu";
import { ConfirmDialog } from "../confirm-dialog";
import { HotbarStore } from "../../../common/hotbar-store";
import { Icon } from "../icon";
-import type { CatalogEntityItem } from "./catalog-entity.store";
+import type { CatalogEntityItem } from "./catalog-entity-item";
export interface CatalogEntityDrawerMenuProps
extends MenuActionsProps {
item: CatalogEntityItem | null | undefined;
diff --git a/src/renderer/components/+catalog/catalog-entity-item.tsx b/src/renderer/components/+catalog/catalog-entity-item.tsx
new file mode 100644
index 0000000000..b16406758f
--- /dev/null
+++ b/src/renderer/components/+catalog/catalog-entity-item.tsx
@@ -0,0 +1,114 @@
+/**
+ * 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 styles from "./catalog.module.css";
+import React from "react";
+import { action, computed } from "mobx";
+import type { CatalogEntity } from "../../api/catalog-entity";
+import type { ItemObject } from "../../../common/item.store";
+import { Badge } from "../badge";
+import { navigation } from "../../navigation";
+import { searchUrlParam } from "../input";
+import { makeCss } from "../../../common/utils/makeCss";
+import { KubeObject } from "../../../common/k8s-api/kube-object";
+import type { CatalogEntityRegistry } from "../../api/catalog-entity-registry";
+
+const css = makeCss(styles);
+
+export class CatalogEntityItem implements ItemObject {
+ constructor(public entity: T, private registry: CatalogEntityRegistry) {}
+
+ get kind() {
+ return this.entity.kind;
+ }
+
+ get apiVersion() {
+ return this.entity.apiVersion;
+ }
+
+ get name() {
+ return this.entity.metadata.name;
+ }
+
+ getName() {
+ return this.entity.metadata.name;
+ }
+
+ get id() {
+ return this.entity.metadata.uid;
+ }
+
+ getId() {
+ return this.id;
+ }
+
+ @computed get phase() {
+ return this.entity.status.phase;
+ }
+
+ get enabled() {
+ return this.entity.status.enabled ?? true;
+ }
+
+ get labels() {
+ return KubeObject.stringifyLabels(this.entity.metadata.labels);
+ }
+
+ getLabelBadges(onClick?: React.MouseEventHandler) {
+ return this.labels
+ .map(label => (
+ {
+ navigation.searchParams.set(searchUrlParam.name, label);
+ onClick?.(event);
+ event.stopPropagation();
+ }}
+ expandable={false}
+ />
+ ));
+ }
+
+ get source() {
+ return this.entity.metadata.source || "unknown";
+ }
+
+ get searchFields() {
+ return [
+ this.name,
+ this.id,
+ this.phase,
+ `source=${this.source}`,
+ ...this.labels,
+ ];
+ }
+
+ onRun() {
+ this.registry.onRun(this.entity);
+ }
+
+ @action
+ async onContextMenuOpen(ctx: any) {
+ return this.entity.onContextMenuOpen(ctx);
+ }
+}
diff --git a/src/renderer/components/+catalog/catalog-entity.store.tsx b/src/renderer/components/+catalog/catalog-entity.store.tsx
index 05f317b7b1..8bbc335010 100644
--- a/src/renderer/components/+catalog/catalog-entity.store.tsx
+++ b/src/renderer/components/+catalog/catalog-entity.store.tsx
@@ -19,106 +19,16 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-import styles from "./catalog.module.css";
-
-import React from "react";
-import { action, computed, IReactionDisposer, makeObservable, observable, reaction } from "mobx";
-import { catalogEntityRegistry } from "../../api/catalog-entity-registry";
-import type { CatalogEntity, CatalogEntityActionContext } from "../../api/catalog-entity";
-import { ItemObject, ItemStore } from "../../../common/item.store";
+import { computed, makeObservable, observable, reaction } from "mobx";
+import { catalogEntityRegistry, CatalogEntityRegistry } from "../../api/catalog-entity-registry";
+import type { CatalogEntity } from "../../api/catalog-entity";
+import { ItemStore } from "../../../common/item.store";
import { CatalogCategory, catalogCategoryRegistry } from "../../../common/catalog";
-import { autoBind } from "../../../common/utils";
-import { Badge } from "../badge";
-import { navigation } from "../../navigation";
-import { searchUrlParam } from "../input";
-import { makeCss } from "../../../common/utils/makeCss";
-import { KubeObject } from "../../../common/k8s-api/kube-object";
-
-const css = makeCss(styles);
-
-export class CatalogEntityItem implements ItemObject {
- constructor(public entity: T) {}
-
- get kind() {
- return this.entity.kind;
- }
-
- get apiVersion() {
- return this.entity.apiVersion;
- }
-
- get name() {
- return this.entity.metadata.name;
- }
-
- getName() {
- return this.entity.metadata.name;
- }
-
- get id() {
- return this.entity.metadata.uid;
- }
-
- getId() {
- return this.id;
- }
-
- @computed get phase() {
- return this.entity.status.phase;
- }
-
- get enabled() {
- return this.entity.status.enabled ?? true;
- }
-
- get labels() {
- return KubeObject.stringifyLabels(this.entity.metadata.labels);
- }
-
- getLabelBadges(onClick?: React.MouseEventHandler) {
- return this.labels
- .map(label => (
- {
- navigation.searchParams.set(searchUrlParam.name, label);
- onClick?.(event);
- event.stopPropagation();
- }}
- expandable={false}
- />
- ));
- }
-
- get source() {
- return this.entity.metadata.source || "unknown";
- }
-
- get searchFields() {
- return [
- this.name,
- this.id,
- this.phase,
- `source=${this.source}`,
- ...this.labels,
- ];
- }
-
- onRun(ctx: CatalogEntityActionContext) {
- this.entity.onRun(ctx);
- }
-
- @action
- async onContextMenuOpen(ctx: any) {
- return this.entity.onContextMenuOpen(ctx);
- }
-}
+import { autoBind, disposer } from "../../../common/utils";
+import { CatalogEntityItem } from "./catalog-entity-item";
export class CatalogEntityStore extends ItemStore> {
- constructor() {
+ constructor(private registry: CatalogEntityRegistry = catalogEntityRegistry) {
super();
makeObservable(this);
autoBind(this);
@@ -129,10 +39,10 @@ export class CatalogEntityStore extends ItemStore new CatalogEntityItem(entity));
+ return this.registry.filteredItems.map(entity => new CatalogEntityItem(entity, this.registry));
}
- return catalogEntityRegistry.getItemsForCategory(this.activeCategory, { filtered: true }).map(entity => new CatalogEntityItem(entity));
+ return this.registry.getItemsForCategory(this.activeCategory, { filtered: true }).map(entity => new CatalogEntityItem(entity, this.registry));
}
@computed get selectedItem() {
@@ -140,12 +50,10 @@ export class CatalogEntityStore extends ItemStore this.entities, () => this.loadAll()),
- reaction(() => this.activeCategory, () => this.loadAll(), { delay: 100})
- ];
-
- return () => disposers.forEach((dispose) => dispose());
+ reaction(() => this.activeCategory, () => this.loadAll(), { delay: 100}),
+ );
}
loadAll() {
diff --git a/src/renderer/components/+catalog/catalog-menu.module.css b/src/renderer/components/+catalog/catalog-menu.module.css
index 84584e089d..1c3f08f6d7 100644
--- a/src/renderer/components/+catalog/catalog-menu.module.css
+++ b/src/renderer/components/+catalog/catalog-menu.module.css
@@ -32,4 +32,4 @@
.catalog {
@apply p-5 font-bold text-2xl;
color: var(--textColorAccent);
-}
\ No newline at end of file
+}
diff --git a/src/renderer/components/+catalog/catalog-menu.tsx b/src/renderer/components/+catalog/catalog-menu.tsx
index 6634b2399d..b2d013dfcd 100644
--- a/src/renderer/components/+catalog/catalog-menu.tsx
+++ b/src/renderer/components/+catalog/catalog-menu.tsx
@@ -41,11 +41,15 @@ function getCategories() {
}
function getCategoryIcon(category: CatalogCategory) {
- if (!category.metadata?.icon) return null;
+ const { icon } = category.metadata ?? {};
- return category.metadata.icon.includes("