diff --git a/.changeset/curly-crabs-compete.md b/.changeset/curly-crabs-compete.md
new file mode 100644
index 0000000000..552a41a9f1
--- /dev/null
+++ b/.changeset/curly-crabs-compete.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-circleci': patch
+---
+
+Migrated to new composability API, exporting the plugin instance as `circleCIPlugin`, the entity page content as `EntityCircleCIContent`, and entity conditional as `isCircleCIAvailable`.
diff --git a/plugins/circleci/dev/index.tsx b/plugins/circleci/dev/index.tsx
index 812a5585d4..19a32c0d04 100644
--- a/plugins/circleci/dev/index.tsx
+++ b/plugins/circleci/dev/index.tsx
@@ -15,6 +15,6 @@
*/
import { createDevApp } from '@backstage/dev-utils';
-import { plugin } from '../src/plugin';
+import { circleCIPlugin } from '../src/plugin';
-createDevApp().registerPlugin(plugin).render();
+createDevApp().registerPlugin(circleCIPlugin).render();
diff --git a/plugins/circleci/src/components/Router.tsx b/plugins/circleci/src/components/Router.tsx
index 5fe9a20eff..b3a0d2c3e2 100644
--- a/plugins/circleci/src/components/Router.tsx
+++ b/plugins/circleci/src/components/Router.tsx
@@ -21,15 +21,25 @@ import { BuildWithStepsPage } from './BuildWithStepsPage/';
import { BuildsPage } from './BuildsPage';
import { CIRCLECI_ANNOTATION } from '../constants';
import { Entity } from '@backstage/catalog-model';
+import { useEntity } from '@backstage/plugin-catalog-react';
import { MissingAnnotationEmptyState } from '@backstage/core';
export const isPluginApplicableToEntity = (entity: Entity) =>
Boolean(entity.metadata.annotations?.[CIRCLECI_ANNOTATION]);
-export const Router = ({ entity }: { entity: Entity }) =>
- !isPluginApplicableToEntity(entity) ? (
-
- ) : (
+type Props = {
+ /** @deprecated The entity is now grabbed from context instead */
+ entity?: Entity;
+};
+
+export const Router = (_props: Props) => {
+ const { entity } = useEntity();
+
+ if (!isPluginApplicableToEntity(entity)) {
+ return ;
+ }
+
+ return (
} />
/>
);
+};
diff --git a/plugins/circleci/src/index.ts b/plugins/circleci/src/index.ts
index c6cb140208..1e8b213279 100644
--- a/plugins/circleci/src/index.ts
+++ b/plugins/circleci/src/index.ts
@@ -14,8 +14,16 @@
* limitations under the License.
*/
-export { plugin } from './plugin';
+export {
+ circleCIPlugin,
+ circleCIPlugin as plugin,
+ EntityCircleCIContent,
+} from './plugin';
export * from './api';
export * from './route-refs';
-export { Router, isPluginApplicableToEntity } from './components/Router';
+export {
+ Router,
+ isPluginApplicableToEntity,
+ isPluginApplicableToEntity as isCircleCIAvailable,
+} from './components/Router';
export { CIRCLECI_ANNOTATION } from './constants';
diff --git a/plugins/circleci/src/plugin.test.ts b/plugins/circleci/src/plugin.test.ts
index 821a503257..bdd637027c 100644
--- a/plugins/circleci/src/plugin.test.ts
+++ b/plugins/circleci/src/plugin.test.ts
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-import { plugin } from './plugin';
+import { circleCIPlugin } from './plugin';
describe('circleci', () => {
it('should export plugin', () => {
- expect(plugin).toBeDefined();
+ expect(circleCIPlugin).toBeDefined();
});
});
diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts
index c5bb122ed3..4e0d485726 100644
--- a/plugins/circleci/src/plugin.ts
+++ b/plugins/circleci/src/plugin.ts
@@ -18,10 +18,12 @@ import {
createPlugin,
createApiFactory,
discoveryApiRef,
+ createRoutableExtension,
} from '@backstage/core';
import { circleCIApiRef, CircleCIApi } from './api';
+import { circleCIRouteRef } from './route-refs';
-export const plugin = createPlugin({
+export const circleCIPlugin = createPlugin({
id: 'circleci',
apis: [
createApiFactory({
@@ -31,3 +33,10 @@ export const plugin = createPlugin({
}),
],
});
+
+export const EntityCircleCIContent = circleCIPlugin.provide(
+ createRoutableExtension({
+ component: () => import('./components/Router').then(m => m.Router),
+ mountPoint: circleCIRouteRef,
+ }),
+);