diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json
index aaef0ab951..2f6d3cf65c 100644
--- a/plugins/catalog/package.json
+++ b/plugins/catalog/package.json
@@ -90,6 +90,7 @@
"@backstage/cli": "workspace:^",
"@backstage/core-app-api": "workspace:^",
"@backstage/dev-utils": "workspace:^",
+ "@backstage/frontend-test-utils": "workspace:^",
"@backstage/plugin-permission-common": "workspace:^",
"@backstage/test-utils": "workspace:^",
"@testing-library/dom": "^10.0.0",
diff --git a/plugins/catalog/src/alpha/blueprints/CatalogFilterBlueprint.test.tsx b/plugins/catalog/src/alpha/blueprints/CatalogFilterBlueprint.test.tsx
new file mode 100644
index 0000000000..de8d037adc
--- /dev/null
+++ b/plugins/catalog/src/alpha/blueprints/CatalogFilterBlueprint.test.tsx
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2024 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 React from 'react';
+import { CatalogFilterBlueprint } from './CatalogFilterBlueprint';
+import {
+ coreExtensionData,
+ createExtension,
+ createExtensionInput,
+} from '@backstage/frontend-plugin-api';
+import { createExtensionTester } from '@backstage/frontend-test-utils';
+import { waitFor, screen } from '@testing-library/react';
+
+describe('CatalogFilterBlueprint', () => {
+ it('should create an extension with sane defaults', () => {
+ const extension = CatalogFilterBlueprint.make({
+ params: {
+ loader: async () =>
,
+ },
+ });
+ expect(extension).toMatchInlineSnapshot(`
+ {
+ "$$type": "@backstage/ExtensionDefinition",
+ "attachTo": {
+ "id": "page:catalog",
+ "input": "filters",
+ },
+ "configSchema": undefined,
+ "disabled": false,
+ "factory": [Function],
+ "inputs": {},
+ "kind": "catalog-filter",
+ "name": undefined,
+ "namespace": undefined,
+ "output": [
+ [Function],
+ ],
+ "override": [Function],
+ "toString": [Function],
+ "version": "v2",
+ }
+ `);
+ });
+
+ it('should allow overrding of inputs and config', async () => {
+ const extension = CatalogFilterBlueprint.makeWithOverrides({
+ name: 'test-name',
+ inputs: {
+ mock: createExtensionInput([coreExtensionData.reactElement]),
+ },
+ config: {
+ schema: {
+ test: z => z.string(),
+ },
+ },
+ factory(originalFactory, { config, inputs }) {
+ return originalFactory({
+ loader: async () => (
+
+ config: {config.test}
+
+ {inputs.mock.map(i => i.get(coreExtensionData.reactElement))}
+
+
+ ),
+ });
+ },
+ });
+
+ const mockExtension = createExtension({
+ attachTo: { id: 'catalog-filter:test-name', input: 'mock' },
+ output: [coreExtensionData.reactElement],
+ factory() {
+ return [coreExtensionData.reactElement(im a mock
)];
+ },
+ });
+
+ createExtensionTester(extension, { config: { test: 'mock test config' } })
+ .add(mockExtension)
+ .render();
+
+ await waitFor(() => {
+ expect(screen.getByTestId('test')).toBeInTheDocument();
+ expect(screen.getByTestId('test')).toHaveTextContent(
+ 'config: mock test config',
+ );
+ expect(screen.getByTestId('contents')).toHaveTextContent('im a mock');
+ });
+ });
+});
diff --git a/plugins/catalog/src/alpha/blueprints/CatalogFilterBlueprint.tsx b/plugins/catalog/src/alpha/blueprints/CatalogFilterBlueprint.tsx
new file mode 100644
index 0000000000..e8d6df55d2
--- /dev/null
+++ b/plugins/catalog/src/alpha/blueprints/CatalogFilterBlueprint.tsx
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2024 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 React, { lazy } from 'react';
+import {
+ ExtensionBoundary,
+ coreExtensionData,
+ createExtensionBlueprint,
+} from '@backstage/frontend-plugin-api';
+
+/**
+ * Creates Catalog Filter Extensions
+ * @alpha
+ */
+export const CatalogFilterBlueprint = createExtensionBlueprint({
+ kind: 'catalog-filter',
+ attachTo: { id: 'page:catalog', input: 'filters' },
+ output: [coreExtensionData.reactElement],
+ factory(params: { loader: () => Promise }, { node }) {
+ const ExtensionComponent = lazy(() =>
+ params.loader().then(element => ({ default: () => element })),
+ );
+ return [
+ coreExtensionData.reactElement(
+
+
+ ,
+ ),
+ ];
+ },
+});
diff --git a/plugins/catalog/src/alpha.ts b/plugins/catalog/src/alpha/blueprints/index.ts
similarity index 73%
rename from plugins/catalog/src/alpha.ts
rename to plugins/catalog/src/alpha/blueprints/index.ts
index b78a5e6225..a3a7bcb33f 100644
--- a/plugins/catalog/src/alpha.ts
+++ b/plugins/catalog/src/alpha/blueprints/index.ts
@@ -1,5 +1,5 @@
/*
- * Copyright 2023 The Backstage Authors
+ * Copyright 2024 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.
@@ -13,8 +13,4 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-export * from './alpha/index';
-export { default } from './alpha/index';
-export { catalogTranslationRef } from './translation';
-export * from './translation';
+export { CatalogFilterBlueprint } from './CatalogFilterBlueprint';
diff --git a/plugins/catalog/src/alpha/createCatalogFilterExtension.tsx b/plugins/catalog/src/alpha/createCatalogFilterExtension.tsx
index d8a218f8f3..eb6d58f424 100644
--- a/plugins/catalog/src/alpha/createCatalogFilterExtension.tsx
+++ b/plugins/catalog/src/alpha/createCatalogFilterExtension.tsx
@@ -23,7 +23,10 @@ import {
createExtension,
} from '@backstage/frontend-plugin-api';
-/** @alpha */
+/**
+ * @alpha
+ * @deprecated Use {@link CatalogFilterExtensionBlueprint} instead
+ */
export function createCatalogFilterExtension<
TInputs extends AnyExtensionInputMap,
TConfig,
diff --git a/plugins/catalog/src/alpha/entityCards.tsx b/plugins/catalog/src/alpha/entityCards.tsx
index 8a18efabde..5f8ee16f87 100644
--- a/plugins/catalog/src/alpha/entityCards.tsx
+++ b/plugins/catalog/src/alpha/entityCards.tsx
@@ -15,96 +15,116 @@
*/
import React from 'react';
-import { createEntityCardExtension } from '@backstage/plugin-catalog-react/alpha';
+import { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';
import { compatWrapper } from '@backstage/core-compat-api';
-export const catalogAboutEntityCard = createEntityCardExtension({
+export const catalogAboutEntityCard = EntityCardBlueprint.make({
name: 'about',
- loader: async () =>
- import('../components/AboutCard').then(m =>
- compatWrapper(),
- ),
+ params: {
+ loader: async () =>
+ import('../components/AboutCard').then(m =>
+ compatWrapper(),
+ ),
+ },
});
-export const catalogLinksEntityCard = createEntityCardExtension({
+export const catalogLinksEntityCard = EntityCardBlueprint.make({
name: 'links',
- filter: 'has:links',
- loader: async () =>
- import('../components/EntityLinksCard').then(m =>
- compatWrapper(),
- ),
+ params: {
+ filter: 'has:links',
+ loader: async () =>
+ import('../components/EntityLinksCard').then(m =>
+ compatWrapper(),
+ ),
+ },
});
-export const catalogLabelsEntityCard = createEntityCardExtension({
+export const catalogLabelsEntityCard = EntityCardBlueprint.make({
name: 'labels',
- filter: 'has:labels',
- loader: async () =>
- import('../components/EntityLabelsCard').then(m =>
- compatWrapper(),
- ),
+ params: {
+ filter: 'has:labels',
+ loader: async () =>
+ import('../components/EntityLabelsCard').then(m =>
+ compatWrapper(),
+ ),
+ },
});
-export const catalogDependsOnComponentsEntityCard = createEntityCardExtension({
+export const catalogDependsOnComponentsEntityCard = EntityCardBlueprint.make({
name: 'depends-on-components',
- filter: 'kind:component',
- loader: async () =>
- import('../components/DependsOnComponentsCard').then(m =>
- compatWrapper(),
- ),
+ params: {
+ filter: 'kind:component',
+ loader: async () =>
+ import('../components/DependsOnComponentsCard').then(m =>
+ compatWrapper(),
+ ),
+ },
});
-export const catalogDependsOnResourcesEntityCard = createEntityCardExtension({
+export const catalogDependsOnResourcesEntityCard = EntityCardBlueprint.make({
name: 'depends-on-resources',
- filter: 'kind:component',
- loader: async () =>
- import('../components/DependsOnResourcesCard').then(m =>
- compatWrapper(),
- ),
+ params: {
+ filter: 'kind:component',
+ loader: async () =>
+ import('../components/DependsOnResourcesCard').then(m =>
+ compatWrapper(),
+ ),
+ },
});
-export const catalogHasComponentsEntityCard = createEntityCardExtension({
+export const catalogHasComponentsEntityCard = EntityCardBlueprint.make({
name: 'has-components',
- filter: 'kind:system',
- loader: async () =>
- import('../components/HasComponentsCard').then(m =>
- compatWrapper(),
- ),
+ params: {
+ filter: 'kind:system',
+ loader: async () =>
+ import('../components/HasComponentsCard').then(m =>
+ compatWrapper(),
+ ),
+ },
});
-export const catalogHasResourcesEntityCard = createEntityCardExtension({
+export const catalogHasResourcesEntityCard = EntityCardBlueprint.make({
name: 'has-resources',
- filter: 'kind:system',
- loader: async () =>
- import('../components/HasResourcesCard').then(m =>
- compatWrapper(),
- ),
+ params: {
+ filter: 'kind:system',
+ loader: async () =>
+ import('../components/HasResourcesCard').then(m =>
+ compatWrapper(),
+ ),
+ },
});
-export const catalogHasSubcomponentsEntityCard = createEntityCardExtension({
+export const catalogHasSubcomponentsEntityCard = EntityCardBlueprint.make({
name: 'has-subcomponents',
- filter: 'kind:component',
- loader: async () =>
- import('../components/HasSubcomponentsCard').then(m =>
- compatWrapper(),
- ),
+ params: {
+ filter: 'kind:component',
+ loader: async () =>
+ import('../components/HasSubcomponentsCard').then(m =>
+ compatWrapper(),
+ ),
+ },
});
-export const catalogHasSubdomainsEntityCard = createEntityCardExtension({
+export const catalogHasSubdomainsEntityCard = EntityCardBlueprint.make({
name: 'has-subdomains',
- filter: 'kind:domain',
- loader: async () =>
- import('../components/HasSubdomainsCard').then(m =>
- compatWrapper(),
- ),
+ params: {
+ filter: 'kind:domain',
+ loader: async () =>
+ import('../components/HasSubdomainsCard').then(m =>
+ compatWrapper(),
+ ),
+ },
});
-export const catalogHasSystemsEntityCard = createEntityCardExtension({
+export const catalogHasSystemsEntityCard = EntityCardBlueprint.make({
name: 'has-systems',
- filter: 'kind:domain',
- loader: async () =>
- import('../components/HasSystemsCard').then(m =>
- compatWrapper(),
- ),
+ params: {
+ filter: 'kind:domain',
+ loader: async () =>
+ import('../components/HasSystemsCard').then(m =>
+ compatWrapper(),
+ ),
+ },
});
export default [
diff --git a/plugins/catalog/src/alpha/entityContents.tsx b/plugins/catalog/src/alpha/entityContents.tsx
index 75c3fef49f..259b92492c 100644
--- a/plugins/catalog/src/alpha/entityContents.tsx
+++ b/plugins/catalog/src/alpha/entityContents.tsx
@@ -19,27 +19,38 @@ import {
coreExtensionData,
createExtensionInput,
} from '@backstage/frontend-plugin-api';
-import {
- createEntityContentExtension,
- catalogExtensionData,
-} from '@backstage/plugin-catalog-react/alpha';
+import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
-export const catalogOverviewEntityContent = createEntityContentExtension({
- name: 'overview',
- defaultPath: '/',
- defaultTitle: 'Overview',
- disabled: false,
- inputs: {
- cards: createExtensionInput({
- element: coreExtensionData.reactElement,
- filterFunction: catalogExtensionData.entityFilterFunction.optional(),
- filterExpression: catalogExtensionData.entityFilterExpression.optional(),
- }),
- },
- loader: async ({ inputs }) =>
- import('./EntityOverviewPage').then(m => (
- c.output)} />
- )),
-});
+export const catalogOverviewEntityContent =
+ EntityContentBlueprint.makeWithOverrides({
+ name: 'overview',
+ inputs: {
+ cards: createExtensionInput([
+ coreExtensionData.reactElement,
+ EntityContentBlueprint.dataRefs.filterFunction.optional(),
+ EntityContentBlueprint.dataRefs.filterExpression.optional(),
+ ]),
+ },
+ factory: (originalFactory, { inputs }) => {
+ return originalFactory({
+ defaultPath: '/',
+ defaultTitle: 'Overview',
+ loader: async () =>
+ import('./EntityOverviewPage').then(m => (
+ ({
+ element: c.get(coreExtensionData.reactElement),
+ filterFunction: c.get(
+ EntityContentBlueprint.dataRefs.filterFunction,
+ ),
+ filterExpression: c.get(
+ EntityContentBlueprint.dataRefs.filterExpression,
+ ),
+ }))}
+ />
+ )),
+ });
+ },
+ });
export default [catalogOverviewEntityContent];
diff --git a/plugins/catalog/src/alpha/index.ts b/plugins/catalog/src/alpha/index.ts
index 06a78ec6ea..f004c4f19e 100644
--- a/plugins/catalog/src/alpha/index.ts
+++ b/plugins/catalog/src/alpha/index.ts
@@ -16,3 +16,6 @@
export { default } from './plugin';
export { createCatalogFilterExtension } from './createCatalogFilterExtension';
+
+export * from './blueprints';
+export * from './translation';
diff --git a/plugins/catalog/src/translation.ts b/plugins/catalog/src/alpha/translation.ts
similarity index 100%
rename from plugins/catalog/src/translation.ts
rename to plugins/catalog/src/alpha/translation.ts
diff --git a/plugins/catalog/src/components/AboutCard/AboutCard.tsx b/plugins/catalog/src/components/AboutCard/AboutCard.tsx
index ff5d7fc801..cf4a3c2d43 100644
--- a/plugins/catalog/src/components/AboutCard/AboutCard.tsx
+++ b/plugins/catalog/src/components/AboutCard/AboutCard.tsx
@@ -64,7 +64,7 @@ import { catalogEntityRefreshPermission } from '@backstage/plugin-catalog-common
import { useSourceTemplateCompoundEntityRef } from './hooks';
import { taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';
import { usePermission } from '@backstage/plugin-permission-react';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
const TECHDOCS_ANNOTATION = 'backstage.io/techdocs-ref';
diff --git a/plugins/catalog/src/components/AboutCard/AboutContent.tsx b/plugins/catalog/src/components/AboutCard/AboutContent.tsx
index 3f781f4759..f6d2d80264 100644
--- a/plugins/catalog/src/components/AboutCard/AboutContent.tsx
+++ b/plugins/catalog/src/components/AboutCard/AboutContent.tsx
@@ -33,7 +33,7 @@ import React from 'react';
import { AboutField } from './AboutField';
import { LinksGridList } from '../EntityLinksCard/LinksGridList';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
const useStyles = makeStyles({
description: {
diff --git a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.tsx
index db765b9145..a46a552b8d 100644
--- a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.tsx
+++ b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.tsx
@@ -33,7 +33,7 @@ import {
import React, { ReactNode } from 'react';
import { createComponentRouteRef } from '../../routes';
import { CatalogTable, CatalogTableRow } from '../CatalogTable';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
import { CatalogTableColumnsFunc } from '../CatalogTable/types';
diff --git a/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx b/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx
index 1a596f8b9b..f4501bd795 100644
--- a/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx
+++ b/plugins/catalog/src/components/CatalogSearchResultListItem/CatalogSearchResultListItem.tsx
@@ -27,7 +27,7 @@ import {
ResultHighlight,
} from '@backstage/plugin-search-common';
import { HighlightedSearchResultText } from '@backstage/plugin-search-react';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/frontend-plugin-api';
const useStyles = makeStyles(
diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
index e18467249a..1026dc5d26 100644
--- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
@@ -49,7 +49,7 @@ import { CatalogTableColumnsFunc, CatalogTableRow } from './types';
import { PaginatedCatalogTable } from './PaginatedCatalogTable';
import { defaultCatalogTableColumnsFunc } from './defaultCatalogTableColumnsFunc';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
/**
* Props for {@link CatalogTable}.
diff --git a/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.tsx b/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.tsx
index 2f0557d11e..6c6f811cc1 100644
--- a/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.tsx
+++ b/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.tsx
@@ -30,7 +30,7 @@ import {
componentEntityHelpLink,
RelatedEntitiesCard,
} from '../RelatedEntitiesCard';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.tsx b/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.tsx
index fe56ea582b..eafa33346d 100644
--- a/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.tsx
+++ b/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.tsx
@@ -27,7 +27,7 @@ import {
componentEntityHelpLink,
RelatedEntitiesCard,
} from '../RelatedEntitiesCard';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.tsx b/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.tsx
index 281bfd8766..723b87cc29 100644
--- a/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.tsx
+++ b/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.tsx
@@ -27,7 +27,7 @@ import {
RelatedEntitiesCard,
resourceEntityColumns,
} from '../RelatedEntitiesCard';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx
index 5b740038a1..77f934e7de 100644
--- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx
+++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx
@@ -33,7 +33,7 @@ import { catalogEntityDeletePermission } from '@backstage/plugin-catalog-common/
import { UnregisterEntity, UnregisterEntityOptions } from './UnregisterEntity';
import { useApi, alertApiRef } from '@backstage/core-plugin-api';
import useCopyToClipboard from 'react-use/esm/useCopyToClipboard';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/EntityContextMenu/UnregisterEntity.tsx b/plugins/catalog/src/components/EntityContextMenu/UnregisterEntity.tsx
index 08496d4819..63247d0c62 100644
--- a/plugins/catalog/src/components/EntityContextMenu/UnregisterEntity.tsx
+++ b/plugins/catalog/src/components/EntityContextMenu/UnregisterEntity.tsx
@@ -19,7 +19,7 @@ import ListItemIcon from '@material-ui/core/ListItemIcon';
import ListItemText from '@material-ui/core/ListItemText';
import MenuItem from '@material-ui/core/MenuItem';
import CancelIcon from '@material-ui/icons/Cancel';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
type VisibleType = 'visible' | 'hidden' | 'disable';
diff --git a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx
index d48b45f054..c4557b6774 100644
--- a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx
+++ b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx
@@ -25,7 +25,7 @@ import {
import { EntityLabelsEmptyState } from './EntityLabelsEmptyState';
import Typography from '@material-ui/core/Typography';
import { makeStyles } from '@material-ui/core/styles';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx
index 16d0a3a897..d78be2d2ce 100644
--- a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx
+++ b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx
@@ -19,7 +19,7 @@ import Typography from '@material-ui/core/Typography';
import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
import { CodeSnippet } from '@backstage/core-components';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
const ENTITY_YAML = `metadata:
diff --git a/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx b/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx
index bbc7792acb..e8b957497d 100644
--- a/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx
+++ b/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx
@@ -53,7 +53,7 @@ import React, { useEffect, useState } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import { EntityContextMenu } from '../EntityContextMenu/EntityContextMenu';
import { rootRouteRef, unregisterRedirectRouteRef } from '../../routes';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/EntityLinksCard/EntityLinksCard.tsx b/plugins/catalog/src/components/EntityLinksCard/EntityLinksCard.tsx
index b5d8269a0b..59e1f6d252 100644
--- a/plugins/catalog/src/components/EntityLinksCard/EntityLinksCard.tsx
+++ b/plugins/catalog/src/components/EntityLinksCard/EntityLinksCard.tsx
@@ -23,7 +23,7 @@ import { ColumnBreakpoints } from './types';
import { IconComponent, useApp } from '@backstage/core-plugin-api';
import { InfoCard, InfoCardVariants } from '@backstage/core-components';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
/** @public */
export interface EntityLinksCardProps {
diff --git a/plugins/catalog/src/components/EntityLinksCard/EntityLinksEmptyState.tsx b/plugins/catalog/src/components/EntityLinksCard/EntityLinksEmptyState.tsx
index 09362385f9..513183677d 100644
--- a/plugins/catalog/src/components/EntityLinksCard/EntityLinksEmptyState.tsx
+++ b/plugins/catalog/src/components/EntityLinksCard/EntityLinksEmptyState.tsx
@@ -20,7 +20,7 @@ import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
import { CodeSnippet } from '@backstage/core-components';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
const ENTITY_YAML = `metadata:
name: example
diff --git a/plugins/catalog/src/components/EntityNotFound/EntityNotFound.tsx b/plugins/catalog/src/components/EntityNotFound/EntityNotFound.tsx
index 252005dff5..a033199ffd 100644
--- a/plugins/catalog/src/components/EntityNotFound/EntityNotFound.tsx
+++ b/plugins/catalog/src/components/EntityNotFound/EntityNotFound.tsx
@@ -20,7 +20,7 @@ import Button from '@material-ui/core/Button';
import Typography from '@material-ui/core/Typography';
import { makeStyles } from '@material-ui/core/styles';
import { Illo } from './Illo';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
const useStyles = makeStyles(theme => ({
diff --git a/plugins/catalog/src/components/EntityOrphanWarning/DeleteEntityDialog.tsx b/plugins/catalog/src/components/EntityOrphanWarning/DeleteEntityDialog.tsx
index c9c24a14a1..b1a7afbb50 100644
--- a/plugins/catalog/src/components/EntityOrphanWarning/DeleteEntityDialog.tsx
+++ b/plugins/catalog/src/components/EntityOrphanWarning/DeleteEntityDialog.tsx
@@ -23,7 +23,7 @@ import DialogTitle from '@material-ui/core/DialogTitle';
import React, { useState } from 'react';
import { alertApiRef, useApi } from '@backstage/core-plugin-api';
import { assertError } from '@backstage/errors';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
interface DeleteEntityDialogProps {
diff --git a/plugins/catalog/src/components/EntityOrphanWarning/EntityOrphanWarning.tsx b/plugins/catalog/src/components/EntityOrphanWarning/EntityOrphanWarning.tsx
index 10a10e54fd..eb561f9c19 100644
--- a/plugins/catalog/src/components/EntityOrphanWarning/EntityOrphanWarning.tsx
+++ b/plugins/catalog/src/components/EntityOrphanWarning/EntityOrphanWarning.tsx
@@ -22,7 +22,7 @@ import { useNavigate } from 'react-router-dom';
import { DeleteEntityDialog } from './DeleteEntityDialog';
import { useRouteRef } from '@backstage/core-plugin-api';
import { rootRouteRef } from '../../routes';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/**
diff --git a/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.tsx b/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.tsx
index bd49785abe..3c7c5bb2e3 100644
--- a/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.tsx
+++ b/plugins/catalog/src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.tsx
@@ -31,7 +31,7 @@ import {
import { useApi, ApiHolder } from '@backstage/core-plugin-api';
import useAsync from 'react-use/esm/useAsync';
import { SerializedError } from '@backstage/errors';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
const errorFilter = (i: EntityStatusItem) =>
diff --git a/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.tsx b/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.tsx
index 2ce9120bf0..ed816bfc75 100644
--- a/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.tsx
+++ b/plugins/catalog/src/components/EntityRelationWarning/EntityRelationWarning.tsx
@@ -26,7 +26,7 @@ import useAsync from 'react-use/esm/useAsync';
import Box from '@material-ui/core/Box';
import { ResponseErrorPanel } from '@backstage/core-components';
import { useApi, ApiHolder } from '@backstage/core-plugin-api';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
async function getRelationWarnings(entity: Entity, catalogApi: CatalogApi) {
diff --git a/plugins/catalog/src/components/HasComponentsCard/HasComponentsCard.tsx b/plugins/catalog/src/components/HasComponentsCard/HasComponentsCard.tsx
index 13a9e75928..2fc6cde81b 100644
--- a/plugins/catalog/src/components/HasComponentsCard/HasComponentsCard.tsx
+++ b/plugins/catalog/src/components/HasComponentsCard/HasComponentsCard.tsx
@@ -27,7 +27,7 @@ import {
componentEntityHelpLink,
RelatedEntitiesCard,
} from '../RelatedEntitiesCard';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.tsx b/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.tsx
index b99bca1716..6b90ce0443 100644
--- a/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.tsx
+++ b/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.tsx
@@ -27,7 +27,7 @@ import {
resourceEntityColumns,
resourceEntityHelpLink,
} from '../RelatedEntitiesCard';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.tsx b/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.tsx
index ceea839ef4..ceab037a45 100644
--- a/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.tsx
+++ b/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.tsx
@@ -26,7 +26,7 @@ import {
componentEntityColumns,
RelatedEntitiesCard,
} from '../RelatedEntitiesCard';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx b/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx
index 811f74d820..71705ea90f 100644
--- a/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx
+++ b/plugins/catalog/src/components/HasSubdomainsCard/HasSubdomainsCard.tsx
@@ -22,7 +22,7 @@ import {
componentEntityColumns,
RelatedEntitiesCard,
} from '../RelatedEntitiesCard';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.tsx b/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.tsx
index 15b4f933ba..48742f9d28 100644
--- a/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.tsx
+++ b/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.tsx
@@ -27,7 +27,7 @@ import {
systemEntityColumns,
systemEntityHelpLink,
} from '../RelatedEntitiesCard';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx b/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx
index e6e375646d..a2814527cc 100644
--- a/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx
+++ b/plugins/catalog/src/components/RelatedEntitiesCard/RelatedEntitiesCard.tsx
@@ -42,7 +42,7 @@ import {
systemEntityColumns,
systemEntityHelpLink,
} from './presets';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */
diff --git a/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.tsx b/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.tsx
index 5e485d672b..879a5076b1 100644
--- a/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.tsx
+++ b/plugins/catalog/src/components/SystemDiagramCard/SystemDiagramCard.tsx
@@ -46,7 +46,7 @@ import {
} from '@backstage/core-components';
import { useApi, useRouteRef } from '@backstage/core-plugin-api';
-import { catalogTranslationRef } from '../../translation';
+import { catalogTranslationRef } from '../../alpha/translation';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
/** @public */