diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx
index 2ab447c68f..720075f7a7 100644
--- a/packages/app-next/src/App.tsx
+++ b/packages/app-next/src/App.tsx
@@ -16,7 +16,11 @@
import React from 'react';
import { createApp } from '@backstage/frontend-app-api';
-import { pagesPlugin } from './examples/pagesPlugin';
+import {
+ externalPageXRouteRef,
+ pageXRouteRef,
+ pagesPlugin,
+} from './examples/pagesPlugin';
import graphiqlPlugin from '@backstage/plugin-graphiql/alpha';
import techRadarPlugin from '@backstage/plugin-tech-radar/alpha';
import userSettingsPlugin from '@backstage/plugin-user-settings/alpha';
@@ -72,14 +76,9 @@ const app = createApp({
extensions: [entityPageExtension],
}),
],
- // bindRoutes({ bind }) {
- // bind(catalogPlugin.externalRoutes, {
- // createComponent: scaffolderPlugin.routes.root,
- // });
- // bind(scaffolderPlugin.externalRoutes, {
- // registerComponent: catalogImportPlugin.routes.importPage,
- // });
- // },
+ bindRoutes({ bind }) {
+ bind({ x: externalPageXRouteRef }, { x: pageXRouteRef });
+ },
});
// const legacyApp = createLegacyApp({ plugins: [legacyGraphiqlPlugin] });
diff --git a/packages/app-next/src/examples/pagesPlugin.tsx b/packages/app-next/src/examples/pagesPlugin.tsx
index 5ae1029769..815d4926e9 100644
--- a/packages/app-next/src/examples/pagesPlugin.tsx
+++ b/packages/app-next/src/examples/pagesPlugin.tsx
@@ -20,11 +20,17 @@ import {
createPageExtension,
createPlugin,
} from '@backstage/frontend-plugin-api';
-import { useRouteRef, createRouteRef } from '@backstage/core-plugin-api';
+import {
+ useRouteRef,
+ createRouteRef,
+ createExternalRouteRef,
+} from '@backstage/core-plugin-api';
import { Route, Routes } from 'react-router-dom';
const indexRouteRef = createRouteRef({ id: 'index' });
const page1RouteRef = createRouteRef({ id: 'page1' });
+export const externalPageXRouteRef = createExternalRouteRef({ id: 'pageX' });
+export const pageXRouteRef = createRouteRef({ id: 'pageX' });
// const page2RouteRef = createSubRouteRef({
// id: 'page2',
// parent: page1RouteRef,
@@ -67,6 +73,7 @@ const Page1 = createPageExtension({
loader: async () => {
const Component = () => {
const indexLink = useRouteRef(indexRouteRef);
+ const xLink = useRouteRef(externalPageXRouteRef);
// const page2Link = useRouteRef(page2RouteRef);
return (
@@ -75,6 +82,7 @@ const Page1 = createPageExtension({
Go back
Page 2
{/* Page 2 */}
+ Page X
Sub-page content:
@@ -92,6 +100,26 @@ const Page1 = createPageExtension({
},
});
+const ExternalPage = createPageExtension({
+ id: 'pageX',
+ defaultPath: '/pageX',
+ routeRef: pageXRouteRef,
+ loader: async () => {
+ const Component = () => {
+ const indexLink = useRouteRef(indexRouteRef);
+ // const pageXLink = useRouteRef(pageXRouteRef);
+
+ return (
+
+
This is page X
+ Go back
+
+ );
+ };
+ return
;
+ },
+});
+
export const pagesPlugin = createPlugin({
id: 'pages',
// routes: {
@@ -101,5 +129,5 @@ export const pagesPlugin = createPlugin({
// // OR
// // 'page1'
// },
- extensions: [IndexPage, Page1],
+ extensions: [IndexPage, Page1, ExternalPage],
});
diff --git a/packages/frontend-app-api/api-report.md b/packages/frontend-app-api/api-report.md
index a576d4cfe4..74c34be5f4 100644
--- a/packages/frontend-app-api/api-report.md
+++ b/packages/frontend-app-api/api-report.md
@@ -3,6 +3,7 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
+import { AppRouteBinder } from '@backstage/core-app-api';
import { BackstagePlugin } from '@backstage/frontend-plugin-api';
import { Config } from '@backstage/config';
import { ConfigApi } from '@backstage/core-plugin-api';
@@ -14,6 +15,7 @@ import { JSX as JSX_2 } from 'react';
export function createApp(options: {
features?: (BackstagePlugin | ExtensionOverrides)[];
configLoader?: () => Promise
;
+ bindRoutes?(context: { bind: AppRouteBinder }): void;
featureLoader?: (ctx: {
config: ConfigApi;
}) => Promise<(BackstagePlugin | ExtensionOverrides)[]>;
diff --git a/packages/frontend-app-api/src/wiring/createApp.tsx b/packages/frontend-app-api/src/wiring/createApp.tsx
index 044eedfefd..f262ecde72 100644
--- a/packages/frontend-app-api/src/wiring/createApp.tsx
+++ b/packages/frontend-app-api/src/wiring/createApp.tsx
@@ -57,6 +57,7 @@ import {
ApiFactoryRegistry,
ApiProvider,
ApiResolver,
+ AppRouteBinder,
AppThemeSelector,
} from '@backstage/core-app-api';
@@ -76,6 +77,8 @@ import { overrideBaseUrlConfigs } from '../../../core-app-api/src/app/overrideBa
// eslint-disable-next-line @backstage/no-relative-monorepo-imports
import { RoutingProvider } from '../../../core-app-api/src/routing/RoutingProvider';
// eslint-disable-next-line @backstage/no-relative-monorepo-imports
+import { resolveRouteBindings } from '../../../core-app-api/src/app/resolveRouteBindings';
+// eslint-disable-next-line @backstage/no-relative-monorepo-imports
import { AppLanguageSelector } from '../../../core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector';
// eslint-disable-next-line @backstage/no-relative-monorepo-imports
import { I18nextTranslationApi } from '../../../core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi';
@@ -269,6 +272,7 @@ export function createInstances(options: {
export function createApp(options: {
features?: (BackstagePlugin | ExtensionOverrides)[];
configLoader?: () => Promise;
+ bindRoutes?(context: { bind: AppRouteBinder }): void;
featureLoader?: (ctx: {
config: ConfigApi;
}) => Promise<(BackstagePlugin | ExtensionOverrides)[]>;
@@ -309,7 +313,7 @@ export function createApp(options: {
{/* TODO: set base path using the logic from AppRouter */}