diff --git a/.changeset/renovate-ee17247.md b/.changeset/renovate-ee17247.md new file mode 100644 index 0000000000..a97a63d138 --- /dev/null +++ b/.changeset/renovate-ee17247.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes-common': patch +'@backstage/plugin-kubernetes-node': patch +'@backstage/plugin-kubernetes-react': patch +'@backstage/plugin-kubernetes': patch +--- + +Updated dependency `@kubernetes/client-node` to `1.1.2`. diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 514ad47c40..00bde45e29 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -78,7 +78,7 @@ "@backstage/types": "workspace:^", "@google-cloud/container": "^5.0.0", "@jest-mock/express": "^2.0.1", - "@kubernetes/client-node": "1.0.0-rc7", + "@kubernetes/client-node": "1.1.2", "@types/express": "^4.17.6", "@types/http-proxy-middleware": "^1.0.0", "@types/luxon": "^3.0.0", diff --git a/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.test.ts b/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.test.ts index 3a98652c37..eb5606d5ca 100644 --- a/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.test.ts +++ b/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { createMockDirectory } from '@backstage/backend-test-utils'; import { ServiceAccountStrategy } from './ServiceAccountStrategy'; @@ -22,7 +23,7 @@ const mockDir = createMockDirectory({ }, }); -jest.mock('@kubernetes/client-node', () => ({ +const mockClient = { KubeConfig: class { #loaded = false; loadFromCluster() { @@ -43,12 +44,13 @@ jest.mock('@kubernetes/client-node', () => ({ }; } }, -})); +}; describe('ServiceAccountStrategy', () => { describe('#getCredential', () => { it('reads bearer token from config', async () => { const strategy = new ServiceAccountStrategy(); + (strategy as any).injectedKubernetesClient = mockClient; const credential = await strategy.getCredential({ name: '', @@ -65,6 +67,7 @@ describe('ServiceAccountStrategy', () => { describe('when serviceAccountToken is absent from config', () => { it('reads in-cluster token', async () => { const strategy = new ServiceAccountStrategy(); + (strategy as any).injectedKubernetesClient = mockClient; const credential = await strategy.getCredential({ name: '', diff --git a/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts b/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts index aff6e61a64..250a8d5250 100644 --- a/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts @@ -20,7 +20,7 @@ import { ClusterDetails, KubernetesCredential, } from '@backstage/plugin-kubernetes-node'; -import { KubeConfig, User } from '@kubernetes/client-node'; +import type { User } from '@kubernetes/client-node'; import fs from 'fs-extra'; /** @@ -28,9 +28,16 @@ import fs from 'fs-extra'; * @public */ export class ServiceAccountStrategy implements AuthenticationStrategy { + // Only used in tests + private injectedKubernetesClient?: typeof import('@kubernetes/client-node'); + public async getCredential( clusterDetails: ClusterDetails, ): Promise { + const { KubeConfig } = + this.injectedKubernetesClient ?? + (await import('@kubernetes/client-node')); + const token = clusterDetails.authMetadata.serviceAccountToken; if (token) { return { type: 'bearer token', token }; diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 424212287f..a265a142bb 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -33,7 +33,7 @@ import { PodFetchResponse, PodStatusFetchResponse, } from '@backstage/plugin-kubernetes-common'; -import { +import type { ContainerStatus, CurrentResourceUsage, PodStatus, diff --git a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts index abb98cfb81..d960f01645 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts @@ -14,14 +14,7 @@ * limitations under the License. */ -import { - bufferFromFileOrString, - Cluster, - CoreV1Api, - KubeConfig, - Metrics, - topPods, -} from '@kubernetes/client-node'; +import type { Cluster, CoreV1Api, Metrics } from '@kubernetes/client-node'; import lodash, { Dictionary } from 'lodash'; import { FetchResponseWrapper, @@ -126,12 +119,14 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { return Promise.all(fetchResults).then(fetchResultsToResponseWrapper); } - fetchPodMetricsByNamespaces( + async fetchPodMetricsByNamespaces( clusterDetails: ClusterDetails, credential: KubernetesCredential, namespaces: Set, labelSelector?: string, ): Promise { + const { topPods } = await import('@kubernetes/client-node'); + const fetchResults = Array.from(namespaces).map(async ns => { const [podMetrics, podList] = await Promise.all([ this.fetchResource( @@ -193,7 +188,7 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { }; } - private fetchResource( + private async fetchResource( clusterDetails: ClusterDetails, credential: KubernetesCredential, group: string, @@ -217,9 +212,9 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { clusterDetails.authMetadata[ANNOTATION_KUBERNETES_AUTH_PROVIDER]; if (this.isServiceAccountAuthentication(authProvider, clusterDetails)) { - [url, requestInit] = this.fetchArgsInCluster(credential); + [url, requestInit] = await this.fetchArgsInCluster(credential); } else if (!this.isCredentialMissing(authProvider, credential)) { - [url, requestInit] = this.fetchArgs(clusterDetails, credential); + [url, requestInit] = await this.fetchArgs(clusterDetails, credential); } else { return Promise.reject( new Error( @@ -261,10 +256,12 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { ); } - private fetchArgs( + private async fetchArgs( clusterDetails: ClusterDetails, credential: KubernetesCredential, - ): [URL, RequestInit] { + ): Promise<[URL, fetch.RequestInit]> { + const { bufferFromFileOrString } = await import('@kubernetes/client-node'); + const requestInit: RequestInit = { method: 'GET', headers: { @@ -293,9 +290,12 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { } return [url, requestInit]; } - private fetchArgsInCluster( + + private async fetchArgsInCluster( credential: KubernetesCredential, - ): [URL, RequestInit] { + ): Promise<[URL, fetch.RequestInit]> { + const { KubeConfig } = await import('@kubernetes/client-node'); + const requestInit: RequestInit = { method: 'GET', headers: { diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 51142a8d47..e176285a49 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -27,11 +27,7 @@ import { KubernetesRequestAuth, } from '@backstage/plugin-kubernetes-common'; import { AuthorizeResult } from '@backstage/plugin-permission-common'; -import { - bufferFromFileOrString, - Cluster, - KubeConfig, -} from '@kubernetes/client-node'; +import type { Cluster } from '@kubernetes/client-node'; import { createProxyMiddleware, RequestHandler } from 'http-proxy-middleware'; import fs from 'fs-extra'; @@ -176,6 +172,10 @@ export class KubernetesProxy { const cluster = await this.getClusterForRequest(req); const url = new URL(cluster.url); + const { bufferFromFileOrString } = await import( + '@kubernetes/client-node' + ); + const target: any = { protocol: url.protocol, host: url.hostname, @@ -234,6 +234,8 @@ export class KubernetesProxy { } private async getClusterForRequest(req: Request): Promise { + const { KubeConfig } = await import('@kubernetes/client-node'); + const clusterName = req.headers[HEADER_KUBERNETES_CLUSTER.toLowerCase()]; const clusters = await this.clusterSupplier.getClusters({ credentials: await this.httpAuth.credentials(req), diff --git a/plugins/kubernetes-cluster/src/components/ApiResources/ApiResources.tsx b/plugins/kubernetes-cluster/src/components/ApiResources/ApiResources.tsx index bc4cb7b795..f25cf0b950 100644 --- a/plugins/kubernetes-cluster/src/components/ApiResources/ApiResources.tsx +++ b/plugins/kubernetes-cluster/src/components/ApiResources/ApiResources.tsx @@ -17,7 +17,7 @@ import { useApiResources } from './useApiResources'; import { useCallback, useEffect } from 'react'; import { useEntity } from '@backstage/plugin-catalog-react'; import { Table, TableColumn } from '@backstage/core-components'; -import { IAPIGroup } from '@kubernetes-models/apimachinery/apis/meta/v1'; +import type { IAPIGroup } from '@kubernetes-models/apimachinery/apis/meta/v1'; import { useKubernetesClusterError } from '../KubernetesClusterErrorContext/KubernetesClusterErrorContext'; import { makeStyles } from '@material-ui/core/styles'; diff --git a/plugins/kubernetes-cluster/src/components/ApiResources/useApiResources.ts b/plugins/kubernetes-cluster/src/components/ApiResources/useApiResources.ts index 6724c5ac5d..ddf2e99f66 100644 --- a/plugins/kubernetes-cluster/src/components/ApiResources/useApiResources.ts +++ b/plugins/kubernetes-cluster/src/components/ApiResources/useApiResources.ts @@ -17,7 +17,7 @@ import useAsync from 'react-use/esm/useAsync'; import { useApi } from '@backstage/core-plugin-api'; import { kubernetesApiRef } from '@backstage/plugin-kubernetes-react'; -import { IAPIGroupList } from '@kubernetes-models/apimachinery/apis/meta/v1'; +import type { IAPIGroupList } from '@kubernetes-models/apimachinery/apis/meta/v1'; /** * Arguments for useApiResources diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index a796bf7460..1c230a7876 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -55,7 +55,7 @@ "@backstage/catalog-model": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/types": "workspace:^", - "@kubernetes/client-node": "1.0.0-rc7", + "@kubernetes/client-node": "1.1.2", "kubernetes-models": "^4.3.1", "lodash": "^4.17.21", "luxon": "^3.0.0" diff --git a/plugins/kubernetes-common/report.api.md b/plugins/kubernetes-common/report.api.md index 80486259a2..2d94aaefff 100644 --- a/plugins/kubernetes-common/report.api.md +++ b/plugins/kubernetes-common/report.api.md @@ -9,21 +9,21 @@ import { FetchResponse as FetchResponse_2 } from '@backstage/plugin-kubernetes-c import type { JsonObject } from '@backstage/types'; import type { JsonValue } from '@backstage/types'; import { ObjectsByEntityResponse as ObjectsByEntityResponse_2 } from '@backstage/plugin-kubernetes-common'; -import { PodStatus } from '@kubernetes/client-node'; -import { V1ConfigMap } from '@kubernetes/client-node'; -import { V1CronJob } from '@kubernetes/client-node'; -import { V1DaemonSet } from '@kubernetes/client-node'; -import { V1Deployment } from '@kubernetes/client-node'; -import { V1Ingress } from '@kubernetes/client-node'; -import { V1Job } from '@kubernetes/client-node'; -import { V1LimitRange } from '@kubernetes/client-node'; -import { V1Pod } from '@kubernetes/client-node'; -import { V1ReplicaSet } from '@kubernetes/client-node'; -import { V1ResourceQuota } from '@kubernetes/client-node'; -import { V1Secret } from '@kubernetes/client-node'; -import { V1Service } from '@kubernetes/client-node'; -import { V1StatefulSet } from '@kubernetes/client-node'; -import { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import type { PodStatus } from '@kubernetes/client-node'; +import type { V1ConfigMap } from '@kubernetes/client-node'; +import type { V1CronJob } from '@kubernetes/client-node'; +import type { V1DaemonSet } from '@kubernetes/client-node'; +import type { V1Deployment } from '@kubernetes/client-node'; +import type { V1Ingress } from '@kubernetes/client-node'; +import type { V1Job } from '@kubernetes/client-node'; +import type { V1LimitRange } from '@kubernetes/client-node'; +import type { V1Pod } from '@kubernetes/client-node'; +import type { V1ReplicaSet } from '@kubernetes/client-node'; +import type { V1ResourceQuota } from '@kubernetes/client-node'; +import type { V1Secret } from '@kubernetes/client-node'; +import type { V1Service } from '@kubernetes/client-node'; +import type { V1StatefulSet } from '@kubernetes/client-node'; +import type { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; // @public export const ANNOTATION_KUBERNETES_API_SERVER = 'kubernetes.io/api-server'; diff --git a/plugins/kubernetes-common/src/error-detection/error-detection.test.ts b/plugins/kubernetes-common/src/error-detection/error-detection.test.ts index f57226a01c..fc10d74fef 100644 --- a/plugins/kubernetes-common/src/error-detection/error-detection.test.ts +++ b/plugins/kubernetes-common/src/error-detection/error-detection.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { +import type { V1Pod, V1Deployment, V2HorizontalPodAutoscaler, diff --git a/plugins/kubernetes-common/src/types.ts b/plugins/kubernetes-common/src/types.ts index 82b0caf3a9..5ef91a6d63 100644 --- a/plugins/kubernetes-common/src/types.ts +++ b/plugins/kubernetes-common/src/types.ts @@ -15,7 +15,7 @@ */ import type { JsonObject, JsonValue } from '@backstage/types'; -import { +import type { PodStatus, V1ConfigMap, V1CronJob, diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index cf6cf6dd39..b6d7dabe2a 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -42,7 +42,7 @@ "@backstage/catalog-model": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", "@backstage/types": "workspace:^", - "@kubernetes/client-node": "1.0.0-rc7", + "@kubernetes/client-node": "1.1.2", "node-fetch": "^2.7.0", "winston": "^3.2.1" }, diff --git a/plugins/kubernetes-node/src/auth/PinnipedHelper.test.ts b/plugins/kubernetes-node/src/auth/PinnipedHelper.test.ts index 524e034117..1973ce0a7e 100644 --- a/plugins/kubernetes-node/src/auth/PinnipedHelper.test.ts +++ b/plugins/kubernetes-node/src/auth/PinnipedHelper.test.ts @@ -38,6 +38,8 @@ import { setupServer } from 'msw/node'; import { loggerToWinstonLogger } from '@backstage/backend-common'; import { ExtendedHttpServer } from '@backstage/backend-defaults/rootHttpRouter'; +jest.setTimeout(60_000); + describe('Pinniped - tokenCredentialRequest', () => { let app: ExtendedHttpServer; const logger = loggerToWinstonLogger(mockServices.logger.mock()); diff --git a/plugins/kubernetes-node/src/auth/PinnipedHelper.ts b/plugins/kubernetes-node/src/auth/PinnipedHelper.ts index 1f824bae33..f46999abdc 100644 --- a/plugins/kubernetes-node/src/auth/PinnipedHelper.ts +++ b/plugins/kubernetes-node/src/auth/PinnipedHelper.ts @@ -16,7 +16,6 @@ import { ClusterDetails } from '@backstage/plugin-kubernetes-node'; import * as https from 'https'; -import { bufferFromFileOrString } from '@kubernetes/client-node'; import fetch, { RequestInit } from 'node-fetch'; import { Logger } from 'winston'; @@ -75,7 +74,7 @@ export class PinnipedHelper { url.pathname = `/apis/${apiGroup}/tokencredentialrequests`; - const requestInit: RequestInit = this.buildRequestForPinniped( + const requestInit = await this.buildRequestForPinniped( url, clusterDetails, pinnipedParams, @@ -107,11 +106,13 @@ export class PinnipedHelper { return Promise.reject(data.status.message); } - private buildRequestForPinniped( + private async buildRequestForPinniped( url: URL, clusterDetails: ClusterDetails, pinnipedParams: PinnipedParameters, - ): RequestInit { + ): Promise { + const { bufferFromFileOrString } = await import('@kubernetes/client-node'); + const body = { apiVersion: pinnipedParams.tokenCredentialRequest?.apiGroup ?? diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 4b1c75cb51..156a4d578b 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -62,7 +62,7 @@ "@backstage/types": "workspace:^", "@kubernetes-models/apimachinery": "^2.0.0", "@kubernetes-models/base": "^5.0.0", - "@kubernetes/client-node": "1.0.0-rc7", + "@kubernetes/client-node": "1.1.2", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "^4.0.0-alpha.61", diff --git a/plugins/kubernetes-react/report.api.md b/plugins/kubernetes-react/report.api.md index 3097d6ad22..cd71b70f70 100644 --- a/plugins/kubernetes-react/report.api.md +++ b/plugins/kubernetes-react/report.api.md @@ -22,8 +22,8 @@ import { FetchApi } from '@backstage/core-plugin-api'; import { GroupedResponses } from '@backstage/plugin-kubernetes-common'; import { IContainer } from 'kubernetes-models/v1'; import { IContainerStatus } from 'kubernetes-models/v1'; -import { IIoK8sApimachineryPkgApisMetaV1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; -import { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import type { IIoK8sApimachineryPkgApisMetaV1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import type { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; import { JsonObject } from '@backstage/types'; import { JSX as JSX_2 } from 'react/jsx-runtime'; import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; @@ -34,11 +34,11 @@ import { Pod } from 'kubernetes-models/v1'; import { Pod as Pod_2 } from 'kubernetes-models/v1/Pod'; import { ProfileInfoApi } from '@backstage/core-plugin-api'; import { ReactNode } from 'react'; -import { TypeMeta } from '@kubernetes-models/base'; -import { V1Job } from '@kubernetes/client-node'; -import { V1ObjectMeta } from '@kubernetes/client-node'; -import { V1Pod } from '@kubernetes/client-node'; -import { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import type { TypeMeta } from '@kubernetes-models/base'; +import type { V1Job } from '@kubernetes/client-node'; +import type { V1ObjectMeta } from '@kubernetes/client-node'; +import type { V1Pod } from '@kubernetes/client-node'; +import type { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; import { WorkloadsByEntityRequest } from '@backstage/plugin-kubernetes-common'; // @public (undocumented) diff --git a/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx index eba4b5ba5b..8eeed47eb6 100644 --- a/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx @@ -20,7 +20,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1CronJob, V1Job } from '@kubernetes/client-node'; +import type { V1CronJob, V1Job } from '@kubernetes/client-node'; import { JobsAccordions } from '../JobsAccordions'; import { CronJobDrawer } from './CronJobsDrawer'; import { getOwnedResources } from '../../utils/owner'; diff --git a/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.tsx b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.tsx index 110cfe4509..a7ffdca854 100644 --- a/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.tsx +++ b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { V1CronJob } from '@kubernetes/client-node'; +import type { V1CronJob } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; diff --git a/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.tsx b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.tsx index e268f3a6e4..a299d412c9 100644 --- a/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.tsx +++ b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.tsx @@ -21,7 +21,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1Pod, V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import type { V1Pod, V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; import { PodsTable } from '../../Pods'; import { HorizontalPodAutoscalerDrawer } from '../../HorizontalPodAutoscalers'; import { RolloutDrawer } from './RolloutDrawer'; diff --git a/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsAccordions.tsx b/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsAccordions.tsx index ab2adca5da..a96034a012 100644 --- a/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsAccordions.tsx @@ -20,7 +20,7 @@ import AccordionDetails from '@material-ui/core/AccordionDetails'; import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1Pod, V1DaemonSet } from '@kubernetes/client-node'; +import type { V1Pod, V1DaemonSet } from '@kubernetes/client-node'; import { PodsTable } from '../Pods'; import { DaemonSetDrawer } from './DaemonSetsDrawer'; import { getOwnedResources } from '../../utils/owner'; diff --git a/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsDrawer.tsx b/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsDrawer.tsx index 7e8f295408..400512f0d2 100644 --- a/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsDrawer.tsx +++ b/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsDrawer.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { V1DaemonSet } from '@kubernetes/client-node'; +import type { V1DaemonSet } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; diff --git a/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.tsx b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.tsx index be9d5e4f1c..c94059ccc2 100644 --- a/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.tsx +++ b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.tsx @@ -15,7 +15,7 @@ */ import { ReactNode } from 'react'; -import { V1Deployment } from '@kubernetes/client-node'; +import type { V1Deployment } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import { renderCondition } from '../../utils/pod'; import Typography from '@material-ui/core/Typography'; diff --git a/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx index 10d4be9352..75da5e7815 100644 --- a/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx @@ -21,7 +21,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { +import type { V1Deployment, V1Pod, V2HorizontalPodAutoscaler, diff --git a/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx b/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx index 8ccc3c3c79..22bc3cd6a6 100644 --- a/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx +++ b/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx @@ -15,7 +15,7 @@ */ import { ReactNode } from 'react'; -import { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import type { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; /** @public */ diff --git a/plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.tsx b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.tsx index 737f1d1a5d..4adf9a438b 100644 --- a/plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.tsx +++ b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { V1Ingress } from '@kubernetes/client-node'; +import type { V1Ingress } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; diff --git a/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx index c01f765f35..4e68985768 100644 --- a/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx +++ b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx @@ -20,7 +20,7 @@ import AccordionDetails from '@material-ui/core/AccordionDetails'; import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1Ingress } from '@kubernetes/client-node'; +import type { V1Ingress } from '@kubernetes/client-node'; import { IngressDrawer } from './IngressDrawer'; import { GroupedResponsesContext } from '../../hooks'; import { StructuredMetadataTable } from '@backstage/core-components'; diff --git a/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.test.tsx b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.test.tsx index 2399673820..584929cef1 100644 --- a/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.test.tsx +++ b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.test.tsx @@ -19,11 +19,14 @@ import { JobsAccordions } from './JobsAccordions'; import * as oneCronJobsFixture from '../../__fixtures__/1-cronjobs.json'; import { renderInTestApp } from '@backstage/test-utils'; import { kubernetesProviders } from '../../hooks/test-utils'; -import { V1Job } from '@kubernetes/client-node'; -import { ObjectSerializer } from '@kubernetes/client-node/dist/gen/models/ObjectSerializer'; +import type { V1Job } from '@kubernetes/client-node'; describe('JobsAccordions', () => { it('should render 2 jobs', async () => { + const { ObjectSerializer } = await import( + '@kubernetes/client-node/dist/gen/models/ObjectSerializer' + ); + const wrapper = kubernetesProviders(oneCronJobsFixture, new Set()); const jobs: V1Job[] = oneCronJobsFixture.jobs.map( diff --git a/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx index 6398812d72..97d154c70a 100644 --- a/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx @@ -19,7 +19,7 @@ import AccordionDetails from '@material-ui/core/AccordionDetails'; import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1Job, V1Pod } from '@kubernetes/client-node'; +import type { V1Job, V1Pod } from '@kubernetes/client-node'; import { PodsTable } from '../Pods'; import { JobDrawer } from './JobsDrawer'; import { getOwnedResources } from '../../utils/owner'; diff --git a/plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.tsx b/plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.tsx index 82078fd9dc..675fa9f427 100644 --- a/plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.tsx +++ b/plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { V1Job } from '@kubernetes/client-node'; +import type { V1Job } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; diff --git a/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx index 0a30d449d0..323ce650d9 100644 --- a/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx +++ b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx @@ -15,7 +15,7 @@ */ import { ReactNode, ChangeEvent, useState } from 'react'; -import { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import type { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; import Drawer from '@material-ui/core/Drawer'; import Grid from '@material-ui/core/Grid'; import IconButton from '@material-ui/core/IconButton'; diff --git a/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx index d393e4b073..fb52063177 100644 --- a/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx +++ b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx @@ -25,7 +25,7 @@ import Grid from '@material-ui/core/Grid'; import { makeStyles, createStyles, Theme } from '@material-ui/core/styles'; import Close from '@material-ui/icons/Close'; import OpenInNewIcon from '@material-ui/icons/OpenInNew'; -import { V1ObjectMeta } from '@kubernetes/client-node'; +import type { V1ObjectMeta } from '@kubernetes/client-node'; import { withStyles } from '@material-ui/core/styles'; import { LinkButton as BackstageButton, diff --git a/plugins/kubernetes-react/src/components/Pods/PodsTable.tsx b/plugins/kubernetes-react/src/components/Pods/PodsTable.tsx index b6cfd36d83..8d3c14d86a 100644 --- a/plugins/kubernetes-react/src/components/Pods/PodsTable.tsx +++ b/plugins/kubernetes-react/src/components/Pods/PodsTable.tsx @@ -27,7 +27,7 @@ import { Table, TableColumn } from '@backstage/core-components'; import { ClusterContext } from '../../hooks/Cluster'; import { useMatchingErrors } from '../../hooks/useMatchingErrors'; import { Pod } from 'kubernetes-models/v1/Pod'; -import { V1Pod } from '@kubernetes/client-node'; +import type { V1Pod } from '@kubernetes/client-node'; import { usePodMetrics } from '../../hooks/usePodMetrics'; import Typography from '@material-ui/core/Typography'; diff --git a/plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.tsx b/plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.tsx index accbeb565e..a9f7b7b5ad 100644 --- a/plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.tsx +++ b/plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { V1Service } from '@kubernetes/client-node'; +import type { V1Service } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; diff --git a/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx b/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx index 9ad344ab08..34539ef2a9 100644 --- a/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx +++ b/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx @@ -21,7 +21,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1Service } from '@kubernetes/client-node'; +import type { V1Service } from '@kubernetes/client-node'; import { ServiceDrawer } from './ServiceDrawer'; import { GroupedResponsesContext } from '../../hooks'; import { StructuredMetadataTable } from '@backstage/core-components'; diff --git a/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx index 902d537c6c..7b7a2b7bb2 100644 --- a/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx +++ b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx @@ -15,7 +15,7 @@ */ import { ReactNode } from 'react'; -import { V1StatefulSet } from '@kubernetes/client-node'; +import type { V1StatefulSet } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import { renderCondition } from '../../utils/pod'; import Typography from '@material-ui/core/Typography'; diff --git a/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx index 982f1c290b..e3ae9776bd 100644 --- a/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx @@ -21,7 +21,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { +import type { V1Pod, V2HorizontalPodAutoscaler, V1StatefulSet, diff --git a/plugins/kubernetes-react/src/hooks/useMatchingErrors.ts b/plugins/kubernetes-react/src/hooks/useMatchingErrors.ts index 78dd0e80e6..980a4dd336 100644 --- a/plugins/kubernetes-react/src/hooks/useMatchingErrors.ts +++ b/plugins/kubernetes-react/src/hooks/useMatchingErrors.ts @@ -18,8 +18,8 @@ import { DetectedError, ResourceRef, } from '@backstage/plugin-kubernetes-common'; -import { TypeMeta } from '@kubernetes-models/base'; -import { IIoK8sApimachineryPkgApisMetaV1ObjectMeta as V1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import type { TypeMeta } from '@kubernetes-models/base'; +import type { IIoK8sApimachineryPkgApisMetaV1ObjectMeta as V1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; /** * Context for detected errors diff --git a/plugins/kubernetes-react/src/hooks/usePodMetrics.ts b/plugins/kubernetes-react/src/hooks/usePodMetrics.ts index 863fc27c3a..b167ab590a 100644 --- a/plugins/kubernetes-react/src/hooks/usePodMetrics.ts +++ b/plugins/kubernetes-react/src/hooks/usePodMetrics.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { createContext, useContext } from 'react'; -import { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import type { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; import { ClientPodStatus } from '@backstage/plugin-kubernetes-common'; /** diff --git a/plugins/kubernetes-react/src/utils/owner.ts b/plugins/kubernetes-react/src/utils/owner.ts index e7b7d25340..3e3aa11c95 100644 --- a/plugins/kubernetes-react/src/utils/owner.ts +++ b/plugins/kubernetes-react/src/utils/owner.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { +import type { V1ObjectMeta, V2HorizontalPodAutoscaler, V1Pod, diff --git a/plugins/kubernetes-react/src/utils/pod.tsx b/plugins/kubernetes-react/src/utils/pod.tsx index e0b1875b43..97b44d4d24 100644 --- a/plugins/kubernetes-react/src/utils/pod.tsx +++ b/plugins/kubernetes-react/src/utils/pod.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { +import type { V1Pod, V1PodCondition, V1DeploymentCondition, diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index fcf2b4c6a1..cffb1162ee 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -69,7 +69,7 @@ "@backstage/plugin-permission-react": "workspace:^", "@kubernetes-models/apimachinery": "^2.0.0", "@kubernetes-models/base": "^5.0.0", - "@kubernetes/client-node": "1.0.0-rc7", + "@kubernetes/client-node": "1.1.2", "@material-ui/core": "^4.12.2", "cronstrue": "^2.2.0", "js-yaml": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index e8227b1211..e24526eeab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6794,7 +6794,7 @@ __metadata: "@backstage/types": "workspace:^" "@google-cloud/container": "npm:^5.0.0" "@jest-mock/express": "npm:^2.0.1" - "@kubernetes/client-node": "npm:1.0.0-rc7" + "@kubernetes/client-node": "npm:1.1.2" "@types/aws4": "npm:^1.5.1" "@types/express": "npm:^4.17.6" "@types/http-proxy-middleware": "npm:^1.0.0" @@ -6869,7 +6869,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/types": "workspace:^" - "@kubernetes/client-node": "npm:1.0.0-rc7" + "@kubernetes/client-node": "npm:1.1.2" kubernetes-models: "npm:^4.3.1" lodash: "npm:^4.17.21" luxon: "npm:^3.0.0" @@ -6890,7 +6890,7 @@ __metadata: "@backstage/plugin-kubernetes-backend": "workspace:^" "@backstage/plugin-kubernetes-common": "workspace:^" "@backstage/types": "workspace:^" - "@kubernetes/client-node": "npm:1.0.0-rc7" + "@kubernetes/client-node": "npm:1.1.2" msw: "npm:^1.3.1" node-fetch: "npm:^2.7.0" supertest: "npm:^7.0.0" @@ -6913,7 +6913,7 @@ __metadata: "@backstage/types": "workspace:^" "@kubernetes-models/apimachinery": "npm:^2.0.0" "@kubernetes-models/base": "npm:^5.0.0" - "@kubernetes/client-node": "npm:1.0.0-rc7" + "@kubernetes/client-node": "npm:1.1.2" "@material-ui/core": "npm:^4.9.13" "@material-ui/icons": "npm:^4.11.3" "@material-ui/lab": "npm:^4.0.0-alpha.61" @@ -6963,7 +6963,7 @@ __metadata: "@backstage/test-utils": "workspace:^" "@kubernetes-models/apimachinery": "npm:^2.0.0" "@kubernetes-models/base": "npm:^5.0.0" - "@kubernetes/client-node": "npm:1.0.0-rc7" + "@kubernetes/client-node": "npm:1.1.2" "@material-ui/core": "npm:^4.12.2" "@testing-library/dom": "npm:^10.0.0" "@testing-library/jest-dom": "npm:^6.0.0" @@ -11484,9 +11484,9 @@ __metadata: languageName: node linkType: hard -"@kubernetes/client-node@npm:1.0.0-rc7": - version: 1.0.0-rc7 - resolution: "@kubernetes/client-node@npm:1.0.0-rc7" +"@kubernetes/client-node@npm:1.1.2": + version: 1.1.2 + resolution: "@kubernetes/client-node@npm:1.1.2" dependencies: "@types/js-yaml": "npm:^4.0.1" "@types/node": "npm:^22.0.0" @@ -11495,19 +11495,19 @@ __metadata: "@types/tar": "npm:^6.1.1" "@types/ws": "npm:^8.5.4" form-data: "npm:^4.0.0" + hpagent: "npm:^1.2.0" isomorphic-ws: "npm:^5.0.0" js-yaml: "npm:^4.1.0" - jsonpath-plus: "npm:^10.0.0" + jsonpath-plus: "npm:^10.3.0" node-fetch: "npm:^2.6.9" - openid-client: "npm:^5.6.5" + openid-client: "npm:^6.1.3" rfc4648: "npm:^1.3.0" + socks-proxy-agent: "npm:^8.0.4" stream-buffers: "npm:^3.0.2" tar: "npm:^7.0.0" tmp-promise: "npm:^3.0.2" - tslib: "npm:^2.5.0" - url-parse: "npm:^1.4.3" ws: "npm:^8.18.0" - checksum: 10/dad4432c97d24410f3af293b64e3e261d3807d2e23d5b2e022e34d59b0fddd1e26087900695b13917941b40dda02dc6af3e04f08ffb3a6a28b1b23a8dc7543bb + checksum: 10/3dd193dc8c0eb86bceb8a184e178e39c72278c4c6cccad25c595c4b3d1f56ac36778a845abd18c013971db9d8a7ed1febd88dab8791e0819bbd74a2850f0e2ca languageName: node linkType: hard @@ -34375,6 +34375,13 @@ __metadata: languageName: node linkType: hard +"jose@npm:^6.0.10": + version: 6.0.10 + resolution: "jose@npm:6.0.10" + checksum: 10/8ba0d1aca94bdf780247c737328114fab3e394e1531e881dfe3fdd1d4a293b08cf7c0242769e72c8c8eee15c95761b542cf10730c3dfbb108084762df7d25cec + languageName: node + linkType: hard + "js-base64@npm:^3.6.0": version: 3.7.7 resolution: "js-base64@npm:3.7.7" @@ -38884,6 +38891,13 @@ __metadata: languageName: node linkType: hard +"oauth4webapi@npm:^3.4.1": + version: 3.5.0 + resolution: "oauth4webapi@npm:3.5.0" + checksum: 10/7ac858b6edf3701c4752f386788acab01f7567a3e6068316582d80298b8113999bb9062d498ce0ab8bb4c4802d8007c5a1afdcb42974ffcf603af20b6d832993 + languageName: node + linkType: hard + "oauth@npm:0.10.x": version: 0.10.0 resolution: "oauth@npm:0.10.0" @@ -39247,7 +39261,7 @@ __metadata: languageName: node linkType: hard -"openid-client@npm:^5.3.0, openid-client@npm:^5.4.3, openid-client@npm:^5.5.0, openid-client@npm:^5.6.5": +"openid-client@npm:^5.3.0, openid-client@npm:^5.4.3, openid-client@npm:^5.5.0": version: 5.7.1 resolution: "openid-client@npm:5.7.1" dependencies: @@ -39259,6 +39273,16 @@ __metadata: languageName: node linkType: hard +"openid-client@npm:^6.1.3": + version: 6.4.2 + resolution: "openid-client@npm:6.4.2" + dependencies: + jose: "npm:^6.0.10" + oauth4webapi: "npm:^3.4.1" + checksum: 10/798d4c88e6a5e52a37c8d321b92da9a93a431cfc6f909857ae1aadb558d2444d31fde68e03fd59e2779b69cdf46707f5a52e5ba9eaf4ab2e4bd63e621b51ada8 + languageName: node + linkType: hard + "oppa@npm:^0.4.0": version: 0.4.0 resolution: "oppa@npm:0.4.0" @@ -47493,7 +47517,7 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.4.3, url-parse@npm:^1.5.10, url-parse@npm:^1.5.3": +"url-parse@npm:^1.5.10, url-parse@npm:^1.5.3": version: 1.5.10 resolution: "url-parse@npm:1.5.10" dependencies: