diff --git a/frontend/package.json b/frontend/package.json index ce1b8a1d6db..f5ff0d81572 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -65,8 +65,8 @@ "dependencies": { "@monaco-editor/react": "^4.7.0", "@openshift/api-types": "^1.0.0", - "@openshift/dynamic-plugin-sdk": "^8.2.0", - "@openshift/dynamic-plugin-sdk-webpack": "^5.2.0", + "@openshift/dynamic-plugin-sdk": "^9.0.0", + "@openshift/dynamic-plugin-sdk-webpack": "^5.3.0", "@patternfly/patternfly": "~6.6.0", "@patternfly/quickstarts": "~6.6.0", "@patternfly/react-catalog-view-extension": "~6.5.0", diff --git a/frontend/packages/console-app/src/components/nodes/node-dashboard/InventoryCard.tsx b/frontend/packages/console-app/src/components/nodes/node-dashboard/InventoryCard.tsx index e8370fd4e85..da7c40987c1 100644 --- a/frontend/packages/console-app/src/components/nodes/node-dashboard/InventoryCard.tsx +++ b/frontend/packages/console-app/src/components/nodes/node-dashboard/InventoryCard.tsx @@ -1,9 +1,9 @@ import type { ComponentType, FC } from 'react'; import { useMemo, useContext } from 'react'; -import { useResolvedExtensions } from '@openshift/dynamic-plugin-sdk'; import { Card, CardBody, CardHeader, CardTitle, Stack, StackItem } from '@patternfly/react-core'; import { useTranslation } from 'react-i18next'; import { FLAG_NODE_MGMT_V1 } from '@console/app/src/consts'; +import { useResolvedExtensions } from '@console/dynamic-plugin-sdk/src/api/useResolvedExtensions'; import type { NodeInventoryExtensionItem } from '@console/dynamic-plugin-sdk/src/extensions/node'; import { isNodeInventoryItem } from '@console/dynamic-plugin-sdk/src/extensions/node'; import { useFlag } from '@console/dynamic-plugin-sdk/src/utils/flags'; diff --git a/frontend/packages/console-app/src/components/nodes/node-dashboard/__tests__/InventoryCard.spec.tsx b/frontend/packages/console-app/src/components/nodes/node-dashboard/__tests__/InventoryCard.spec.tsx index fe378d0a7fc..96ea9645968 100644 --- a/frontend/packages/console-app/src/components/nodes/node-dashboard/__tests__/InventoryCard.spec.tsx +++ b/frontend/packages/console-app/src/components/nodes/node-dashboard/__tests__/InventoryCard.spec.tsx @@ -1,13 +1,13 @@ -import { useResolvedExtensions } from '@openshift/dynamic-plugin-sdk'; import { render, screen } from '@testing-library/react'; +import { useResolvedExtensions } from '@console/dynamic-plugin-sdk/src/api/useResolvedExtensions'; import { useFlag } from '@console/dynamic-plugin-sdk/src/utils/flags'; import { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook'; import type { NodeKind } from '@console/internal/module/k8s'; import InventoryCard from '../InventoryCard'; import { NodeDashboardContext } from '../NodeDashboardContext'; -jest.mock('@openshift/dynamic-plugin-sdk', () => ({ - ...jest.requireActual('@openshift/dynamic-plugin-sdk'), +jest.mock('@console/dynamic-plugin-sdk/src/api/useResolvedExtensions', () => ({ + ...jest.requireActual('@console/dynamic-plugin-sdk/src/api/useResolvedExtensions'), useResolvedExtensions: jest.fn(), })); diff --git a/frontend/packages/console-dynamic-plugin-sdk/CHANGELOG-core.md b/frontend/packages/console-dynamic-plugin-sdk/CHANGELOG-core.md index fe439df1f99..7e15921e889 100644 --- a/frontend/packages/console-dynamic-plugin-sdk/CHANGELOG-core.md +++ b/frontend/packages/console-dynamic-plugin-sdk/CHANGELOG-core.md @@ -12,7 +12,12 @@ table in [Console dynamic plugins README](./README.md). ## 4.23.0-prerelease.5 - TBD -- **Type breaking**: Renamed `ExtensionTypeGuard` type to `ExtensionPredicate` ([#16115], [CONSOLE-5065]) +> This release removes support for passing multiple predicates to `useResolvedExtensions` hook. +> Consumers should call this hook once per each distinct extension type to avoid complexity associated +> with unions of distinct extension objects. + +- **Type breaking**: Replace `ExtensionTypeGuard` with `ExtensionPredicate` from `@openshift/dynamic-plugin-sdk` ([#16115], [CONSOLE-5065]) +- **Breaking**: `useResolvedExtensions` hook now accepts a single predicate parameter (TODO) ## 4.23.0-prerelease.4 - 2026-07-14 diff --git a/frontend/packages/console-dynamic-plugin-sdk/src/api/useResolvedExtensions.ts b/frontend/packages/console-dynamic-plugin-sdk/src/api/useResolvedExtensions.ts index 1f7066bccf6..e7dd6be77d4 100644 --- a/frontend/packages/console-dynamic-plugin-sdk/src/api/useResolvedExtensions.ts +++ b/frontend/packages/console-dynamic-plugin-sdk/src/api/useResolvedExtensions.ts @@ -1,21 +1,12 @@ -import type { UseResolvedExtensionsOptions as UseResolvedExtensionsOptionsSDK } from '@openshift/dynamic-plugin-sdk'; +import type { Extension, ExtensionPredicate } from '@openshift/dynamic-plugin-sdk'; import { useResolvedExtensions as useResolvedExtensionsSDK } from '@openshift/dynamic-plugin-sdk'; import { useExtensions } from '@console/plugin-sdk/src/api/useExtensions'; import type { UseResolvedExtensions } from '../extensions/console-types'; -import type { Extension, ExtensionPredicate, ResolvedExtension } from '../types'; - -const hookOptions: UseResolvedExtensionsOptionsSDK = { - useExtensionsImpl: useExtensions, -}; export const useResolvedExtensions: UseResolvedExtensions = ( - ...predicates: ExtensionPredicate[] -): [ResolvedExtension[], boolean, any[]] => { - const predicate = - predicates.length === 1 - ? predicates[0] - : predicates.length > 1 - ? (extension: Extension): extension is E => predicates.some((guard) => guard(extension)) - : undefined; - return useResolvedExtensionsSDK(predicate, hookOptions); + predicate: ExtensionPredicate, +) => { + const extensions = useExtensions(predicate); + + return useResolvedExtensionsSDK(extensions); }; diff --git a/frontend/packages/console-dynamic-plugin-sdk/src/extensions/console-types.ts b/frontend/packages/console-dynamic-plugin-sdk/src/extensions/console-types.ts index 12cb7a3b0cb..89a9c9133c1 100644 --- a/frontend/packages/console-dynamic-plugin-sdk/src/extensions/console-types.ts +++ b/frontend/packages/console-dynamic-plugin-sdk/src/extensions/console-types.ts @@ -8,6 +8,11 @@ import type { ElementType, } from 'react'; import type { K8sResourceCommon, ObjectMetadata } from '@openshift/api-types'; +import type { + Extension, + ExtensionPredicate, + LoadedAndResolvedExtension, +} from '@openshift/dynamic-plugin-sdk'; import type { QuickStartContextValues } from '@patternfly/quickstarts'; import type { CodeEditorProps as PfCodeEditorProps } from '@patternfly/react-code-editor'; import type { AlertVariant, ButtonProps } from '@patternfly/react-core'; @@ -28,10 +33,8 @@ import type { PrometheusEndpoint, PrometheusLabels, PrometheusValue, - ResolvedExtension, Selector, } from '../api/common-types'; -import type { Extension, ExtensionPredicate } from '../types'; import type { CustomDataSource } from './dashboard-data-source'; /* eslint-disable no-barrel-files/no-barrel-files */ @@ -263,8 +266,8 @@ export type UseK8sWatchResources = ( ) => WatchK8sResults; export type UseResolvedExtensions = ( - ...predicates: ExtensionPredicate[] -) => [ResolvedExtension[], boolean, any[]]; + predicate: ExtensionPredicate, +) => [LoadedAndResolvedExtension[], boolean, any[]]; export type GetSegmentAnalytics = () => { // TODO: use proper Segment Analytics API type diff --git a/frontend/packages/console-dynamic-plugin-sdk/src/types.ts b/frontend/packages/console-dynamic-plugin-sdk/src/types.ts index 0b9de43dfdb..1addc1f632e 100644 --- a/frontend/packages/console-dynamic-plugin-sdk/src/types.ts +++ b/frontend/packages/console-dynamic-plugin-sdk/src/types.ts @@ -4,7 +4,6 @@ export type { EncodedCodeRef, Extension, ExtensionFlags, - ExtensionPredicate, LoadedAndResolvedExtension as ResolvedExtension, LoadedExtension, MapCodeRefsToValues as ResolvedCodeRefProperties, diff --git a/frontend/packages/console-shared/src/hooks/useDetailsItemExtensionsForResource.ts b/frontend/packages/console-shared/src/hooks/useDetailsItemExtensionsForResource.ts index 35ff44a867e..47579f2ad6e 100644 --- a/frontend/packages/console-shared/src/hooks/useDetailsItemExtensionsForResource.ts +++ b/frontend/packages/console-shared/src/hooks/useDetailsItemExtensionsForResource.ts @@ -1,4 +1,5 @@ import { useCallback, useMemo } from 'react'; +import type { LoadedAndResolvedExtension, ExtensionPredicate } from '@openshift/dynamic-plugin-sdk'; import { useResolvedExtensions } from '@console/dynamic-plugin-sdk/src/api/useResolvedExtensions'; import type { K8sResourceCommon } from '@console/dynamic-plugin-sdk/src/extensions/console-types'; import type { @@ -6,7 +7,6 @@ import type { DetailsItemColumn, } from '@console/dynamic-plugin-sdk/src/extensions/details-item'; import { isDetailsItem } from '@console/dynamic-plugin-sdk/src/extensions/details-item'; -import type { ResolvedExtension, ExtensionPredicate } from '@console/dynamic-plugin-sdk/src/types'; import { referenceFor, referenceForExtensionModel } from '@console/internal/module/k8s/k8s'; /** @@ -52,4 +52,4 @@ export const useDetailsItemExtensionsForResource: UseDetailsItemExtensionsForRes type UseDetailsItemExtensionsForResource = ( obj: K8sResourceCommon, column: DetailsItemColumn, -) => ResolvedExtension[]; +) => LoadedAndResolvedExtension[]; diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 646b76b184a..c8748cb0154 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -3139,13 +3139,13 @@ __metadata: languageName: node linkType: hard -"@openshift/dynamic-plugin-sdk-webpack@npm:^5.2.0": - version: 5.2.0 - resolution: "@openshift/dynamic-plugin-sdk-webpack@npm:5.2.0" +"@openshift/dynamic-plugin-sdk-webpack@npm:^5.3.0": + version: 5.3.0 + resolution: "@openshift/dynamic-plugin-sdk-webpack@npm:5.3.0" dependencies: lodash: "npm:^4.17.23" semver: "npm:^7.7.3" - yup: "npm:^1.7.1" + zod: "npm:^3.25.67" peerDependencies: "@rspack/core": ^2.0.8 webpack: ^5.100.0 @@ -3154,21 +3154,21 @@ __metadata: optional: true webpack: optional: true - checksum: 10c0/8ccd43d74c4de9c76b0583ee35b919be4327ffe8101343b88e5245ffb287d71a7a17d0c264dfd9bfe88b6361147d3c0e7641aeea97990ee26b7e06dc0640493b + checksum: 10c0/7294d01156d86eab453a88fe663145c8c769e1886e0e517159fe7b008827274ab53fe70788c343bbe93cf2e0c20098fb9b59313409e72c9a7060a2c1288ada30 languageName: node linkType: hard -"@openshift/dynamic-plugin-sdk@npm:^8.2.0": - version: 8.2.0 - resolution: "@openshift/dynamic-plugin-sdk@npm:8.2.0" +"@openshift/dynamic-plugin-sdk@npm:^9.0.0": + version: 9.0.0 + resolution: "@openshift/dynamic-plugin-sdk@npm:9.0.0" dependencies: lodash: "npm:^4.17.23" semver: "npm:^7.7.3" uuid: "npm:^8.3.2" - yup: "npm:^1.7.1" + zod: "npm:^3.25.67" peerDependencies: react: ^18 || ^19 - checksum: 10c0/a9e3e1a145014a13310acd4630c7a2b7a7545b6c089e1d41e99ceaec061c1a270051d44bd26ddd09ec61bb02533ecfab55663cedb41a20d63acf824067eb63ab + checksum: 10c0/29de4ecd6811d621d0b83c55aec3e04371f94f26f33b1544bedcf20c9c4e6ed825d1cf3d6190c7292f840c35490f2c84450220874b43c01a29edf03d500b17cd languageName: node linkType: hard @@ -16290,8 +16290,8 @@ __metadata: "@kubernetes/client-node": "npm:^1.4.0" "@monaco-editor/react": "npm:^4.7.0" "@openshift/api-types": "npm:^1.0.0" - "@openshift/dynamic-plugin-sdk": "npm:^8.2.0" - "@openshift/dynamic-plugin-sdk-webpack": "npm:^5.2.0" + "@openshift/dynamic-plugin-sdk": "npm:^9.0.0" + "@openshift/dynamic-plugin-sdk-webpack": "npm:^5.3.0" "@patternfly/patternfly": "npm:~6.6.0" "@patternfly/quickstarts": "npm:~6.6.0" "@patternfly/react-catalog-view-extension": "npm:~6.5.0" @@ -22222,6 +22222,13 @@ __metadata: languageName: node linkType: hard +"zod@npm:^3.25.67": + version: 3.25.76 + resolution: "zod@npm:3.25.76" + checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c + languageName: node + linkType: hard + "zod@npm:^4.1.11": version: 4.4.3 resolution: "zod@npm:4.4.3"