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: ( + {user.name.first} + ), + 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"