diff --git a/.azure-pipelines-k8s-matrix.yml b/.azure-pipelines-k8s-matrix.yml
deleted file mode 100644
index cdcc18b740..0000000000
--- a/.azure-pipelines-k8s-matrix.yml
+++ /dev/null
@@ -1,57 +0,0 @@
-variables:
- YARN_CACHE_FOLDER: $(Pipeline.Workspace)/.yarn
- node_version: 12.x
-pr:
- branches:
- include:
- - master
- - releases/*
- paths:
- exclude:
- - .github/*
- - docs/*
- - mkdocs/*
-trigger: none
-jobs:
- - job: Linux
- pool:
- vmImage: ubuntu-18.04
- strategy:
- matrix:
- kube_1.16:
- kubernetes_version: v1.16.15
- kube_1.17:
- kubernetes_version: v1.17.15
- kube_1.18:
- kubernetes_version: v1.18.13
- kube_1.19:
- kubernetes_version: v1.19.5
- kube_1.20:
- kubernetes_version: v1.20.0
- steps:
- - task: NodeTool@0
- inputs:
- versionSpec: $(node_version)
- displayName: Install Node.js
- - task: Cache@2
- inputs:
- key: 'yarn | "$(Agent.OS)" | yarn.lock'
- restoreKeys: |
- yarn | "$(Agent.OS)"
- path: $(YARN_CACHE_FOLDER)
- displayName: Cache Yarn packages
- - bash: |
- 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 --kubernetes-version $(kubernetes_version)
- sudo mv /root/.kube /root/.minikube $HOME
- sudo chown -R $USER $HOME/.kube $HOME/.minikube
- displayName: Install integration test dependencies
- - script: make node_modules
- displayName: Install dependencies
- - script: make -j2 build
- displayName: Run build
- - script: xvfb-run --auto-servernum --server-args='-screen 0, 1600x900x24' yarn integration
- displayName: Run integration tests for Kubernetes $(kubernetes_version)
diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml
deleted file mode 100644
index 523dc17033..0000000000
--- a/.azure-pipelines.yml
+++ /dev/null
@@ -1,168 +0,0 @@
-variables:
- YARN_CACHE_FOLDER: $(Pipeline.Workspace)/.yarn
-pr: none
-trigger:
- tags:
- include:
- - "*"
- paths:
- exclude:
- - .github/*
- - docs/*
- - mkdocs/*
-jobs:
- - job: Windows
- pool:
- vmImage: windows-2019
- strategy:
- matrix:
- node:
- node_version: 16.x
- steps:
- - powershell: |
- $CI_BUILD_TAG = git describe --tags
- Write-Output ("##vso[task.setvariable variable=CI_BUILD_TAG;]$CI_BUILD_TAG")
- condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
- displayName: Set the tag name as an environment variable
-
- - task: NodeTool@0
- inputs:
- versionSpec: $(node_version)
- displayName: Install Node.js
-
- - task: Cache@2
- inputs:
- key: 'yarn | "$(Agent.OS)"" | yarn.lock'
- restoreKeys: |
- yarn | "$(Agent.OS)"
- path: $(YARN_CACHE_FOLDER)
- displayName: Cache Yarn packages
-
- - bash: |
- set -e
- git clone "https://${GH_TOKEN}@github.com/lensapp/lens-ide.git" .lens-ide-overlay
- rm -rf .lens-ide-overlay/.git
- cp -r .lens-ide-overlay/* ./
- jq -s '.[0] * .[1]' package.json package.ide.json > package.custom.json && mv package.custom.json package.json
- env:
- GH_TOKEN: $(LENS_IDE_GH_TOKEN)
- displayName: Customize config
-
- - script: make build
- condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
- env:
- WIN_CSC_LINK: $(WIN_CSC_LINK)
- WIN_CSC_KEY_PASSWORD: $(WIN_CSC_KEY_PASSWORD)
- AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID)
- AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY)
- BUILD_NUMBER: $(Build.BuildNumber)
- ELECTRON_BUILDER_EXTRA_ARGS: "--x64 --ia32"
- displayName: Build
-
- - job: macOS
- timeoutInMinutes: 90
- pool:
- vmImage: macOS-11
- strategy:
- matrix:
- node:
- node_version: 16.x
- steps:
- - script: CI_BUILD_TAG=`git describe --tags` && echo "##vso[task.setvariable variable=CI_BUILD_TAG]$CI_BUILD_TAG"
- condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
- displayName: Set the tag name as an environment variable
-
- - task: NodeTool@0
- inputs:
- versionSpec: $(node_version)
- displayName: Install Node.js
-
- - task: Cache@2
- inputs:
- key: 'yarn | "$(Agent.OS)" | yarn.lock'
- restoreKeys: |
- yarn | "$(Agent.OS)"
- path: $(YARN_CACHE_FOLDER)
- displayName: Cache Yarn packages
-
- - bash: |
- set -e
- git clone "https://${GH_TOKEN}@github.com/lensapp/lens-ide.git" .lens-ide-overlay
- rm -rf .lens-ide-overlay/.git
- cp -r .lens-ide-overlay/* ./
- jq -s '.[0] * .[1]' package.json package.ide.json > package.custom.json && mv package.custom.json package.json
- env:
- GH_TOKEN: $(LENS_IDE_GH_TOKEN)
- displayName: Customize config
-
- - bash: |
- set -e
-
- echo "Importing codesign certificate ..."
- echo $CSC_LINK | base64 -D > certificate.p12
- security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
- security set-keychain-settings -lut 21600 build.keychain
- security default-keychain -s build.keychain
- security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain
- security import certificate.p12 -k build.keychain -P $CSC_KEY_PASSWORD -T /usr/bin/codesign -T /usr/bin/security -A
- security set-key-partition-list -S apple-tool:,apple: -k $KEYCHAIN_PASSWORD build.keychain
-
- rm certificate.p12
- echo "Codesign certificate imported!"
-
- make build
- condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
- env:
- KEYCHAIN_PASSWORD: secretz
- APPLEID: $(APPLEID)
- APPLEIDPASS: $(APPLEIDPASS)
- CSC_LINK: $(CSC_LINK)
- CSC_KEY_PASSWORD: $(CSC_KEY_PASSWORD)
- AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID)
- AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY)
- BUILD_NUMBER: $(Build.BuildNumber)
- ELECTRON_BUILDER_EXTRA_ARGS: "--x64 --arm64"
- displayName: Build
-
- - job: Linux
- pool:
- vmImage: ubuntu-18.04
- strategy:
- matrix:
- node:
- node_version: 16.x
- steps:
- - script: CI_BUILD_TAG=`git describe --tags` && echo "##vso[task.setvariable variable=CI_BUILD_TAG]$CI_BUILD_TAG"
- condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
- displayName: Set the tag name as an environment variable
-
- - task: NodeTool@0
- inputs:
- versionSpec: $(node_version)
- displayName: Install Node.js
-
- - task: Cache@2
- inputs:
- key: 'yarn | "$(Agent.OS)" | yarn.lock'
- restoreKeys: |
- yarn | "$(Agent.OS)"
- path: $(YARN_CACHE_FOLDER)
- displayName: Cache Yarn packages
-
- - bash: |
- set -e
- git clone "https://${GH_TOKEN}@github.com/lensapp/lens-ide.git" .lens-ide-overlay
- rm -rf .lens-ide-overlay/.git
- cp -r .lens-ide-overlay/* ./
- jq -s '.[0] * .[1]' package.json package.ide.json > package.custom.json && mv package.custom.json package.json
- env:
- GH_TOKEN: $(LENS_IDE_GH_TOKEN)
- displayName: Customize config
-
- - script: make build
- condition: "and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))"
- env:
- AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID)
- AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY)
- BUILD_NUMBER: $(Build.BuildNumber)
- displayName: Build
diff --git a/integration/__tests__/cluster-pages.tests.ts b/integration/__tests__/cluster-pages.tests.ts
index b56b999b2b..15e72f0d80 100644
--- a/integration/__tests__/cluster-pages.tests.ts
+++ b/integration/__tests__/cluster-pages.tests.ts
@@ -113,13 +113,13 @@ utils.describeIf(minikubeReady(TEST_NAMESPACE))("Minikube based tests", () => {
await frame.waitForSelector(".LogList .list span.active");
const showTimestampsButton = await frame.waitForSelector(
- ".LogControls .show-timestamps",
+ "[data-testid='log-controls'] .show-timestamps",
);
await showTimestampsButton.click();
const showPreviousButton = await frame.waitForSelector(
- ".LogControls .show-previous",
+ "[data-testid='log-controls'] .show-previous",
);
await showPreviousButton.click();
diff --git a/package.json b/package.json
index 880ef6ab5c..20483b2a22 100644
--- a/package.json
+++ b/package.json
@@ -252,7 +252,7 @@
"jsdom": "^16.7.0",
"lodash": "^4.17.15",
"mac-ca": "^1.0.6",
- "marked": "^4.0.19",
+ "marked": "^4.1.0",
"md5-file": "^5.0.0",
"mobx": "^6.6.1",
"mobx-observable-history": "^2.0.3",
@@ -349,7 +349,7 @@
"@types/readable-stream": "^2.3.13",
"@types/request": "^2.48.7",
"@types/request-promise-native": "^1.0.18",
- "@types/semver": "^7.3.10",
+ "@types/semver": "^7.3.12",
"@types/sharp": "^0.30.5",
"@types/spdy": "^3.4.5",
"@types/tar": "^4.0.5",
@@ -379,12 +379,12 @@
"electron": "^19.0.13",
"electron-builder": "^23.3.3",
"electron-notarize": "^0.3.0",
- "esbuild": "^0.15.5",
+ "esbuild": "^0.15.6",
"esbuild-loader": "^2.19.0",
- "eslint": "^8.22.0",
+ "eslint": "^8.23.0",
"eslint-plugin-header": "^3.1.1",
"eslint-plugin-import": "^2.26.0",
- "eslint-plugin-react": "^7.31.0",
+ "eslint-plugin-react": "7.30.1",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-unused-imports": "^2.0.0",
"flex.box": "^3.4.4",
@@ -405,11 +405,11 @@
"node-gyp": "^8.3.0",
"node-loader": "^2.0.0",
"nodemon": "^2.0.19",
- "playwright": "^1.24.2",
+ "playwright": "^1.25.1",
"postcss": "^8.4.16",
"postcss-loader": "^6.2.1",
"randomcolor": "^0.6.2",
- "react-beautiful-dnd": "^13.1.0",
+ "react-beautiful-dnd": "^13.1.1",
"react-refresh": "^0.14.0",
"react-refresh-typescript": "^2.0.7",
"react-router-dom": "^5.3.3",
@@ -417,7 +417,7 @@
"react-select-event": "^5.5.1",
"react-table": "^7.8.0",
"react-window": "^1.8.7",
- "sass": "^1.54.5",
+ "sass": "^1.54.7",
"sass-loader": "^12.6.0",
"sharp": "^0.30.7",
"style-loader": "^3.3.1",
@@ -427,13 +427,13 @@
"ts-node": "^10.9.1",
"type-fest": "^2.14.0",
"typed-emitter": "^1.4.0",
- "typedoc": "0.23.10",
+ "typedoc": "0.23.11",
"typedoc-plugin-markdown": "^3.13.1",
"typescript": "^4.7.4",
"typescript-plugin-css-modules": "^3.4.0",
"webpack": "^5.74.0",
"webpack-cli": "^4.9.2",
- "webpack-dev-server": "^4.10.0",
+ "webpack-dev-server": "^4.10.1",
"webpack-node-externals": "^3.0.0",
"xterm": "^4.19.0",
"xterm-addon-fit": "^0.5.0"
diff --git a/src/behaviours/pod-logs/__snapshots__/download-logs.test.tsx.snap b/src/behaviours/pod-logs/__snapshots__/download-logs.test.tsx.snap
new file mode 100644
index 0000000000..0dadfade96
--- /dev/null
+++ b/src/behaviours/pod-logs/__snapshots__/download-logs.test.tsx.snap
@@ -0,0 +1,865 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`download logs options in pod logs dock tab when opening pod logs renders 1`] = `
+
+
+
+`;
diff --git a/src/behaviours/pod-logs/download-logs.test.tsx b/src/behaviours/pod-logs/download-logs.test.tsx
new file mode 100644
index 0000000000..824428ee89
--- /dev/null
+++ b/src/behaviours/pod-logs/download-logs.test.tsx
@@ -0,0 +1,263 @@
+/**
+ * Copyright (c) OpenLens Authors. All rights reserved.
+ * Licensed under MIT License. See LICENSE in root directory for more information.
+ */
+
+import type { RenderResult } from "@testing-library/react";
+import { act, waitFor } from "@testing-library/react";
+import getPodByIdInjectable from "../../renderer/components/+workloads-pods/get-pod-by-id.injectable";
+import getPodsByOwnerIdInjectable from "../../renderer/components/+workloads-pods/get-pods-by-owner-id.injectable";
+import openSaveFileDialogInjectable from "../../renderer/utils/save-file.injectable";
+import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
+import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
+import dockStoreInjectable from "../../renderer/components/dock/dock/store.injectable";
+import areLogsPresentInjectable from "../../renderer/components/dock/logs/are-logs-present.injectable";
+import type { CallForLogs } from "../../renderer/components/dock/logs/call-for-logs.injectable";
+import callForLogsInjectable from "../../renderer/components/dock/logs/call-for-logs.injectable";
+import createPodLogsTabInjectable from "../../renderer/components/dock/logs/create-pod-logs-tab.injectable";
+import getLogTabDataInjectable from "../../renderer/components/dock/logs/get-log-tab-data.injectable";
+import getLogsWithoutTimestampsInjectable from "../../renderer/components/dock/logs/get-logs-without-timestamps.injectable";
+import getLogsInjectable from "../../renderer/components/dock/logs/get-logs.injectable";
+import getRandomIdForPodLogsTabInjectable from "../../renderer/components/dock/logs/get-random-id-for-pod-logs-tab.injectable";
+import getTimestampSplitLogsInjectable from "../../renderer/components/dock/logs/get-timestamp-split-logs.injectable";
+import loadLogsInjectable from "../../renderer/components/dock/logs/load-logs.injectable";
+import reloadLogsInjectable from "../../renderer/components/dock/logs/reload-logs.injectable";
+import setLogTabDataInjectable from "../../renderer/components/dock/logs/set-log-tab-data.injectable";
+import stopLoadingLogsInjectable from "../../renderer/components/dock/logs/stop-loading-logs.injectable";
+import { dockerPod } from "../../renderer/components/dock/logs/__test__/pod.mock";
+
+describe("download logs options in pod logs dock tab", () => {
+ let rendered: RenderResult;
+ let builder: ApplicationBuilder;
+ let openSaveFileDialogMock: jest.MockedFunction<() => void>;
+ let callForLogsMock: jest.MockedFunction;
+ const logs = new Map([["timestamp", "some-logs"]]);
+
+ beforeEach(() => {
+ const selectedPod = dockerPod;
+
+ builder = getApplicationBuilder();
+
+ builder.setEnvironmentToClusterFrame();
+
+ callForLogsMock = jest.fn();
+
+ builder.beforeWindowStart((windowDi) => {
+ windowDi.override(callForLogsInjectable, () => callForLogsMock);
+
+ // Overriding internals of logsViewModelInjectable
+ windowDi.override(getLogsInjectable, () => () => ["some-logs"]);
+ windowDi.override(getLogsWithoutTimestampsInjectable, () => () => ["some-logs"]);
+ windowDi.override(getTimestampSplitLogsInjectable, () => () => [...logs]);
+ windowDi.override(reloadLogsInjectable, () => jest.fn());
+ windowDi.override(getLogTabDataInjectable, () => () => ({
+ selectedPodId: selectedPod.getId(),
+ selectedContainer: selectedPod.getContainers()[0].name,
+ namespace: "default",
+ showPrevious: true,
+ showTimestamps: false,
+ }));
+ windowDi.override(setLogTabDataInjectable, () => jest.fn());
+ windowDi.override(loadLogsInjectable, () => jest.fn());
+ windowDi.override(stopLoadingLogsInjectable, () => jest.fn());
+ windowDi.override(areLogsPresentInjectable, () => jest.fn());
+ windowDi.override(getPodByIdInjectable, () => (id) => {
+ if (id === selectedPod.getId()) {
+ return selectedPod;
+ }
+
+ return undefined;
+ });
+ windowDi.override(getPodsByOwnerIdInjectable, () => jest.fn());
+
+ windowDi.override(getRandomIdForPodLogsTabInjectable, () => jest.fn(() => "some-irrelevant-random-id"));
+
+ openSaveFileDialogMock = jest.fn();
+ windowDi.override(openSaveFileDialogInjectable, () => openSaveFileDialogMock);
+ });
+ });
+
+ describe("when opening pod logs", () => {
+ beforeEach(async () => {
+ rendered = await builder.render();
+
+ const windowDi = builder.applicationWindow.only.di;
+ const pod = dockerPod;
+ const createLogsTab = windowDi.inject(createPodLogsTabInjectable);
+ const container = {
+ name: "docker-exporter",
+ image: "docker.io/prom/node-exporter:v1.0.0-rc.0",
+ imagePullPolicy: "pull",
+ };
+
+ const dockStore = windowDi.inject(dockStoreInjectable);
+
+ dockStore.closeTab("terminal");
+
+ createLogsTab({
+ selectedPod: pod,
+ selectedContainer: container,
+ });
+ });
+
+ it("renders", () => {
+ expect(rendered.baseElement).toMatchSnapshot();
+ });
+
+ it("contains download dropdown button", () => {
+ expect(rendered.getByTestId("download-logs-dropdown")).toBeInTheDocument();
+ });
+
+ describe("when clicking on button", () => {
+ beforeEach(() => {
+ const button = rendered.getByTestId("download-logs-dropdown");
+
+ act(() => button.click());
+ });
+
+ it("shows download visible logs menu item", () => {
+ expect(rendered.getByTestId("download-visible-logs")).toBeInTheDocument();
+ });
+
+ it("shows download all logs menu item", () => {
+ expect(rendered.getByTestId("download-all-logs")).toBeInTheDocument();
+ });
+
+ describe("when call for logs resolves with logs", () => {
+ beforeEach(() => {
+ callForLogsMock.mockResolvedValue("all-logs");
+ });
+
+ describe("when selected 'download visible logs'", () => {
+ beforeEach(() => {
+ const button = rendered.getByTestId("download-visible-logs");
+
+ button.click();
+ });
+
+ it("shows save dialog with proper attributes", () => {
+ expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "some-logs", "text/plain");
+ });
+ });
+
+ describe("when selected 'download all logs'", () => {
+ beforeEach(async () => {
+ await act(async () => {
+ const button = rendered.getByTestId("download-all-logs");
+
+ button.click();
+ });
+ });
+
+ it("logs have been called with query", () => {
+ expect(callForLogsMock).toHaveBeenCalledWith(
+ { name: "dockerExporter", namespace: "default" },
+ { "previous": true, "timestamps": false },
+ );
+ });
+
+ it("shows save dialog with proper attributes", async () => {
+ expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "all-logs", "text/plain");
+ });
+
+ it("doesn't block download dropdown for interaction after click", async () => {
+ expect(rendered.getByTestId("download-logs-dropdown")).not.toHaveAttribute("disabled");
+ });
+ });
+
+ describe("blocking user interaction after menu item click", () => {
+ it("block download dropdown for interaction when selected 'download all logs'", async () => {
+ const downloadMenuItem = rendered.getByTestId("download-all-logs");
+
+ act(() => downloadMenuItem.click());
+
+ await waitFor(() => {
+ expect(rendered.getByTestId("download-logs-dropdown")).toHaveAttribute("disabled");
+ });
+ });
+
+ it("doesn't block dropdown for interaction when selected 'download visible logs'", () => {
+ const downloadMenuItem = rendered.getByTestId("download-visible-logs");
+
+ act(() => downloadMenuItem.click());
+
+ expect(rendered.getByTestId("download-logs-dropdown")).not.toHaveAttribute("disabled");
+ });
+ });
+ });
+
+ describe("when call for logs resolves with no logs", () => {
+ beforeEach(() => {
+ callForLogsMock.mockResolvedValue("");
+ });
+
+ describe("when selected 'download visible logs'", () => {
+ beforeEach(() => {
+ const button = rendered.getByTestId("download-visible-logs");
+
+ button.click();
+ });
+
+ it("shows save dialog with proper attributes", () => {
+ expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "some-logs", "text/plain");
+ });
+ });
+
+ describe("when selected 'download all logs'", () => {
+ beforeEach(async () => {
+ await act(async () => {
+ const button = rendered.getByTestId("download-all-logs");
+
+ button.click();
+ });
+ });
+
+ it("doesn't show save dialog", async () => {
+ expect(openSaveFileDialogMock).not.toHaveBeenCalled();
+ });
+ });
+ });
+
+ describe("when call for logs rejects", () => {
+ beforeEach(() => {
+ callForLogsMock.mockRejectedValue("error");
+ });
+
+ describe("when selected 'download visible logs'", () => {
+ beforeEach(async () => {
+ await act(async () => {
+ const button = rendered.getByTestId("download-visible-logs");
+
+ button.click();
+ });
+ });
+
+ it("shows save dialog with proper attributes", () => {
+ expect(openSaveFileDialogMock).toHaveBeenCalledWith("dockerExporter.log", "some-logs", "text/plain");
+ });
+ });
+
+ describe("when selected 'download all logs'", () => {
+ beforeEach(async () => {
+ await act(async () => {
+ const button = rendered.getByTestId("download-all-logs");
+
+ button.click();
+ });
+ });
+
+ it("logs have been called", () => {
+ expect(callForLogsMock).toHaveBeenCalledWith(
+ { name: "dockerExporter", namespace: "default" },
+ { "previous": true, "timestamps": false },
+ );
+ });
+
+ it("doesn't show save dialog", async () => {
+ expect(openSaveFileDialogMock).not.toHaveBeenCalled();
+ });
+ });
+ });
+ });
+ });
+});
diff --git a/src/common/cluster-store/allowed-resources-injection-token.ts b/src/common/cluster-store/allowed-resources-injection-token.ts
index ad387d26a2..353d0b309c 100644
--- a/src/common/cluster-store/allowed-resources-injection-token.ts
+++ b/src/common/cluster-store/allowed-resources-injection-token.ts
@@ -6,8 +6,6 @@
import { getInjectionToken } from "@ogre-tools/injectable";
import type { IComputedValue } from "mobx";
-export const allowedResourcesInjectionToken = getInjectionToken<
- IComputedValue>
->({
+export const allowedResourcesInjectionToken = getInjectionToken>>({
id: "allowed-resources",
});
diff --git a/src/common/utils/sort-compare.ts b/src/common/utils/sort-compare.ts
index df4c59b961..ee32ab45c4 100644
--- a/src/common/utils/sort-compare.ts
+++ b/src/common/utils/sort-compare.ts
@@ -81,7 +81,7 @@ export function sortCharts(charts: RawHelmChart[]) {
iter.map(
charts,
chart => {
- const __version = coerce(chart.version, { includePrerelease: true, loose: true });
+ const __version = coerce(chart.version, { loose: true });
if (!__version) {
logger.warn(`[HELM-SERVICE]: Version from helm chart is not loosely coercable to semver.`, { name: chart.name, version: chart.version, repo: chart.repo });
diff --git a/src/extensions/extension-discovery/is-compatible-extension/is-compatible-extension.ts b/src/extensions/extension-discovery/is-compatible-extension/is-compatible-extension.ts
index 44b0f1782d..717effa1c6 100644
--- a/src/extensions/extension-discovery/is-compatible-extension/is-compatible-extension.ts
+++ b/src/extensions/extension-discovery/is-compatible-extension/is-compatible-extension.ts
@@ -27,7 +27,6 @@ export const isCompatibleExtension = ({ appSemVer }: Dependencies): ((manifest:
const { major: extMajor, minor: extMinor } = semver.coerce(manifestLensEngine, {
loose: true,
- includePrerelease: false,
}) as semver.SemVer;
const supportedVersionsByExtension = semver.validRange(`^${extMajor}.${extMinor}`) as string;
diff --git a/src/extensions/renderer-api/theming.ts b/src/extensions/renderer-api/theming.ts
index a39efc80b7..435cf23504 100644
--- a/src/extensions/renderer-api/theming.ts
+++ b/src/extensions/renderer-api/theming.ts
@@ -3,11 +3,17 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
-import themeStoreInjectable from "../../renderer/themes/store.injectable";
+import activeThemeInjectable from "../../renderer/themes/active.injectable";
+import type { LensTheme } from "../../renderer/themes/store";
import { asLegacyGlobalForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
-const themeStore = asLegacyGlobalForExtensionApi(themeStoreInjectable);
+export const activeTheme = asLegacyGlobalForExtensionApi(activeThemeInjectable);
+/**
+ * @deprecated This hides the reactivity of active theme, use {@link activeTheme} instead
+ */
export function getActiveTheme() {
- return themeStore.activeTheme;
+ return activeTheme.get();
}
+
+export type { LensTheme };
diff --git a/src/features/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap b/src/features/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap
index 991a77480a..87957f581a 100644
--- a/src/features/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap
+++ b/src/features/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap
@@ -298,6 +298,7 @@ exports[`add-cluster - navigation using application menu when navigating to add
>