From aab33a9dd0e843ae768295db36f0dc9b490fdf82 Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:10:58 +0100 Subject: [PATCH 01/14] chore(apps): fix comparison between inconvertible types --- .../ui-components/src/components/ComboBox/ComboBox.test.tsx | 2 +- .../ui-components/src/components/Message/Message.test.tsx | 4 ++-- packages/ui-components/src/components/Toast/Toast.test.tsx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/ui-components/src/components/ComboBox/ComboBox.test.tsx b/packages/ui-components/src/components/ComboBox/ComboBox.test.tsx index 0c1e6a133a..e4f271b268 100644 --- a/packages/ui-components/src/components/ComboBox/ComboBox.test.tsx +++ b/packages/ui-components/src/components/ComboBox/ComboBox.test.tsx @@ -107,7 +107,7 @@ describe("ComboBox", () => { await waitFor(() => render( - + ) ) diff --git a/packages/ui-components/src/components/Message/Message.test.tsx b/packages/ui-components/src/components/Message/Message.test.tsx index 96b23a049a..d923650ac6 100644 --- a/packages/ui-components/src/components/Message/Message.test.tsx +++ b/packages/ui-components/src/components/Message/Message.test.tsx @@ -49,8 +49,8 @@ describe("Message component", () => { }) test("renders the component with all provided props", () => { - render() - expect(screen.getByTestId("my-message")).toHaveAttribute("id", "My shiny little Message") + render() + expect(screen.getByTestId("my-message")).toHaveAttribute("id", "my-shiny-little-message") }) }) diff --git a/packages/ui-components/src/components/Toast/Toast.test.tsx b/packages/ui-components/src/components/Toast/Toast.test.tsx index d5fad6f4b8..ff31bc82d5 100644 --- a/packages/ui-components/src/components/Toast/Toast.test.tsx +++ b/packages/ui-components/src/components/Toast/Toast.test.tsx @@ -91,7 +91,7 @@ describe("Toast", () => { }) test("renders all props as passed", () => { - render() - expect(screen.getByTestId("my-toast")).toHaveAttribute("id", "My shiny little Message") + render() + expect(screen.getByTestId("my-toast")).toHaveAttribute("id", "my-shiny-little-message") }) }) From bd48d413106dfc1b2b8d47130a0447595ccda1b7 Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:14:22 +0100 Subject: [PATCH 02/14] chore(apps): fix comparison between inconvertible types --- apps/doop/src/components/Highlighter.tsx | 3 +-- apps/supernova/src/lib/createFiltersSlice.tsx | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/doop/src/components/Highlighter.tsx b/apps/doop/src/components/Highlighter.tsx index 4ab3faf521..e2bbaef02c 100644 --- a/apps/doop/src/components/Highlighter.tsx +++ b/apps/doop/src/components/Highlighter.tsx @@ -120,8 +120,7 @@ const Highlighter = () => { React.useEffect(() => { const observers = createObservers((mutations: any) => { for (const mutation of mutations) { - // @ts-expect-error TS(2367) FIXME: This condition will always return 'false' since th... Remove this comment to see the full error message - if (!mutation.type === "childList") continue + if (mutation.type !== "childList") continue // ignore changes to search nodes const addedOrRemovedNodes = Array.from(mutation.addedNodes).concat(Array.from(mutation.removedNodes)) diff --git a/apps/supernova/src/lib/createFiltersSlice.tsx b/apps/supernova/src/lib/createFiltersSlice.tsx index 9e77feee97..050cdbfa5d 100644 --- a/apps/supernova/src/lib/createFiltersSlice.tsx +++ b/apps/supernova/src/lib/createFiltersSlice.tsx @@ -71,7 +71,7 @@ const parseInitialFilters = ( ): Record => { if (!initialFilters) return {} - if (typeof initialFilters !== "object" || initialFilters === null) { + if (typeof initialFilters !== "object" || initialFilters === null || Array.isArray(initialFilters)) { console.warn("[supernova]::parseInitialFilters: initialFilters object is not an object") return {} } From 8f6bdc102785e575a5784c16c9fd59df43af9229 Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:17:41 +0100 Subject: [PATCH 03/14] chore(apps): fix implicit operand conversion --- packages/url-state-provider/src/v2/encode.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/url-state-provider/src/v2/encode.spec.ts b/packages/url-state-provider/src/v2/encode.spec.ts index aa50d699c5..9102503a25 100644 --- a/packages/url-state-provider/src/v2/encode.spec.ts +++ b/packages/url-state-provider/src/v2/encode.spec.ts @@ -25,7 +25,7 @@ describe("encode", () => { it.each` description | input ${"not an object (null)"} | ${null} - ${"not an object (undefined)"} | ${undefined} + ${"not an object (undefined)"} | ${void 0} ${"not an object (true)"} | ${true} ${"not an object (false)"} | ${false} ${"not an object (number)"} | ${1} From 107d0f624239bbf95e59712c7fb25a21dfee1b08 Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:23:16 +0100 Subject: [PATCH 04/14] fix(apps): remove redundant conditional expressions --- apps/doop/src/lib/filterViolations.ts | 2 +- apps/supernova/src/components/alerts/AlertStatus.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/doop/src/lib/filterViolations.ts b/apps/doop/src/lib/filterViolations.ts index 05f462f351..ce82cf9ce6 100644 --- a/apps/doop/src/lib/filterViolations.ts +++ b/apps/doop/src/lib/filterViolations.ts @@ -85,7 +85,7 @@ const filterByActiveFilters = (violationGroups: any[], clusterIdentities: any[], true ) ) - found = found && constraint.violation_groups?.length > 0 + found = (constraint.violation_groups?.length ?? 0) > 0 } // ############ CLUSTER FILTERS ############ diff --git a/apps/supernova/src/components/alerts/AlertStatus.tsx b/apps/supernova/src/components/alerts/AlertStatus.tsx index 12cc4e1941..8e0566cfab 100644 --- a/apps/supernova/src/components/alerts/AlertStatus.tsx +++ b/apps/supernova/src/components/alerts/AlertStatus.tsx @@ -41,7 +41,7 @@ const AlertStatus = ({ alert }: any) => { return (
- {alert && {alert?.status?.state}} + {alert?.status?.state && {alert.status.state}} {inhibitor && (
From b6fc2be62d8313b68fb1997cc43886e4c76937eb Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:26:57 +0100 Subject: [PATCH 05/14] fix(apps): remove useless expressions and fix zustand set call syntax --- .../clusters/components/ClusterEdit.tsx | 1 - apps/supernova/src/lib/createSilencesSlice.tsx | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/apps/greenhouse/src/components/core-apps/org-admin/components/clusters/components/ClusterEdit.tsx b/apps/greenhouse/src/components/core-apps/org-admin/components/clusters/components/ClusterEdit.tsx index ccc3bcf644..00b238682c 100644 --- a/apps/greenhouse/src/components/core-apps/org-admin/components/clusters/components/ClusterEdit.tsx +++ b/apps/greenhouse/src/components/core-apps/org-admin/components/clusters/components/ClusterEdit.tsx @@ -23,7 +23,6 @@ import { useClusterApi } from "../hooks/useClusterApi" const ClusterEdit: React.FC = () => { const clusterInEdit = useStore((state: any) => state.clusterInEdit) - clusterInEdit?.spec const setClusterInEdit = useStore((state: any) => state.setClusterInEdit) const [submitMessage, setSubmitResultMessage] = React.useState({ message: "", ok: false }) diff --git a/apps/supernova/src/lib/createSilencesSlice.tsx b/apps/supernova/src/lib/createSilencesSlice.tsx index 47d689f092..c48fa9d461 100644 --- a/apps/supernova/src/lib/createSilencesSlice.tsx +++ b/apps/supernova/src/lib/createSilencesSlice.tsx @@ -163,14 +163,16 @@ const createSilencesSlice: (options?: Record) => StateCreator { if (!items) return - ;(set((state: any) => ({ - silences: { - ...state.silences, - items: items, - updatedAt: Date.now(), - }, - })), - false) + set( + (state: any) => ({ + silences: { + ...state.silences, + items: items, + updatedAt: Date.now(), + }, + }), + false + ) }, /* From ffed9be2933750911328ec387639de5acd4ccaa9 Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:29:04 +0100 Subject: [PATCH 06/14] fix(apps): remove duplicate namespace property in teams store --- .../core-apps/org-admin/components/teams/lib/store.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/greenhouse/src/components/core-apps/org-admin/components/teams/lib/store.ts b/apps/greenhouse/src/components/core-apps/org-admin/components/teams/lib/store.ts index 78930aef18..1bf5a08b42 100644 --- a/apps/greenhouse/src/components/core-apps/org-admin/components/teams/lib/store.ts +++ b/apps/greenhouse/src/components/core-apps/org-admin/components/teams/lib/store.ts @@ -14,8 +14,6 @@ export default () => currentTeam: "", defaultTeam: "", teamMemberships: [], - // @ts-expect-error TS(1117): An object literal cannot have multiple properties ... Remove this comment to see the full error message - namespace: "", actions: { initialize: (endpoint: any, token: any, namespace: any, userGroup: any) => From 3a8decdefaa1835db40c1e041d78026750bb9b89 Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:30:54 +0100 Subject: [PATCH 07/14] fix(apps): declare errMsg as local variable in parseError function --- apps/greenhouse/src/lib/helpers.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/greenhouse/src/lib/helpers.ts b/apps/greenhouse/src/lib/helpers.ts index e8b5244893..5b5e42ade0 100644 --- a/apps/greenhouse/src/lib/helpers.ts +++ b/apps/greenhouse/src/lib/helpers.ts @@ -4,18 +4,15 @@ */ export const parseError = (error: any) => { + let errMsg: string if (error?.message) { - // @ts-expect-error TS(2304): Cannot find name 'errMsg'. errMsg = error?.message try { - // @ts-expect-error TS(2304): Cannot find name 'errMsg'. errMsg = JSON.parse(error?.message).msg } catch (error) { console.debug(error) } - // @ts-expect-error TS(2304): Cannot find name 'errMsg'. } else errMsg = error.toString() - // @ts-expect-error TS(2304): Cannot find name 'errMsg'. return errMsg } From 294e306904b2aed80b7b7865de1bdb16714762df Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:32:33 +0100 Subject: [PATCH 08/14] fix(greenhouse): remove unused variable in JSON validation function --- .../org-admin/components/plugins/plugin-edit/OptionInput.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/greenhouse/src/components/core-apps/org-admin/components/plugins/plugin-edit/OptionInput.tsx b/apps/greenhouse/src/components/core-apps/org-admin/components/plugins/plugin-edit/OptionInput.tsx index cdae7a4e3e..741b90904c 100644 --- a/apps/greenhouse/src/components/core-apps/org-admin/components/plugins/plugin-edit/OptionInput.tsx +++ b/apps/greenhouse/src/components/core-apps/org-admin/components/plugins/plugin-edit/OptionInput.tsx @@ -21,9 +21,8 @@ export const OptionInput: React.FC = (props: OptionInputProps) const [errortext, setErrorText] = useState("") const handleJsonValidation = (value: string) => { - let object try { - object = JSON.parse(value) + JSON.parse(value) } catch (e) { setValid(false) setErrorText("Invalid JSON") From aab5f343eef01941127fe45bcc5bef73abbc8dda Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:38:35 +0100 Subject: [PATCH 09/14] chore(ci): adds changeset --- .changeset/beige-ravens-find.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/beige-ravens-find.md diff --git a/.changeset/beige-ravens-find.md b/.changeset/beige-ravens-find.md new file mode 100644 index 0000000000..6f1fb6cd54 --- /dev/null +++ b/.changeset/beige-ravens-find.md @@ -0,0 +1,9 @@ +--- +"@cloudoperators/juno-url-state-provider": patch +"@cloudoperators/juno-ui-components": patch +"@cloudoperators/juno-app-greenhouse": patch +"@cloudoperators/juno-app-supernova": patch +"@cloudoperators/juno-app-doop": patch +--- + +Resolves all CodeQL static analysis warnings to improve code quality, reliability, and maintainability. These fixes address potential bugs, redundant code, and anti-patterns detected by automated code scanning. From 76bd6157b20aa1f0622648f599ddd8e66f8becc7 Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:42:04 +0100 Subject: [PATCH 10/14] chore(apps): fix link --- packages/url-state-provider/src/v2/encode.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/url-state-provider/src/v2/encode.spec.ts b/packages/url-state-provider/src/v2/encode.spec.ts index 9102503a25..aa50d699c5 100644 --- a/packages/url-state-provider/src/v2/encode.spec.ts +++ b/packages/url-state-provider/src/v2/encode.spec.ts @@ -25,7 +25,7 @@ describe("encode", () => { it.each` description | input ${"not an object (null)"} | ${null} - ${"not an object (undefined)"} | ${void 0} + ${"not an object (undefined)"} | ${undefined} ${"not an object (true)"} | ${true} ${"not an object (false)"} | ${false} ${"not an object (number)"} | ${1} From 6391841e15607afb2a88426a518aea629a35992d Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:45:54 +0100 Subject: [PATCH 11/14] chore(supernova): fix lint --- apps/supernova/src/lib/createFiltersSlice.tsx | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/apps/supernova/src/lib/createFiltersSlice.tsx b/apps/supernova/src/lib/createFiltersSlice.tsx index 050cdbfa5d..06990f41ce 100644 --- a/apps/supernova/src/lib/createFiltersSlice.tsx +++ b/apps/supernova/src/lib/createFiltersSlice.tsx @@ -66,7 +66,7 @@ const parsePredefinedFilters = (predefinedFilters: any[]): FilterState["predefin } const parseInitialFilters = ( - initialFilters: Record, + initialFilters: Record | null | undefined, filterLabels: string[] ): Record => { if (!initialFilters) return {} @@ -76,8 +76,10 @@ const parseInitialFilters = ( return {} } + const validatedFilters: Record = initialFilters + // Check if all values are arrays - initialFilters = Object.entries(initialFilters).reduce((acc: any, [key, value]) => { + const filteredByType = Object.entries(validatedFilters).reduce((acc: Record, [key, value]) => { if (Array.isArray(value)) { acc[key] = value // valid key-value pair } else { @@ -87,25 +89,28 @@ const parseInitialFilters = ( }, {}) // Check if all keys are in filterLabelValues - if (!Object.keys(initialFilters).every((key) => filterLabels.includes(key))) { + if (!Object.keys(filteredByType).every((key) => filterLabels.includes(key))) { console.warn( "[supernova]::parseInitialFilters: Some keys of the initialFilters object are not valid filter labels. They must be configured as filterLabels first. Using only valid keys." ) // filter out the keys that are not in filterLabels, return the rest // this will ensure that at least the valid keys are used as initial filters - const filtered = Object.keys(initialFilters) + const filtered = Object.keys(filteredByType) .filter((key) => filterLabels.includes(key)) - .reduce((obj, key) => { - return { - ...obj, - [key]: initialFilters[key], - } - }, {}) + .reduce( + (obj, key) => { + return { + ...obj, + [key]: filteredByType[key], + } + }, + {} as Record + ) return filtered } - return initialFilters + return filteredByType } const parseActivePredefinedFilter = (predefinedFilters: any): string | null => { From 979f8d6e1ce8f139fdc809cfd63883ab3610aa1c Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:56:01 +0100 Subject: [PATCH 12/14] chore(ui): fix test --- .../ui-components/src/components/ComboBox/ComboBox.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-components/src/components/ComboBox/ComboBox.test.tsx b/packages/ui-components/src/components/ComboBox/ComboBox.test.tsx index e4f271b268..8af34e19fe 100644 --- a/packages/ui-components/src/components/ComboBox/ComboBox.test.tsx +++ b/packages/ui-components/src/components/ComboBox/ComboBox.test.tsx @@ -112,7 +112,7 @@ describe("ComboBox", () => { ) ) expect(screen.getByRole("combobox")).toBeInTheDocument() - expect(screen.getByRole("combobox")).toHaveAttribute("id", "My Id") + expect(screen.getByRole("combobox")).toHaveAttribute("id", "my-id") }) test("renders the id of the ComboBox input as the for attribute of the label", async () => { From 1e24eb6dc28b00e8c55ace75ec68cf7f7a48b8e7 Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 12:57:49 +0100 Subject: [PATCH 13/14] chore(supernova): fix comparation --- apps/supernova/src/lib/createFiltersSlice.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/supernova/src/lib/createFiltersSlice.tsx b/apps/supernova/src/lib/createFiltersSlice.tsx index 06990f41ce..91b8a9c125 100644 --- a/apps/supernova/src/lib/createFiltersSlice.tsx +++ b/apps/supernova/src/lib/createFiltersSlice.tsx @@ -71,7 +71,7 @@ const parseInitialFilters = ( ): Record => { if (!initialFilters) return {} - if (typeof initialFilters !== "object" || initialFilters === null || Array.isArray(initialFilters)) { + if (typeof initialFilters !== "object" || Array.isArray(initialFilters)) { console.warn("[supernova]::parseInitialFilters: initialFilters object is not an object") return {} } From 76847c2fe7498f75ef4ea216ee1a006de2515d97 Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 20 Mar 2026 13:02:13 +0100 Subject: [PATCH 14/14] chore(ci): adapt changeset --- .changeset/beige-ravens-find.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.changeset/beige-ravens-find.md b/.changeset/beige-ravens-find.md index 6f1fb6cd54..f56cad6040 100644 --- a/.changeset/beige-ravens-find.md +++ b/.changeset/beige-ravens-find.md @@ -1,5 +1,4 @@ --- -"@cloudoperators/juno-url-state-provider": patch "@cloudoperators/juno-ui-components": patch "@cloudoperators/juno-app-greenhouse": patch "@cloudoperators/juno-app-supernova": patch