Merge branch 'backstage:master' into master
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
---
|
||||
'@backstage/plugin-techdocs-react': patch
|
||||
---
|
||||
|
||||
Add `toLowerEntityRefMaybe()` helper function for handling `techdocs.legacyUseCaseSensitiveTripletPaths` flag.
|
||||
Pass modified `entityRef` to `TechDocsReaderPageContext` to handle the `techdocs.legacyUseCaseSensitiveTripletPaths` flag.
|
||||
@@ -5,5 +5,5 @@ authorUrl: https://roadie.io/?utm_source=backstage.io&utm_medium=marketplace&utm
|
||||
category: Identity
|
||||
description: Load users and groups from Okta into the Backstage catalog.
|
||||
documentation: https://github.com/RoadieHQ/roadie-backstage-plugins/tree/main/plugins/backend/catalog-backend-module-okta
|
||||
iconUrl: https://roadie.io/images/logos/github.png
|
||||
iconUrl: https://roadie.io/images/logos/okta.png
|
||||
npmPackageName: '@roadiehq/catalog-backend-module-okta'
|
||||
|
||||
@@ -7,6 +7,7 @@ import { ApiRef } from '@backstage/core-plugin-api';
|
||||
import { AsyncState } from 'react-use/lib/useAsync';
|
||||
import { ComponentType } from 'react';
|
||||
import { CompoundEntityRef } from '@backstage/catalog-model';
|
||||
import { Config } from '@backstage/config';
|
||||
import { Dispatch } from 'react';
|
||||
import { Entity } from '@backstage/catalog-model';
|
||||
import { Extension } from '@backstage/core-plugin-api';
|
||||
@@ -152,6 +153,12 @@ export interface TechDocsStorageApi {
|
||||
// @public
|
||||
export const techdocsStorageApiRef: ApiRef<TechDocsStorageApi>;
|
||||
|
||||
// @public
|
||||
export function toLowercaseEntityRefMaybe(
|
||||
entityRef: CompoundEntityRef,
|
||||
config: Config,
|
||||
): CompoundEntityRef;
|
||||
|
||||
// @public
|
||||
export const useShadowDomStylesLoading: (element: Element | null) => boolean;
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@backstage/catalog-model": "^1.1.0",
|
||||
"@backstage/config": "^1.0.1",
|
||||
"@backstage/core-components": "^0.10.1-next.0",
|
||||
"@backstage/core-plugin-api": "^1.0.5-next.0",
|
||||
"@backstage/version-bridge": "^1.0.1",
|
||||
|
||||
@@ -21,6 +21,7 @@ import { ThemeProvider } from '@material-ui/core';
|
||||
import { lightTheme } from '@backstage/theme';
|
||||
import { TestApiProvider } from '@backstage/test-utils';
|
||||
import { Entity, CompoundEntityRef } from '@backstage/catalog-model';
|
||||
import { configApiRef } from '@backstage/core-plugin-api';
|
||||
|
||||
import { techdocsApiRef } from './api';
|
||||
import { useTechDocsReaderPage, TechDocsReaderPageProvider } from './context';
|
||||
@@ -55,6 +56,10 @@ const techdocsApiMock = {
|
||||
getTechDocsMetadata: jest.fn().mockResolvedValue(mockTechDocsMetadata),
|
||||
};
|
||||
|
||||
const configApiMock = {
|
||||
getOptionalBoolean: jest.fn().mockReturnValue(undefined),
|
||||
};
|
||||
|
||||
const wrapper = ({
|
||||
entityRef = {
|
||||
kind: mockEntityMetadata.kind,
|
||||
@@ -67,7 +72,12 @@ const wrapper = ({
|
||||
children: React.ReactNode;
|
||||
}) => (
|
||||
<ThemeProvider theme={lightTheme}>
|
||||
<TestApiProvider apis={[[techdocsApiRef, techdocsApiMock]]}>
|
||||
<TestApiProvider
|
||||
apis={[
|
||||
[configApiRef, configApiMock],
|
||||
[techdocsApiRef, techdocsApiMock],
|
||||
]}
|
||||
>
|
||||
<TechDocsReaderPageProvider entityRef={entityRef}>
|
||||
{children}
|
||||
</TechDocsReaderPageProvider>
|
||||
@@ -123,4 +133,28 @@ describe('useTechDocsReaderPage', () => {
|
||||
'<h1>Shadow DOM Mock</h1>',
|
||||
);
|
||||
});
|
||||
|
||||
it('should set entityRef as lowercase when legacyUseCaseSensitiveTripletPaths is false', async () => {
|
||||
const lowercaseEntityRef = {
|
||||
kind: mockEntityMetadata.kind.toLocaleLowerCase(),
|
||||
name: mockEntityMetadata.metadata.name.toLocaleLowerCase(),
|
||||
namespace: mockEntityMetadata.metadata.namespace?.toLocaleLowerCase(),
|
||||
};
|
||||
const { result } = renderHook(() => useTechDocsReaderPage(), { wrapper });
|
||||
|
||||
expect(result.current.entityRef).toStrictEqual(lowercaseEntityRef);
|
||||
});
|
||||
|
||||
it('entityRef is not modified when legacyUseCaseSensitiveTripletPaths is true', async () => {
|
||||
configApiMock.getOptionalBoolean.mockReturnValueOnce(true);
|
||||
const caseSensitiveEntityRef = {
|
||||
kind: mockEntityMetadata.kind,
|
||||
name: mockEntityMetadata.metadata.name,
|
||||
namespace: mockEntityMetadata.metadata.namespace!!,
|
||||
};
|
||||
|
||||
const { result } = renderHook(() => useTechDocsReaderPage(), { wrapper });
|
||||
|
||||
expect(result.current.entityRef).toStrictEqual(caseSensitiveEntityRef);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -33,11 +33,13 @@ import {
|
||||
createVersionedValueMap,
|
||||
} from '@backstage/version-bridge';
|
||||
|
||||
import { useApi } from '@backstage/core-plugin-api';
|
||||
import { configApiRef, useApi } from '@backstage/core-plugin-api';
|
||||
|
||||
import { techdocsApiRef } from './api';
|
||||
import { TechDocsEntityMetadata, TechDocsMetadata } from './types';
|
||||
|
||||
import { toLowercaseEntityRefMaybe } from './helpers';
|
||||
|
||||
const areEntityRefsEqual = (
|
||||
prevEntityRef: CompoundEntityRef,
|
||||
nextEntityRef: CompoundEntityRef,
|
||||
@@ -107,6 +109,7 @@ export type TechDocsReaderPageProviderProps = {
|
||||
export const TechDocsReaderPageProvider = memo(
|
||||
({ entityRef, children }: TechDocsReaderPageProviderProps) => {
|
||||
const techdocsApi = useApi(techdocsApiRef);
|
||||
const config = useApi(configApiRef);
|
||||
|
||||
const metadata = useAsync(async () => {
|
||||
return techdocsApi.getTechDocsMetadata(entityRef);
|
||||
@@ -126,7 +129,7 @@ export const TechDocsReaderPageProvider = memo(
|
||||
|
||||
const value = {
|
||||
metadata,
|
||||
entityRef,
|
||||
entityRef: toLowercaseEntityRefMaybe(entityRef, config),
|
||||
entityMetadata,
|
||||
shadowRoot,
|
||||
setShadowRoot,
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright 2022 The Backstage Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { Config } from '@backstage/config';
|
||||
import { CompoundEntityRef } from '@backstage/catalog-model';
|
||||
|
||||
/**
|
||||
* Lower-case entity triplets by default, but allow override.
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
export function toLowercaseEntityRefMaybe(
|
||||
entityRef: CompoundEntityRef,
|
||||
config: Config,
|
||||
): CompoundEntityRef {
|
||||
if (config.getOptionalBoolean('techdocs.legacyUseCaseSensitiveTripletPaths'))
|
||||
return entityRef;
|
||||
|
||||
entityRef.kind = entityRef.kind.toLocaleLowerCase();
|
||||
entityRef.name = entityRef.name.toLocaleLowerCase();
|
||||
entityRef.namespace = entityRef.namespace.toLocaleLowerCase();
|
||||
|
||||
return entityRef;
|
||||
}
|
||||
@@ -51,3 +51,4 @@ export {
|
||||
useShadowRootElements,
|
||||
useShadowRootSelection,
|
||||
} from './hooks';
|
||||
export { toLowercaseEntityRefMaybe } from './helpers';
|
||||
|
||||
@@ -22,6 +22,7 @@ import { ThemeProvider } from '@material-ui/core';
|
||||
import { lightTheme } from '@backstage/theme';
|
||||
import { TestApiProvider } from '@backstage/test-utils';
|
||||
import { Entity, CompoundEntityRef } from '@backstage/catalog-model';
|
||||
import { configApiRef } from '@backstage/core-plugin-api';
|
||||
import {
|
||||
techdocsApiRef,
|
||||
TechDocsMetadata,
|
||||
@@ -52,6 +53,10 @@ const techdocsApiMock = {
|
||||
getTechDocsMetadata: jest.fn().mockResolvedValue(mockTechDocsMetadata),
|
||||
};
|
||||
|
||||
const configApiMock = {
|
||||
getOptionalBoolean: jest.fn().mockReturnValue(undefined),
|
||||
};
|
||||
|
||||
const wrapper = ({
|
||||
entityRef = {
|
||||
kind: mockEntityMetadata.kind,
|
||||
@@ -64,7 +69,12 @@ const wrapper = ({
|
||||
children: React.ReactNode;
|
||||
}) => (
|
||||
<ThemeProvider theme={lightTheme}>
|
||||
<TestApiProvider apis={[[techdocsApiRef, techdocsApiMock]]}>
|
||||
<TestApiProvider
|
||||
apis={[
|
||||
[techdocsApiRef, techdocsApiMock],
|
||||
[configApiRef, configApiMock],
|
||||
]}
|
||||
>
|
||||
<TechDocsReaderPageProvider entityRef={entityRef}>
|
||||
{children}
|
||||
</TechDocsReaderPageProvider>
|
||||
|
||||
Reference in New Issue
Block a user