diff --git a/sreez-showcase/packages/app/package.json b/sreez-showcase/packages/app/package.json
index 1bd0edf..806cffb 100644
--- a/sreez-showcase/packages/app/package.json
+++ b/sreez-showcase/packages/app/package.json
@@ -41,6 +41,7 @@
"@backstage/plugin-user-settings": "^0.8.5",
"@backstage/theme": "^0.5.3",
"@bestsellerit/backstage-plugin-harbor": "^0.3.1",
+ "@internal/backstage-plugin-devspaces-plugin": "^0.1.0",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@roadiehq/backstage-plugin-argo-cd": "^2.6.4",
diff --git a/sreez-showcase/packages/app/src/App.tsx b/sreez-showcase/packages/app/src/App.tsx
index 67eafaa..33aa790 100644
--- a/sreez-showcase/packages/app/src/App.tsx
+++ b/sreez-showcase/packages/app/src/App.tsx
@@ -39,6 +39,7 @@ import { RequirePermission } from '@backstage/plugin-permission-react';
import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha';
import { githubAuthApiRef } from '@backstage/core-plugin-api';
import { DevToolsPage } from '@backstage/plugin-devtools';
+import { DevspacesPluginPage } from '@internal/backstage-plugin-devspaces-plugin';
const app = createApp({
@@ -118,6 +119,7 @@ const routes = (
} />
} />
+ } />
);
diff --git a/sreez-showcase/packages/app/src/components/catalog/EntityPage.tsx b/sreez-showcase/packages/app/src/components/catalog/EntityPage.tsx
index bb6cf86..5bcea0f 100644
--- a/sreez-showcase/packages/app/src/components/catalog/EntityPage.tsx
+++ b/sreez-showcase/packages/app/src/components/catalog/EntityPage.tsx
@@ -71,7 +71,9 @@ import {
EntityGithubPullRequestsContent,
EntityGithubPullRequestsOverviewCard,
} from '@roadiehq/backstage-plugin-github-pull-requests';
-
+import {
+ DevspacesPluginPage,
+} from '@internal/backstage-plugin-devspaces-plugin'
const techdocsContent = (
@@ -160,6 +162,9 @@ const overviewContent = (
+
+
+
diff --git a/sreez-showcase/plugins/devspaces-plugin/.eslintrc.js b/sreez-showcase/plugins/devspaces-plugin/.eslintrc.js
new file mode 100644
index 0000000..e2a53a6
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/.eslintrc.js
@@ -0,0 +1 @@
+module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
diff --git a/sreez-showcase/plugins/devspaces-plugin/README.md b/sreez-showcase/plugins/devspaces-plugin/README.md
new file mode 100644
index 0000000..95bfad3
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/README.md
@@ -0,0 +1,13 @@
+# devspaces-plugin
+
+Welcome to the devspaces-plugin plugin!
+
+_This plugin was created through the Backstage CLI_
+
+## Getting started
+
+Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/devspaces-plugin](http://localhost:3000/devspaces-plugin).
+
+You can also serve the plugin in isolation by running `yarn start` in the plugin directory.
+This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads.
+It is only meant for local development, and the setup for it can be found inside the [/dev](./dev) directory.
diff --git a/sreez-showcase/plugins/devspaces-plugin/dev/index.tsx b/sreez-showcase/plugins/devspaces-plugin/dev/index.tsx
new file mode 100644
index 0000000..17b246c
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/dev/index.tsx
@@ -0,0 +1,12 @@
+import React from 'react';
+import { createDevApp } from '@backstage/dev-utils';
+import { devspacesPluginPlugin, DevspacesPluginPage } from '../src/plugin';
+
+createDevApp()
+ .registerPlugin(devspacesPluginPlugin)
+ .addPage({
+ element: ,
+ title: 'Root Page',
+ path: '/devspaces-plugin',
+ })
+ .render();
diff --git a/sreez-showcase/plugins/devspaces-plugin/package.json b/sreez-showcase/plugins/devspaces-plugin/package.json
new file mode 100644
index 0000000..5591754
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/package.json
@@ -0,0 +1,51 @@
+{
+ "name": "@internal/backstage-plugin-devspaces-plugin",
+ "version": "0.1.0",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+ "private": true,
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.esm.js",
+ "types": "dist/index.d.ts"
+ },
+ "backstage": {
+ "role": "frontend-plugin"
+ },
+ "sideEffects": false,
+ "scripts": {
+ "start": "backstage-cli package start",
+ "build": "backstage-cli package build",
+ "lint": "backstage-cli package lint",
+ "test": "backstage-cli package test",
+ "clean": "backstage-cli package clean",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack"
+ },
+ "dependencies": {
+ "@backstage/core-components": "^0.14.4",
+ "@backstage/core-plugin-api": "^1.9.2",
+ "@backstage/theme": "^0.5.3",
+ "@material-ui/core": "^4.9.13",
+ "@material-ui/icons": "^4.9.1",
+ "@material-ui/lab": "^4.0.0-alpha.60",
+ "react-use": "^17.2.4"
+ },
+ "peerDependencies": {
+ "react": "^16.13.1 || ^17.0.0 || ^18.0.0"
+ },
+ "devDependencies": {
+ "@backstage/cli": "^0.26.3",
+ "@backstage/core-app-api": "^1.12.4",
+ "@backstage/dev-utils": "^1.0.31",
+ "@backstage/test-utils": "^1.5.4",
+ "@testing-library/jest-dom": "^6.0.0",
+ "@testing-library/react": "^14.0.0",
+ "@testing-library/user-event": "^14.0.0",
+ "msw": "^1.0.0"
+ },
+ "files": [
+ "dist"
+ ]
+}
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/DevspacesComponent.tsx b/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/DevspacesComponent.tsx
new file mode 100644
index 0000000..2d21c20
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/DevspacesComponent.tsx
@@ -0,0 +1,37 @@
+import React from 'react';
+import { useEntity } from '@backstage/plugin-catalog-react'
+import { Typography, Grid, Box } from '@material-ui/core';
+import {
+ InfoCard,
+ Header,
+ Page,
+ Content,
+ ContentHeader,
+ HeaderLabel,
+ Link,
+ SupportButton,
+ Table,
+} from '@backstage/core-components';
+import { ExampleFetchComponent } from '../ExampleFetchComponent';
+
+export const DevspacesComponent = () => {
+ const { entity } = useEntity();
+ const annotations = entity?.metadata?.annotations;
+ const clusterUrl = "oc-med.wk.nt.local"
+ const devspacesApp = "devspaces"
+ const devspacesLink = `https://${devspacesApp}.apps.${clusterUrl}/#https://github.com/${annotations?.['github.com/project-slug']}`;
+
+ return (
+
+
+ {/* */}
+ {/* */}
+ Open Shift Dev Spaces
+
+ Open project in VSCode Web IDE
+
+ {/* */}
+
+
+ );
+};
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/DevspacesComponent.tsx.bak b/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/DevspacesComponent.tsx.bak
new file mode 100644
index 0000000..8a6bdf6
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/DevspacesComponent.tsx.bak
@@ -0,0 +1,38 @@
+import React from 'react';
+import { Typography, Grid } from '@material-ui/core';
+import {
+ InfoCard,
+ Header,
+ Page,
+ Content,
+ ContentHeader,
+ HeaderLabel,
+ SupportButton,
+} from '@backstage/core-components';
+import { ExampleFetchComponent } from '../ExampleFetchComponent';
+
+export const DevspacesComponent = () => (
+
+
+
+
+ A description of your plugin goes here.
+
+
+
+
+
+ All content should be wrapped in a card like this.
+
+
+
+
+
+
+
+
+
+);
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/ExampleComponent.test.tsx b/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/ExampleComponent.test.tsx
new file mode 100644
index 0000000..dae8923
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/ExampleComponent.test.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import { ExampleComponent } from './ExampleComponent';
+import { rest } from 'msw';
+import { setupServer } from 'msw/node';
+import { screen } from '@testing-library/react';
+import {
+ setupRequestMockHandlers,
+ renderInTestApp,
+} from '@backstage/test-utils';
+
+describe('ExampleComponent', () => {
+ const server = setupServer();
+ // Enable sane handlers for network requests
+ setupRequestMockHandlers(server);
+
+ // setup mock response
+ beforeEach(() => {
+ server.use(
+ rest.get('/*', (_, res, ctx) => res(ctx.status(200), ctx.json({}))),
+ );
+ });
+
+ it('should render', async () => {
+ await renderInTestApp();
+ expect(
+ screen.getByText('Welcome to devspaces-plugin!'),
+ ).toBeInTheDocument();
+ });
+});
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/index.ts b/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/index.ts
new file mode 100644
index 0000000..a35622d
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/components/DevspacesComponent/index.ts
@@ -0,0 +1 @@
+export { DevspacesComponent } from './DevspacesComponent';
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx b/sreez-showcase/plugins/devspaces-plugin/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx
new file mode 100644
index 0000000..1fe424a
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx
@@ -0,0 +1,19 @@
+import React from 'react';
+import { render, screen } from '@testing-library/react';
+import { ExampleFetchComponent } from './ExampleFetchComponent';
+
+describe('ExampleFetchComponent', () => {
+ it('renders the user table', async () => {
+ render();
+
+ // Wait for the table to render
+ const table = await screen.findByRole('table');
+ const nationality = screen.getAllByText('GB')
+ // Assert that the table contains the expected user data
+ expect(table).toBeInTheDocument();
+ expect(screen.getByAltText('Carolyn')).toBeInTheDocument();
+ expect(screen.getByText('Carolyn Moore')).toBeInTheDocument();
+ expect(screen.getByText('carolyn.moore@example.com')).toBeInTheDocument();
+ expect(nationality[0]).toBeInTheDocument();
+ });
+});
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx b/sreez-showcase/plugins/devspaces-plugin/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx
new file mode 100644
index 0000000..14a3e64
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx
@@ -0,0 +1,309 @@
+import React from 'react';
+import { makeStyles } from '@material-ui/core/styles';
+import {
+ Table,
+ TableColumn,
+ Progress,
+ ResponseErrorPanel,
+} from '@backstage/core-components';
+import useAsync from 'react-use/lib/useAsync';
+
+export const exampleUsers = {
+ results: [
+ {
+ gender: 'female',
+ name: {
+ title: 'Miss',
+ first: 'Carolyn',
+ last: 'Moore',
+ },
+ email: 'carolyn.moore@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Carolyn',
+ nat: 'GB',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Ms',
+ first: 'Esma',
+ last: 'Berberoğlu',
+ },
+ email: 'esma.berberoglu@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Esma',
+ nat: 'TR',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Ms',
+ first: 'Isabella',
+ last: 'Rhodes',
+ },
+ email: 'isabella.rhodes@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Isabella',
+ nat: 'GB',
+ },
+ {
+ gender: 'male',
+ name: {
+ title: 'Mr',
+ first: 'Derrick',
+ last: 'Carter',
+ },
+ email: 'derrick.carter@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Derrick',
+ nat: 'IE',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Miss',
+ first: 'Mattie',
+ last: 'Lambert',
+ },
+ email: 'mattie.lambert@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Mattie',
+ nat: 'AU',
+ },
+ {
+ gender: 'male',
+ name: {
+ title: 'Mr',
+ first: 'Mijat',
+ last: 'Rakić',
+ },
+ email: 'mijat.rakic@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Mijat',
+ nat: 'RS',
+ },
+ {
+ gender: 'male',
+ name: {
+ title: 'Mr',
+ first: 'Javier',
+ last: 'Reid',
+ },
+ email: 'javier.reid@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Javier',
+ nat: 'US',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Ms',
+ first: 'Isabella',
+ last: 'Li',
+ },
+ email: 'isabella.li@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Isabella',
+ nat: 'CA',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Mrs',
+ first: 'Stephanie',
+ last: 'Garrett',
+ },
+ email: 'stephanie.garrett@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Stephanie',
+ nat: 'AU',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Ms',
+ first: 'Antonia',
+ last: 'Núñez',
+ },
+ email: 'antonia.nunez@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Antonia',
+ nat: 'ES',
+ },
+ {
+ gender: 'male',
+ name: {
+ title: 'Mr',
+ first: 'Donald',
+ last: 'Young',
+ },
+ email: 'donald.young@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Donald',
+ nat: 'US',
+ },
+ {
+ gender: 'male',
+ name: {
+ title: 'Mr',
+ first: 'Iegor',
+ last: 'Holodovskiy',
+ },
+ email: 'iegor.holodovskiy@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Iegor',
+ nat: 'UA',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Madame',
+ first: 'Jessica',
+ last: 'David',
+ },
+ email: 'jessica.david@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Jessica',
+ nat: 'CH',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Ms',
+ first: 'Eve',
+ last: 'Martinez',
+ },
+ email: 'eve.martinez@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Eve',
+ nat: 'FR',
+ },
+ {
+ gender: 'male',
+ name: {
+ title: 'Mr',
+ first: 'Caleb',
+ last: 'Silva',
+ },
+ email: 'caleb.silva@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Caleb',
+ nat: 'US',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Miss',
+ first: 'Marcia',
+ last: 'Jenkins',
+ },
+ email: 'marcia.jenkins@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Marcia',
+ nat: 'US',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Mrs',
+ first: 'Mackenzie',
+ last: 'Jones',
+ },
+ email: 'mackenzie.jones@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Mackenzie',
+ nat: 'NZ',
+ },
+ {
+ gender: 'male',
+ name: {
+ title: 'Mr',
+ first: 'Jeremiah',
+ last: 'Gutierrez',
+ },
+ email: 'jeremiah.gutierrez@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Jeremiah',
+ nat: 'AU',
+ },
+ {
+ gender: 'female',
+ name: {
+ title: 'Ms',
+ first: 'Luciara',
+ last: 'Souza',
+ },
+ email: 'luciara.souza@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Luciara',
+ nat: 'BR',
+ },
+ {
+ gender: 'male',
+ name: {
+ title: 'Mr',
+ first: 'Valgi',
+ last: 'da Cunha',
+ },
+ email: 'valgi.dacunha@example.com',
+ picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Valgi',
+ nat: 'BR',
+ },
+ ],
+};
+
+const useStyles = makeStyles({
+ avatar: {
+ height: 32,
+ width: 32,
+ borderRadius: '50%',
+ },
+});
+
+type User = {
+ gender: string; // "male"
+ name: {
+ title: string; // "Mr",
+ first: string; // "Duane",
+ last: string; // "Reed"
+ };
+ email: string; // "duane.reed@example.com"
+ picture: string; // "https://api.dicebear.com/6.x/open-peeps/svg?seed=Duane"
+ nat: string; // "AU"
+};
+
+type DenseTableProps = {
+ users: User[];
+};
+
+export const DenseTable = ({ users }: DenseTableProps) => {
+ const classes = useStyles();
+
+ const columns: TableColumn[] = [
+ { title: 'Avatar', field: 'avatar' },
+ { title: 'Name', field: 'name' },
+ { title: 'Email', field: 'email' },
+ { title: 'Nationality', field: 'nationality' },
+ ];
+
+ const data = users.map(user => {
+ return {
+ avatar: (
+
+ ),
+ name: `${user.name.first} ${user.name.last}`,
+ email: user.email,
+ nationality: user.nat,
+ };
+ });
+
+ return (
+
+ );
+};
+
+export const ExampleFetchComponent = () => {
+
+ const { value, loading, error } = useAsync(async (): Promise => {
+ // Would use fetch in a real world example
+ return exampleUsers.results;
+ }, []);
+
+ if (loading) {
+ return ;
+ } else if (error) {
+ return ;
+ }
+
+ return ;
+};
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/components/ExampleFetchComponent/index.ts b/sreez-showcase/plugins/devspaces-plugin/src/components/ExampleFetchComponent/index.ts
new file mode 100644
index 0000000..41a43e8
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/components/ExampleFetchComponent/index.ts
@@ -0,0 +1 @@
+export { ExampleFetchComponent } from './ExampleFetchComponent';
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/index.ts b/sreez-showcase/plugins/devspaces-plugin/src/index.ts
new file mode 100644
index 0000000..718d2f9
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/index.ts
@@ -0,0 +1 @@
+export { devspacesPluginPlugin, DevspacesPluginPage } from './plugin';
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/plugin.test.ts b/sreez-showcase/plugins/devspaces-plugin/src/plugin.test.ts
new file mode 100644
index 0000000..e2e71ed
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/plugin.test.ts
@@ -0,0 +1,7 @@
+import { devspacesPluginPlugin } from './plugin';
+
+describe('devspaces-plugin', () => {
+ it('should export plugin', () => {
+ expect(devspacesPluginPlugin).toBeDefined();
+ });
+});
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/plugin.ts b/sreez-showcase/plugins/devspaces-plugin/src/plugin.ts
new file mode 100644
index 0000000..2451860
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/plugin.ts
@@ -0,0 +1,22 @@
+import {
+ createPlugin,
+ createRoutableExtension,
+} from '@backstage/core-plugin-api';
+
+import { rootRouteRef } from './routes';
+
+export const devspacesPluginPlugin = createPlugin({
+ id: 'devspaces-plugin',
+ routes: {
+ root: rootRouteRef,
+ },
+});
+
+export const DevspacesPluginPage = devspacesPluginPlugin.provide(
+ createRoutableExtension({
+ name: 'DevspacesPluginPage',
+ component: () =>
+ import('./components/DevspacesComponent').then(m => m.DevspacesComponent),
+ mountPoint: rootRouteRef,
+ }),
+);
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/routes.ts b/sreez-showcase/plugins/devspaces-plugin/src/routes.ts
new file mode 100644
index 0000000..186eaf3
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/routes.ts
@@ -0,0 +1,5 @@
+import { createRouteRef } from '@backstage/core-plugin-api';
+
+export const rootRouteRef = createRouteRef({
+ id: 'devspaces-plugin',
+});
diff --git a/sreez-showcase/plugins/devspaces-plugin/src/setupTests.ts b/sreez-showcase/plugins/devspaces-plugin/src/setupTests.ts
new file mode 100644
index 0000000..7b0828b
--- /dev/null
+++ b/sreez-showcase/plugins/devspaces-plugin/src/setupTests.ts
@@ -0,0 +1 @@
+import '@testing-library/jest-dom';
diff --git a/sreez-showcase/yarn.lock b/sreez-showcase/yarn.lock
index 183ff8c..e7bb802 100644
--- a/sreez-showcase/yarn.lock
+++ b/sreez-showcase/yarn.lock
@@ -2114,6 +2114,19 @@
"@material-ui/core" "^4.12.2"
"@material-ui/icons" "^4.9.1"
+"@backstage/app-defaults@^1.5.5":
+ version "1.5.5"
+ resolved "https://registry.yarnpkg.com/@backstage/app-defaults/-/app-defaults-1.5.5.tgz#0a5e8e25c4941efc974a31fe0cb83d00e3c52325"
+ integrity sha512-BtNf5h7thalS1nW3L76ji4xnubCb3frERTJVuYhULflgIJSGQGF1dR+XhwZmYDljUteDmdRlgK+ZCNCivkMSLg==
+ dependencies:
+ "@backstage/core-app-api" "^1.12.5"
+ "@backstage/core-components" "^0.14.7"
+ "@backstage/core-plugin-api" "^1.9.2"
+ "@backstage/plugin-permission-react" "^0.4.22"
+ "@backstage/theme" "^0.5.4"
+ "@material-ui/core" "^4.12.2"
+ "@material-ui/icons" "^4.9.1"
+
"@backstage/backend-app-api@^0.7.0":
version "0.7.1"
resolved "https://registry.yarnpkg.com/@backstage/backend-app-api/-/backend-app-api-0.7.1.tgz#0a58efae4f792bf1721e0601cf66a66a27f08fd2"
@@ -2316,6 +2329,16 @@
cross-fetch "^4.0.0"
uri-template "^2.0.0"
+"@backstage/catalog-client@^1.6.5":
+ version "1.6.5"
+ resolved "https://registry.yarnpkg.com/@backstage/catalog-client/-/catalog-client-1.6.5.tgz#f27c933abf8c7bf8bcbd090b4b550a7eb1957686"
+ integrity sha512-powm86JuibW0GtxtVYwO/xj3SjwV8AWMbL/D9C3Yl3mZ+4sp8lwXTTlKR+IdNHnFlDfwHiNH7LKT4BMgtTZbtA==
+ dependencies:
+ "@backstage/catalog-model" "^1.5.0"
+ "@backstage/errors" "^1.2.4"
+ cross-fetch "^4.0.0"
+ uri-template "^2.0.0"
+
"@backstage/catalog-model@^1.0.0", "@backstage/catalog-model@^1.4.4", "@backstage/catalog-model@^1.4.5":
version "1.4.5"
resolved "https://registry.yarnpkg.com/@backstage/catalog-model/-/catalog-model-1.4.5.tgz#b8f6309ff12b72dffdfe852d615c553ae13452c0"
@@ -2326,6 +2349,16 @@
ajv "^8.10.0"
lodash "^4.17.21"
+"@backstage/catalog-model@^1.5.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@backstage/catalog-model/-/catalog-model-1.5.0.tgz#7f5c4a80a3341555db5209fbc6fc2d25f6500707"
+ integrity sha512-CfLO5/DMGahneuLU4KTQEs1tgNhBciUtyGUDZB4Ii9i1Uha1poWcqp4HKg61lj1hmXNDUHmlbFqY9W7kmzRC0A==
+ dependencies:
+ "@backstage/errors" "^1.2.4"
+ "@backstage/types" "^1.1.1"
+ ajv "^8.10.0"
+ lodash "^4.17.21"
+
"@backstage/cli-common@^0.1.13":
version "0.1.13"
resolved "https://registry.yarnpkg.com/@backstage/cli-common/-/cli-common-0.1.13.tgz#cbeda6a359ca4437fc782f0ac51bb957e8d49e73"
@@ -2511,6 +2544,25 @@
zen-observable "^0.10.0"
zod "^3.22.4"
+"@backstage/core-app-api@^1.12.5":
+ version "1.12.5"
+ resolved "https://registry.yarnpkg.com/@backstage/core-app-api/-/core-app-api-1.12.5.tgz#d82396137d80f0b9cc3faa79ad4240faae1566b9"
+ integrity sha512-tDWjBtg7fz734hmymNDX+emnjeqyzBWxkcCJTgD1nxdt6eGYfAnqVp2kGbZfnuHe4QGA1yxjJvN+xazARlXqyQ==
+ dependencies:
+ "@backstage/config" "^1.2.0"
+ "@backstage/core-plugin-api" "^1.9.2"
+ "@backstage/types" "^1.1.1"
+ "@backstage/version-bridge" "^1.0.8"
+ "@types/prop-types" "^15.7.3"
+ "@types/react" "^16.13.1 || ^17.0.0 || ^18.0.0"
+ history "^5.0.0"
+ i18next "^22.4.15"
+ lodash "^4.17.21"
+ prop-types "^15.7.2"
+ react-use "^17.2.4"
+ zen-observable "^0.10.0"
+ zod "^3.22.4"
+
"@backstage/core-compat-api@^0.2.4":
version "0.2.4"
resolved "https://registry.yarnpkg.com/@backstage/core-compat-api/-/core-compat-api-0.2.4.tgz#1f652040d5300cdfb64e32d89b38748495ad2cf4"
@@ -2566,6 +2618,49 @@
zen-observable "^0.10.0"
zod "^3.22.4"
+"@backstage/core-components@^0.14.7":
+ version "0.14.7"
+ resolved "https://registry.yarnpkg.com/@backstage/core-components/-/core-components-0.14.7.tgz#3dd43b9fc21d0dd0ef7f7c39b54eb9e5819b9e08"
+ integrity sha512-VgGCbS/CRvrHbx+e5s3h+voFVBKO1EvpCfn7z0QcwptIpMNwlj/pT0Nwou/fLUoXTUjeS8Fa8LDc2OAiBJ96Sg==
+ dependencies:
+ "@backstage/config" "^1.2.0"
+ "@backstage/core-plugin-api" "^1.9.2"
+ "@backstage/errors" "^1.2.4"
+ "@backstage/theme" "^0.5.4"
+ "@backstage/version-bridge" "^1.0.8"
+ "@date-io/core" "^1.3.13"
+ "@material-table/core" "^3.1.0"
+ "@material-ui/core" "^4.12.2"
+ "@material-ui/icons" "^4.9.1"
+ "@material-ui/lab" "4.0.0-alpha.61"
+ "@react-hookz/web" "^24.0.0"
+ "@types/react" "^16.13.1 || ^17.0.0 || ^18.0.0"
+ "@types/react-sparklines" "^1.7.0"
+ ansi-regex "^6.0.1"
+ classnames "^2.2.6"
+ d3-selection "^3.0.0"
+ d3-shape "^3.0.0"
+ d3-zoom "^3.0.0"
+ dagre "^0.8.5"
+ linkify-react "4.1.3"
+ linkifyjs "4.1.3"
+ lodash "^4.17.21"
+ pluralize "^8.0.0"
+ qs "^6.9.4"
+ rc-progress "3.5.1"
+ react-helmet "6.1.0"
+ react-hook-form "^7.12.2"
+ react-idle-timer "5.7.2"
+ react-markdown "^8.0.0"
+ react-sparklines "^1.7.0"
+ react-syntax-highlighter "^15.4.5"
+ react-use "^17.3.2"
+ react-virtualized-auto-sizer "^1.0.11"
+ react-window "^1.8.6"
+ remark-gfm "^3.0.1"
+ zen-observable "^0.10.0"
+ zod "^3.22.4"
+
"@backstage/core-components@^0.9.2":
version "0.9.5"
resolved "https://registry.yarnpkg.com/@backstage/core-components/-/core-components-0.9.5.tgz#5a0b34867aaee0549bfa67b39a69c09588fa3c7a"
@@ -2623,6 +2718,24 @@
"@types/react" "^16.13.1 || ^17.0.0 || ^18.0.0"
history "^5.0.0"
+"@backstage/dev-utils@^1.0.31":
+ version "1.0.32"
+ resolved "https://registry.yarnpkg.com/@backstage/dev-utils/-/dev-utils-1.0.32.tgz#86464ab2892c1ef7c0aa931ccbf7a40d6dc00a77"
+ integrity sha512-+Lc8QAZZTgQyGlZ5OODZLxI3D4tBRGz3088gdo/C2LNLbXP5QKEJ1Vur1OTwbeLi6p83e265rImU6k+bMeXC6A==
+ dependencies:
+ "@backstage/app-defaults" "^1.5.5"
+ "@backstage/catalog-model" "^1.5.0"
+ "@backstage/core-app-api" "^1.12.5"
+ "@backstage/core-components" "^0.14.7"
+ "@backstage/core-plugin-api" "^1.9.2"
+ "@backstage/integration-react" "^1.1.27"
+ "@backstage/plugin-catalog-react" "^1.12.0"
+ "@backstage/theme" "^0.5.4"
+ "@material-ui/core" "^4.12.2"
+ "@material-ui/icons" "^4.9.1"
+ "@types/react" "^16.13.1 || ^17.0.0 || ^18.0.0"
+ react-use "^17.2.4"
+
"@backstage/e2e-test-utils@^0.1.1":
version "0.1.1"
resolved "https://registry.yarnpkg.com/@backstage/e2e-test-utils/-/e2e-test-utils-0.1.1.tgz#309164a5006593da711f55f430dc4d11a3036514"
@@ -2662,6 +2775,21 @@
zod "^3.22.4"
zod-to-json-schema "^3.21.4"
+"@backstage/frontend-plugin-api@^0.6.5":
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/@backstage/frontend-plugin-api/-/frontend-plugin-api-0.6.5.tgz#7be360541cb7e63f85df5a915a9672d56ed08157"
+ integrity sha512-AVrwF8HNPaB+qHW3SwFU3aPqqN7EVcq8zWEgghkjdmxiSmqbvBNT8ixg9mSxtR1/LiZzlE0oc31G5Z6DQmilFA==
+ dependencies:
+ "@backstage/core-components" "^0.14.7"
+ "@backstage/core-plugin-api" "^1.9.2"
+ "@backstage/types" "^1.1.1"
+ "@backstage/version-bridge" "^1.0.8"
+ "@material-ui/core" "^4.12.4"
+ "@types/react" "^16.13.1 || ^17.0.0 || ^18.0.0"
+ lodash "^4.17.21"
+ zod "^3.22.4"
+ zod-to-json-schema "^3.21.4"
+
"@backstage/integration-aws-node@^0.1.12":
version "0.1.12"
resolved "https://registry.yarnpkg.com/@backstage/integration-aws-node/-/integration-aws-node-0.1.12.tgz#d2c5ac7c81cd6c2733dcfd24544ad21931ea815d"
@@ -2687,6 +2815,18 @@
"@material-ui/icons" "^4.9.1"
"@types/react" "^16.13.1 || ^17.0.0"
+"@backstage/integration-react@^1.1.27":
+ version "1.1.27"
+ resolved "https://registry.yarnpkg.com/@backstage/integration-react/-/integration-react-1.1.27.tgz#df215f67e63d7c75e4e98c257b19d8e092836811"
+ integrity sha512-F4NZoUeUtE0sHrEkZ1vye1tQVG3gc/xMng4c+9lCVEZjEjM5c9geZaL1vJNoVHRpFjknYlqeqBwFoP2iqnfV4w==
+ dependencies:
+ "@backstage/config" "^1.2.0"
+ "@backstage/core-plugin-api" "^1.9.2"
+ "@backstage/integration" "^1.11.0"
+ "@material-ui/core" "^4.12.2"
+ "@material-ui/icons" "^4.9.1"
+ "@types/react" "^16.13.1 || ^17.0.0"
+
"@backstage/integration@^1.10.0":
version "1.10.0"
resolved "https://registry.yarnpkg.com/@backstage/integration/-/integration-1.10.0.tgz#81f37dcb506a4c6febaf9b3be88b5c4d2a40e6ec"
@@ -2702,6 +2842,21 @@
lodash "^4.17.21"
luxon "^3.0.0"
+"@backstage/integration@^1.11.0":
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/@backstage/integration/-/integration-1.11.0.tgz#0a04b6d3e15569c1074b7f39a7a3a17eefd1b89b"
+ integrity sha512-RRci3a/uEmfYCCFxuw+8GgLPuWeCxt7iGOJYUZlyDEPfvUL+GSIdB2GQm4nzktRCUrNaJPd7QxaagmQgPCaIzg==
+ dependencies:
+ "@azure/identity" "^4.0.0"
+ "@backstage/config" "^1.2.0"
+ "@backstage/errors" "^1.2.4"
+ "@octokit/auth-app" "^4.0.0"
+ "@octokit/rest" "^19.0.3"
+ cross-fetch "^4.0.0"
+ git-url-parse "^14.0.0"
+ lodash "^4.17.21"
+ luxon "^3.0.0"
+
"@backstage/plugin-api-docs@^0.11.4":
version "0.11.4"
resolved "https://registry.yarnpkg.com/@backstage/plugin-api-docs/-/plugin-api-docs-0.11.4.tgz#0d4d47f8ed9d4550a1f2b00b2e6ad0c57da85500"
@@ -3133,6 +3288,15 @@
"@backstage/plugin-permission-common" "^0.7.13"
"@backstage/plugin-search-common" "^1.2.11"
+"@backstage/plugin-catalog-common@^1.0.23":
+ version "1.0.23"
+ resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-common/-/plugin-catalog-common-1.0.23.tgz#2ba1fe13450f6283e049acc83aa4fcebda6153e8"
+ integrity sha512-u04VUq/2wNjF9ikpGxdt1kXSQf5VlPDWTwzYyJYKD80qGa6l/klUXJ3IBs8P4XyQObkPNyS/Tho/H8XDFNeqEw==
+ dependencies:
+ "@backstage/catalog-model" "^1.5.0"
+ "@backstage/plugin-permission-common" "^0.7.13"
+ "@backstage/plugin-search-common" "^1.2.11"
+
"@backstage/plugin-catalog-graph@^0.4.4":
version "0.4.4"
resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-graph/-/plugin-catalog-graph-0.4.4.tgz#ff26dcec8ae437d07bbdc98093aa52503fe2a1b1"
@@ -3229,6 +3393,36 @@
yaml "^2.0.0"
zen-observable "^0.10.0"
+"@backstage/plugin-catalog-react@^1.12.0":
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-react/-/plugin-catalog-react-1.12.0.tgz#9a46bdca42662fd54af9f227e585feb38688e993"
+ integrity sha512-DRgpmaCmcrtRuEcDRHELDgCezuJPtU36EJN5ythG0Q+fJMpxPcgU9PDEsIjAYJk96WukEDIY1u8QMd7smNUOCw==
+ dependencies:
+ "@backstage/catalog-client" "^1.6.5"
+ "@backstage/catalog-model" "^1.5.0"
+ "@backstage/core-components" "^0.14.7"
+ "@backstage/core-plugin-api" "^1.9.2"
+ "@backstage/errors" "^1.2.4"
+ "@backstage/frontend-plugin-api" "^0.6.5"
+ "@backstage/integration-react" "^1.1.27"
+ "@backstage/plugin-catalog-common" "^1.0.23"
+ "@backstage/plugin-permission-common" "^0.7.13"
+ "@backstage/plugin-permission-react" "^0.4.22"
+ "@backstage/types" "^1.1.1"
+ "@backstage/version-bridge" "^1.0.8"
+ "@material-ui/core" "^4.12.2"
+ "@material-ui/icons" "^4.9.1"
+ "@material-ui/lab" "4.0.0-alpha.61"
+ "@react-hookz/web" "^24.0.0"
+ "@types/react" "^16.13.1 || ^17.0.0 || ^18.0.0"
+ classnames "^2.2.6"
+ lodash "^4.17.21"
+ material-ui-popup-state "^1.9.3"
+ qs "^6.9.4"
+ react-use "^17.2.4"
+ yaml "^2.0.0"
+ zen-observable "^0.10.0"
+
"@backstage/plugin-catalog@^1.19.0":
version "1.19.0"
resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog/-/plugin-catalog-1.19.0.tgz#37ff1a4b68479a94386b910ce93aa1b181e67511"
@@ -4119,6 +4313,15 @@
"@emotion/styled" "^11.10.5"
"@mui/material" "^5.12.2"
+"@backstage/theme@^0.5.4":
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/@backstage/theme/-/theme-0.5.5.tgz#cf6556d123c998612c734d56be60a0c8a211c8d6"
+ integrity sha512-KRgRHCD38tcBkSlkAje+pOY2anfZzaO3QHgv5VqiSL2mpaI/RQLv6/PhRjCcWm/yx5WXBK1S5uG/8x7VeSEcwA==
+ dependencies:
+ "@emotion/react" "^11.10.5"
+ "@emotion/styled" "^11.10.5"
+ "@mui/material" "^5.12.2"
+
"@backstage/types@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@backstage/types/-/types-1.1.1.tgz#c9ccb30357005e7fb5fa2ac140198059976eb076"
@@ -10181,6 +10384,7 @@ anymatch@^3.0.3, anymatch@~3.1.2:
"@backstage/plugin-user-settings" "^0.8.5"
"@backstage/theme" "^0.5.3"
"@bestsellerit/backstage-plugin-harbor" "^0.3.1"
+ "@internal/backstage-plugin-devspaces-plugin" "^0.1.0"
"@material-ui/core" "^4.12.2"
"@material-ui/icons" "^4.9.1"
"@roadiehq/backstage-plugin-argo-cd" "^2.6.4"