diff --git a/workspaces/theme/.changeset/healthy-queens-mix.md b/workspaces/theme/.changeset/healthy-queens-mix.md new file mode 100644 index 0000000000..bea07f28f3 --- /dev/null +++ b/workspaces/theme/.changeset/healthy-queens-mix.md @@ -0,0 +1,9 @@ +--- +'@red-hat-developer-hub/backstage-plugin-mui4-test': patch +'@red-hat-developer-hub/backstage-plugin-mui5-test': patch +'@red-hat-developer-hub/backstage-plugin-bcc-test': patch +'@red-hat-developer-hub/backstage-plugin-bui-test': patch +'@red-hat-developer-hub/backstage-plugin-theme': patch +--- + +Added NFS support. diff --git a/workspaces/theme/app-config.yaml b/workspaces/theme/app-config.yaml index ca52ec530c..776dde75f8 100644 --- a/workspaces/theme/app-config.yaml +++ b/workspaces/theme/app-config.yaml @@ -1,7 +1,12 @@ app: - title: Scaffolded Backstage App + title: My Company Catalog baseUrl: http://localhost:3000 + packages: all + + extensions: + - nav-item:user-settings: false + organization: name: My Company diff --git a/workspaces/theme/package.json b/workspaces/theme/package.json index 7057869731..e57421ce70 100644 --- a/workspaces/theme/package.json +++ b/workspaces/theme/package.json @@ -7,6 +7,7 @@ }, "scripts": { "start": "backstage-cli repo start", + "start:legacy": "yarn start app-legacy backend", "start-backend": "yarn workspace backend start", "build:backend": "yarn workspace backend build", "tsc": "tsc", diff --git a/workspaces/theme/packages/app-legacy/.eslintignore b/workspaces/theme/packages/app-legacy/.eslintignore new file mode 100644 index 0000000000..5c9ddce97e --- /dev/null +++ b/workspaces/theme/packages/app-legacy/.eslintignore @@ -0,0 +1,3 @@ +public +dist +.eslintrc.js diff --git a/workspaces/theme/packages/app-legacy/.eslintrc.js b/workspaces/theme/packages/app-legacy/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/workspaces/theme/packages/app-legacy/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/workspaces/theme/packages/app/e2e-tests/custom-theme.spec.ts b/workspaces/theme/packages/app-legacy/e2e-tests/custom-theme.spec.ts similarity index 100% rename from workspaces/theme/packages/app/e2e-tests/custom-theme.spec.ts rename to workspaces/theme/packages/app-legacy/e2e-tests/custom-theme.spec.ts diff --git a/workspaces/theme/packages/app/e2e-tests/utils/acessibility.ts b/workspaces/theme/packages/app-legacy/e2e-tests/utils/acessibility.ts similarity index 100% rename from workspaces/theme/packages/app/e2e-tests/utils/acessibility.ts rename to workspaces/theme/packages/app-legacy/e2e-tests/utils/acessibility.ts diff --git a/workspaces/theme/packages/app/e2e-tests/utils/test-utils.ts b/workspaces/theme/packages/app-legacy/e2e-tests/utils/test-utils.ts similarity index 100% rename from workspaces/theme/packages/app/e2e-tests/utils/test-utils.ts rename to workspaces/theme/packages/app-legacy/e2e-tests/utils/test-utils.ts diff --git a/workspaces/theme/packages/app/e2e-tests/utils/theme-constants.ts b/workspaces/theme/packages/app-legacy/e2e-tests/utils/theme-constants.ts similarity index 100% rename from workspaces/theme/packages/app/e2e-tests/utils/theme-constants.ts rename to workspaces/theme/packages/app-legacy/e2e-tests/utils/theme-constants.ts diff --git a/workspaces/theme/packages/app/e2e-tests/utils/theme-verifier.ts b/workspaces/theme/packages/app-legacy/e2e-tests/utils/theme-verifier.ts similarity index 100% rename from workspaces/theme/packages/app/e2e-tests/utils/theme-verifier.ts rename to workspaces/theme/packages/app-legacy/e2e-tests/utils/theme-verifier.ts diff --git a/workspaces/theme/packages/app/knip-report.md b/workspaces/theme/packages/app-legacy/knip-report.md similarity index 100% rename from workspaces/theme/packages/app/knip-report.md rename to workspaces/theme/packages/app-legacy/knip-report.md diff --git a/workspaces/theme/packages/app-legacy/package.json b/workspaces/theme/packages/app-legacy/package.json new file mode 100644 index 0000000000..5d0e3e1b4f --- /dev/null +++ b/workspaces/theme/packages/app-legacy/package.json @@ -0,0 +1,85 @@ +{ + "name": "app-legacy", + "version": "0.0.0", + "private": true, + "bundled": true, + "repository": { + "type": "git", + "url": "https://github.com/redhat-developer/rhdh-plugins", + "directory": "workspaces/theme/packages/app-legacy" + }, + "backstage": { + "role": "frontend" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "test": "backstage-cli package test", + "lint": "backstage-cli package lint" + }, + "dependencies": { + "@backstage/app-defaults": "^1.7.2", + "@backstage/catalog-model": "^1.7.6", + "@backstage/cli": "^0.34.5", + "@backstage/core-app-api": "^1.19.2", + "@backstage/core-components": "^0.18.3", + "@backstage/core-plugin-api": "^1.12.0", + "@backstage/integration-react": "^1.2.12", + "@backstage/plugin-api-docs": "^0.13.1", + "@backstage/plugin-catalog": "^1.32.0", + "@backstage/plugin-catalog-common": "^1.1.7", + "@backstage/plugin-catalog-graph": "^0.5.3", + "@backstage/plugin-catalog-import": "^0.13.7", + "@backstage/plugin-catalog-react": "^1.21.3", + "@backstage/plugin-kubernetes": "^0.12.13", + "@backstage/plugin-org": "^0.6.46", + "@backstage/plugin-permission-react": "^0.4.38", + "@backstage/plugin-scaffolder": "^1.34.3", + "@backstage/plugin-search": "^1.5.0", + "@backstage/plugin-search-react": "^1.10.0", + "@backstage/plugin-techdocs": "^1.16.0", + "@backstage/plugin-techdocs-module-addons-contrib": "^1.1.30", + "@backstage/plugin-techdocs-react": "^1.3.5", + "@backstage/plugin-user-settings": "^0.8.29", + "@backstage/theme": "^0.7.0", + "@backstage/ui": "^0.9.1", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@red-hat-developer-hub/backstage-plugin-bcc-test": "workspace:^", + "@red-hat-developer-hub/backstage-plugin-bui-test": "workspace:^", + "@red-hat-developer-hub/backstage-plugin-mui4-test": "workspace:^", + "@red-hat-developer-hub/backstage-plugin-mui5-test": "workspace:^", + "@red-hat-developer-hub/backstage-plugin-theme": "workspace:^", + "react": "^18.0.2", + "react-dom": "^18.0.2", + "react-router": "^6.3.0", + "react-router-dom": "^6.3.0" + }, + "devDependencies": { + "@axe-core/playwright": "^4.11.0", + "@backstage/test-utils": "^1.7.13", + "@playwright/test": "1.58.2", + "@testing-library/dom": "^9.0.0", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.0.0", + "@types/react-dom": "*", + "cross-env": "^7.0.0" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "files": [ + "dist" + ] +} diff --git a/workspaces/theme/packages/app/public/android-chrome-192x192.png b/workspaces/theme/packages/app-legacy/public/android-chrome-192x192.png similarity index 100% rename from workspaces/theme/packages/app/public/android-chrome-192x192.png rename to workspaces/theme/packages/app-legacy/public/android-chrome-192x192.png diff --git a/workspaces/theme/packages/app/public/apple-touch-icon.png b/workspaces/theme/packages/app-legacy/public/apple-touch-icon.png similarity index 100% rename from workspaces/theme/packages/app/public/apple-touch-icon.png rename to workspaces/theme/packages/app-legacy/public/apple-touch-icon.png diff --git a/workspaces/theme/packages/app/public/favicon-16x16.png b/workspaces/theme/packages/app-legacy/public/favicon-16x16.png similarity index 100% rename from workspaces/theme/packages/app/public/favicon-16x16.png rename to workspaces/theme/packages/app-legacy/public/favicon-16x16.png diff --git a/workspaces/theme/packages/app/public/favicon-32x32.png b/workspaces/theme/packages/app-legacy/public/favicon-32x32.png similarity index 100% rename from workspaces/theme/packages/app/public/favicon-32x32.png rename to workspaces/theme/packages/app-legacy/public/favicon-32x32.png diff --git a/workspaces/theme/packages/app/public/favicon.ico b/workspaces/theme/packages/app-legacy/public/favicon.ico similarity index 100% rename from workspaces/theme/packages/app/public/favicon.ico rename to workspaces/theme/packages/app-legacy/public/favicon.ico diff --git a/workspaces/theme/packages/app-legacy/public/index.html b/workspaces/theme/packages/app-legacy/public/index.html new file mode 100644 index 0000000000..00859982f2 --- /dev/null +++ b/workspaces/theme/packages/app-legacy/public/index.html @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + <%= config.getOptionalString('app.title') ?? 'Backstage' %> + + + +
+ + + diff --git a/workspaces/theme/packages/app-legacy/public/manifest.json b/workspaces/theme/packages/app-legacy/public/manifest.json new file mode 100644 index 0000000000..4a7c1b4ec4 --- /dev/null +++ b/workspaces/theme/packages/app-legacy/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Backstage", + "name": "Backstage", + "icons": [ + { + "src": "favicon.ico", + "sizes": "48x48", + "type": "image/png" + } + ], + "start_url": "./index.html", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/workspaces/theme/packages/app/public/robots.txt b/workspaces/theme/packages/app-legacy/public/robots.txt similarity index 100% rename from workspaces/theme/packages/app/public/robots.txt rename to workspaces/theme/packages/app-legacy/public/robots.txt diff --git a/workspaces/theme/packages/app/public/safari-pinned-tab.svg b/workspaces/theme/packages/app-legacy/public/safari-pinned-tab.svg similarity index 100% rename from workspaces/theme/packages/app/public/safari-pinned-tab.svg rename to workspaces/theme/packages/app-legacy/public/safari-pinned-tab.svg diff --git a/workspaces/theme/packages/app/src/App.test.tsx b/workspaces/theme/packages/app-legacy/src/App.test.tsx similarity index 100% rename from workspaces/theme/packages/app/src/App.test.tsx rename to workspaces/theme/packages/app-legacy/src/App.test.tsx diff --git a/workspaces/theme/packages/app-legacy/src/App.tsx b/workspaces/theme/packages/app-legacy/src/App.tsx new file mode 100644 index 0000000000..7ac722bb68 --- /dev/null +++ b/workspaces/theme/packages/app-legacy/src/App.tsx @@ -0,0 +1,135 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 { Navigate, Route } from 'react-router-dom'; +import { apiDocsPlugin, ApiExplorerPage } from '@backstage/plugin-api-docs'; +import { + CatalogEntityPage, + CatalogIndexPage, + catalogPlugin, +} from '@backstage/plugin-catalog'; +import { + CatalogImportPage, + catalogImportPlugin, +} from '@backstage/plugin-catalog-import'; +import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder'; +import { orgPlugin } from '@backstage/plugin-org'; +import { SearchPage } from '@backstage/plugin-search'; +import { + TechDocsIndexPage, + techdocsPlugin, + TechDocsReaderPage, +} from '@backstage/plugin-techdocs'; +import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; +import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib'; +import { UserSettingsPage } from '@backstage/plugin-user-settings'; +import { apis } from './apis'; +import { entityPage } from './components/catalog/EntityPage'; +import { searchPage } from './components/search/SearchPage'; +import { Root } from './components/Root'; + +import { + AlertDisplay, + OAuthRequestDialog, + SignInPage, +} from '@backstage/core-components'; +import { createApp } from '@backstage/app-defaults'; +import { AppRouter, FlatRoutes } from '@backstage/core-app-api'; +import { CatalogGraphPage } from '@backstage/plugin-catalog-graph'; +import { RequirePermission } from '@backstage/plugin-permission-react'; +import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha'; + +import { BCCTestPage } from '@red-hat-developer-hub/backstage-plugin-bcc-test'; +import { BUITestPage } from '@red-hat-developer-hub/backstage-plugin-bui-test'; +import { MUI4TestPage } from '@red-hat-developer-hub/backstage-plugin-mui4-test'; +import { MUI5TestPage } from '@red-hat-developer-hub/backstage-plugin-mui5-test'; +import { getAllThemes } from '@red-hat-developer-hub/backstage-plugin-theme'; + +const app = createApp({ + apis, + bindRoutes({ bind }) { + bind(catalogPlugin.externalRoutes, { + createComponent: scaffolderPlugin.routes.root, + viewTechDoc: techdocsPlugin.routes.docRoot, + createFromTemplate: scaffolderPlugin.routes.selectedTemplate, + }); + bind(apiDocsPlugin.externalRoutes, { + registerApi: catalogImportPlugin.routes.importPage, + }); + bind(scaffolderPlugin.externalRoutes, { + registerComponent: catalogImportPlugin.routes.importPage, + viewTechDoc: techdocsPlugin.routes.docRoot, + }); + bind(orgPlugin.externalRoutes, { + catalogIndex: catalogPlugin.routes.catalogIndex, + }); + }, + components: { + SignInPage: props => , + }, + themes: getAllThemes(), +}); + +const routes = ( + + } /> + } /> + } + > + {entityPage} + + } /> + } + > + + + + + } /> + } /> + + + + } + /> + }> + {searchPage} + + } /> + } /> + } /> + } /> + } /> + } /> + +); + +export default app.createRoot( + <> + + + + {routes} + + , +); diff --git a/workspaces/theme/packages/app-legacy/src/apis.ts b/workspaces/theme/packages/app-legacy/src/apis.ts new file mode 100644 index 0000000000..8bbbfc05aa --- /dev/null +++ b/workspaces/theme/packages/app-legacy/src/apis.ts @@ -0,0 +1,35 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 { + ScmIntegrationsApi, + scmIntegrationsApiRef, + ScmAuth, +} from '@backstage/integration-react'; +import { + AnyApiFactory, + configApiRef, + createApiFactory, +} from '@backstage/core-plugin-api'; + +export const apis: AnyApiFactory[] = [ + createApiFactory({ + api: scmIntegrationsApiRef, + deps: { configApi: configApiRef }, + factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi), + }), + ScmAuth.createDefaultApiFactory(), +]; diff --git a/workspaces/theme/packages/app-legacy/src/components/Root/LogoFull.tsx b/workspaces/theme/packages/app-legacy/src/components/Root/LogoFull.tsx new file mode 100644 index 0000000000..c7536520e7 --- /dev/null +++ b/workspaces/theme/packages/app-legacy/src/components/Root/LogoFull.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + width: 'auto', + height: 30, + }, + path: { + fill: '#7df3e1', + }, +}); +const LogoFull = () => { + const classes = useStyles(); + + return ( + + + + ); +}; + +export default LogoFull; diff --git a/workspaces/theme/packages/app-legacy/src/components/Root/LogoIcon.tsx b/workspaces/theme/packages/app-legacy/src/components/Root/LogoIcon.tsx new file mode 100644 index 0000000000..5d0ff212c8 --- /dev/null +++ b/workspaces/theme/packages/app-legacy/src/components/Root/LogoIcon.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + width: 'auto', + height: 28, + }, + path: { + fill: '#7df3e1', + }, +}); + +const LogoIcon = () => { + const classes = useStyles(); + + return ( + + + + ); +}; + +export default LogoIcon; diff --git a/workspaces/theme/packages/app-legacy/src/components/Root/Root.tsx b/workspaces/theme/packages/app-legacy/src/components/Root/Root.tsx new file mode 100644 index 0000000000..18198b3a66 --- /dev/null +++ b/workspaces/theme/packages/app-legacy/src/components/Root/Root.tsx @@ -0,0 +1,117 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 { PropsWithChildren } from 'react'; +import { makeStyles } from '@material-ui/core'; +import HomeIcon from '@material-ui/icons/Home'; +import ExtensionIcon from '@material-ui/icons/Extension'; +import LibraryBooks from '@material-ui/icons/LibraryBooks'; +import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; +import LogoFull from './LogoFull'; +import LogoIcon from './LogoIcon'; +import { + Settings as SidebarSettings, + UserSettingsSignInAvatar, +} from '@backstage/plugin-user-settings'; +import { SidebarSearchModal } from '@backstage/plugin-search'; +import { + Sidebar, + sidebarConfig, + SidebarDivider, + SidebarGroup, + SidebarItem, + SidebarPage, + SidebarScrollWrapper, + SidebarSpace, + useSidebarOpenState, + Link, +} from '@backstage/core-components'; +import MenuIcon from '@material-ui/icons/Menu'; +import SearchIcon from '@material-ui/icons/Search'; +import { MyGroupsSidebarItem } from '@backstage/plugin-org'; +import GroupIcon from '@material-ui/icons/People'; + +const useSidebarLogoStyles = makeStyles({ + root: { + width: sidebarConfig.drawerWidthClosed, + height: 3 * sidebarConfig.logoHeight, + display: 'flex', + flexFlow: 'row nowrap', + alignItems: 'center', + marginBottom: -14, + }, + link: { + width: sidebarConfig.drawerWidthClosed, + marginLeft: 24, + }, +}); + +const SidebarLogo = () => { + const classes = useSidebarLogoStyles(); + const { isOpen } = useSidebarOpenState(); + + return ( +
+ + {isOpen ? : } + +
+ ); +}; + +export const Root = ({ children }: PropsWithChildren<{}>) => ( + + + + } to="/search"> + + + + }> + {/* Global nav, not org-specific */} + + + + + + {/* End global nav */} + + + + + + + + {/* Items in this group will be scrollable if they run out of space */} + + + + + } + to="/settings" + > + + + + {children} + +); diff --git a/workspaces/theme/packages/app-legacy/src/components/Root/index.ts b/workspaces/theme/packages/app-legacy/src/components/Root/index.ts new file mode 100644 index 0000000000..98b6dde118 --- /dev/null +++ b/workspaces/theme/packages/app-legacy/src/components/Root/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Red Hat, Inc. + * + * 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. + */ + +export { Root } from './Root'; diff --git a/workspaces/theme/packages/app-legacy/src/components/catalog/EntityPage.tsx b/workspaces/theme/packages/app-legacy/src/components/catalog/EntityPage.tsx new file mode 100644 index 0000000000..f82362c31c --- /dev/null +++ b/workspaces/theme/packages/app-legacy/src/components/catalog/EntityPage.tsx @@ -0,0 +1,426 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 { Button, Grid } from '@material-ui/core'; +import { + EntityApiDefinitionCard, + EntityConsumedApisCard, + EntityConsumingComponentsCard, + EntityHasApisCard, + EntityProvidedApisCard, + EntityProvidingComponentsCard, +} from '@backstage/plugin-api-docs'; +import { + EntityAboutCard, + EntityDependsOnComponentsCard, + EntityDependsOnResourcesCard, + EntityHasComponentsCard, + EntityHasResourcesCard, + EntityHasSubcomponentsCard, + EntityHasSystemsCard, + EntityLayout, + EntityLinksCard, + EntitySwitch, + EntityOrphanWarning, + EntityProcessingErrorsPanel, + isComponentType, + isKind, + hasCatalogProcessingErrors, + isOrphan, + hasRelationWarnings, + EntityRelationWarning, +} from '@backstage/plugin-catalog'; +import { + EntityUserProfileCard, + EntityGroupProfileCard, + EntityMembersListCard, + EntityOwnershipCard, +} from '@backstage/plugin-org'; +import { EntityTechdocsContent } from '@backstage/plugin-techdocs'; +import { EmptyState } from '@backstage/core-components'; +import { + Direction, + EntityCatalogGraphCard, +} from '@backstage/plugin-catalog-graph'; +import { + RELATION_API_CONSUMED_BY, + RELATION_API_PROVIDED_BY, + RELATION_CONSUMES_API, + RELATION_DEPENDENCY_OF, + RELATION_DEPENDS_ON, + RELATION_HAS_PART, + RELATION_PART_OF, + RELATION_PROVIDES_API, +} from '@backstage/catalog-model'; + +import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; +import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib'; + +import { + EntityKubernetesContent, + isKubernetesAvailable, +} from '@backstage/plugin-kubernetes'; + +const techdocsContent = ( + + + + + +); + +const cicdContent = ( + // This is an example of how you can implement your company's logic in entity page. + // You can for example enforce that all components of type 'service' should use GitHubActions + + {/* + Here you can add support for different CI/CD services, for example + using @backstage-community/plugin-github-actions as follows: + + + + */} + + + Read more + + } + /> + + +); + +const entityWarningContent = ( + <> + + + + + + + + + + + + + + + + + + + + + + + + +); + +const overviewContent = ( + + {entityWarningContent} + + + + + + + + + + + + + + +); + +const serviceEntityPage = ( + + + {overviewContent} + + + + {cicdContent} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {techdocsContent} + + +); + +const websiteEntityPage = ( + + + {overviewContent} + + + + {cicdContent} + + + + + + + + + + + + + + + + + + + {techdocsContent} + + +); + +/** + * NOTE: This page is designed to work on small screens such as mobile devices. + * This is based on Material UI Grid. If breakpoints are used, each grid item must set the `xs` prop to a column size or to `true`, + * since this does not default. If no breakpoints are used, the items will equitably share the available space. + * https://material-ui.com/components/grid/#basic-grid. + */ + +const defaultEntityPage = ( + + + {overviewContent} + + + + {techdocsContent} + + +); + +const componentPage = ( + + + {serviceEntityPage} + + + + {websiteEntityPage} + + + {defaultEntityPage} + +); + +const apiPage = ( + + + + {entityWarningContent} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +const userPage = ( + + + + {entityWarningContent} + + + + + + + + + +); + +const groupPage = ( + + + + {entityWarningContent} + + + + + + + + + + + + + + + +); + +const systemPage = ( + + + + {entityWarningContent} + + + + + + + + + + + + + + + + + + + + + + + + +); + +const domainPage = ( + + + + {entityWarningContent} + + + + + + + + + + + + +); + +export const entityPage = ( + + + + + + + + + {defaultEntityPage} + +); diff --git a/workspaces/theme/packages/app-legacy/src/components/search/SearchPage.tsx b/workspaces/theme/packages/app-legacy/src/components/search/SearchPage.tsx new file mode 100644 index 0000000000..008fc1619a --- /dev/null +++ b/workspaces/theme/packages/app-legacy/src/components/search/SearchPage.tsx @@ -0,0 +1,139 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 { makeStyles, Theme, Grid, Paper } from '@material-ui/core'; + +import { CatalogSearchResultListItem } from '@backstage/plugin-catalog'; +import { + catalogApiRef, + CATALOG_FILTER_EXISTS, +} from '@backstage/plugin-catalog-react'; +import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs'; + +import { SearchType } from '@backstage/plugin-search'; +import { + SearchBar, + SearchFilter, + SearchResult, + SearchPagination, + useSearch, +} from '@backstage/plugin-search-react'; +import { + CatalogIcon, + Content, + DocsIcon, + Header, + Page, +} from '@backstage/core-components'; +import { useApi } from '@backstage/core-plugin-api'; + +const useStyles = makeStyles((theme: Theme) => ({ + bar: { + padding: theme.spacing(1, 0), + }, + filters: { + padding: theme.spacing(2), + marginTop: theme.spacing(2), + }, + filter: { + '& + &': { + marginTop: theme.spacing(2.5), + }, + }, +})); + +const SearchPage = () => { + const classes = useStyles(); + const { types } = useSearch(); + const catalogApi = useApi(catalogApiRef); + + return ( + +
+ + + + + + + + + , + }, + { + value: 'techdocs', + name: 'Documentation', + icon: , + }, + ]} + /> + + {types.includes('techdocs') && ( + { + // Return a list of entities which are documented. + const { items } = await catalogApi.getEntities({ + fields: ['metadata.name'], + filter: { + 'metadata.annotations.backstage.io/techdocs-ref': + CATALOG_FILTER_EXISTS, + }, + }); + + const names = items.map(entity => entity.metadata.name); + names.sort(); + return names; + }} + /> + )} + + + + + + + + } /> + } /> + + + + + + ); +}; + +export const searchPage = ; diff --git a/workspaces/theme/packages/app-legacy/src/index.tsx b/workspaces/theme/packages/app-legacy/src/index.tsx new file mode 100644 index 0000000000..631b76a44d --- /dev/null +++ b/workspaces/theme/packages/app-legacy/src/index.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 '@backstage/cli/asset-types'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import '@backstage/ui/css/styles.css'; + +ReactDOM.createRoot(document.getElementById('root')!).render(); diff --git a/workspaces/theme/packages/app/src/setupTests.ts b/workspaces/theme/packages/app-legacy/src/setupTests.ts similarity index 100% rename from workspaces/theme/packages/app/src/setupTests.ts rename to workspaces/theme/packages/app-legacy/src/setupTests.ts diff --git a/workspaces/theme/packages/app/.eslintignore b/workspaces/theme/packages/app/.eslintignore deleted file mode 100644 index a48cf0de7a..0000000000 --- a/workspaces/theme/packages/app/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -public diff --git a/workspaces/theme/packages/app/README.md b/workspaces/theme/packages/app/README.md new file mode 100644 index 0000000000..09ccf4664e --- /dev/null +++ b/workspaces/theme/packages/app/README.md @@ -0,0 +1,35 @@ +# app (NFS – main app) + +This package is the **main frontend app** for the theme workspace, built on the **New Frontend System (NFS)**. It uses: + +- `createApp` from `@backstage/frontend-defaults` +- `convertLegacyApp` from `@backstage/core-compat-api` for hybrid migration +- RHDH themes registered via **ThemeBlueprint** in a `createFrontendModule({ pluginId: 'app', extensions: [...] })` + +Existing theme behavior is unchanged: the same `getAllThemes()` from `@red-hat-developer-hub/backstage-plugin-theme` is used; the app registers them as NFS extensions instead of passing `themes` to legacy `createApp`. + +## Run + +From the theme workspace root: + +```bash +# Start backend (in one terminal) +yarn start-backend + +# Start app (NFS – default) +yarn start +``` + +To run the legacy app instead: + +```bash +yarn start:legacy +``` + +Or from this package: + +```bash +yarn start +``` + +See [THEME_NFS_BRIDGE_DESIGN.md](../../docs/THEME_NFS_BRIDGE_DESIGN.md) for the design. diff --git a/workspaces/theme/packages/app/package.json b/workspaces/theme/packages/app/package.json index 05a83b68c8..9bf9aad282 100644 --- a/workspaces/theme/packages/app/package.json +++ b/workspaces/theme/packages/app/package.json @@ -19,14 +19,17 @@ "lint": "backstage-cli package lint" }, "dependencies": { - "@backstage/app-defaults": "^1.7.2", "@backstage/catalog-model": "^1.7.6", "@backstage/cli": "^0.34.5", "@backstage/core-app-api": "^1.19.2", + "@backstage/core-compat-api": "^0.2.0", "@backstage/core-components": "^0.18.3", "@backstage/core-plugin-api": "^1.12.0", + "@backstage/frontend-defaults": "^0.3.0", + "@backstage/frontend-plugin-api": "^0.13.0", "@backstage/integration-react": "^1.2.12", "@backstage/plugin-api-docs": "^0.13.1", + "@backstage/plugin-app-react": "^0.1.0", "@backstage/plugin-catalog": "^1.32.0", "@backstage/plugin-catalog-common": "^1.1.7", "@backstage/plugin-catalog-graph": "^0.5.3", @@ -57,9 +60,7 @@ "react-router-dom": "^6.3.0" }, "devDependencies": { - "@axe-core/playwright": "^4.11.0", "@backstage/test-utils": "^1.7.13", - "@playwright/test": "1.58.2", "@testing-library/dom": "^9.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^14.0.0", diff --git a/workspaces/theme/packages/app/public/index.html b/workspaces/theme/packages/app/public/index.html index 00859982f2..3d2491c2e0 100644 --- a/workspaces/theme/packages/app/public/index.html +++ b/workspaces/theme/packages/app/public/index.html @@ -8,10 +8,6 @@ name="description" content="Backstage is an open source framework for building developer portals" /> -
- diff --git a/workspaces/theme/packages/app/public/manifest.json b/workspaces/theme/packages/app/public/manifest.json index 4a7c1b4ec4..ffbc721a5c 100644 --- a/workspaces/theme/packages/app/public/manifest.json +++ b/workspaces/theme/packages/app/public/manifest.json @@ -1,13 +1,7 @@ { "short_name": "Backstage", "name": "Backstage", - "icons": [ - { - "src": "favicon.ico", - "sizes": "48x48", - "type": "image/png" - } - ], + "icons": [{ "src": "favicon.ico", "sizes": "48x48", "type": "image/png" }], "start_url": "./index.html", "display": "standalone", "theme_color": "#000000", diff --git a/workspaces/theme/packages/app/src/App.tsx b/workspaces/theme/packages/app/src/App.tsx index 7ac722bb68..d762eba4e1 100644 --- a/workspaces/theme/packages/app/src/App.tsx +++ b/workspaces/theme/packages/app/src/App.tsx @@ -15,121 +15,163 @@ */ import { Navigate, Route } from 'react-router-dom'; -import { apiDocsPlugin, ApiExplorerPage } from '@backstage/plugin-api-docs'; -import { - CatalogEntityPage, - CatalogIndexPage, - catalogPlugin, -} from '@backstage/plugin-catalog'; -import { - CatalogImportPage, - catalogImportPlugin, -} from '@backstage/plugin-catalog-import'; -import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder'; -import { orgPlugin } from '@backstage/plugin-org'; +import { ApiExplorerPage } from '@backstage/plugin-api-docs'; +import { CatalogEntityPage, CatalogIndexPage } from '@backstage/plugin-catalog'; +import { CatalogImportPage } from '@backstage/plugin-catalog-import'; +import { ScaffolderPage } from '@backstage/plugin-scaffolder'; import { SearchPage } from '@backstage/plugin-search'; import { TechDocsIndexPage, - techdocsPlugin, TechDocsReaderPage, } from '@backstage/plugin-techdocs'; import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib'; import { UserSettingsPage } from '@backstage/plugin-user-settings'; -import { apis } from './apis'; import { entityPage } from './components/catalog/EntityPage'; import { searchPage } from './components/search/SearchPage'; -import { Root } from './components/Root'; +import { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components'; +import { createApp } from '@backstage/frontend-defaults'; +import { convertLegacyApp } from '@backstage/core-compat-api'; import { - AlertDisplay, - OAuthRequestDialog, - SignInPage, -} from '@backstage/core-components'; -import { createApp } from '@backstage/app-defaults'; + createFrontendModule, + PageBlueprint, + type FrontendFeature, + type FrontendFeatureLoader, +} from '@backstage/frontend-plugin-api'; +import { ThemeBlueprint } from '@backstage/plugin-app-react'; import { AppRouter, FlatRoutes } from '@backstage/core-app-api'; import { CatalogGraphPage } from '@backstage/plugin-catalog-graph'; -import { RequirePermission } from '@backstage/plugin-permission-react'; -import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha'; - -import { BCCTestPage } from '@red-hat-developer-hub/backstage-plugin-bcc-test'; -import { BUITestPage } from '@red-hat-developer-hub/backstage-plugin-bui-test'; -import { MUI4TestPage } from '@red-hat-developer-hub/backstage-plugin-mui4-test'; -import { MUI5TestPage } from '@red-hat-developer-hub/backstage-plugin-mui5-test'; +import { BCCTestPageComponent } from '@red-hat-developer-hub/backstage-plugin-bcc-test'; +import { BUITestPageComponent } from '@red-hat-developer-hub/backstage-plugin-bui-test'; +import { MUI4TestPageComponent } from '@red-hat-developer-hub/backstage-plugin-mui4-test'; +import { MUI5TestPageComponent } from '@red-hat-developer-hub/backstage-plugin-mui5-test'; import { getAllThemes } from '@red-hat-developer-hub/backstage-plugin-theme'; +import { navModule } from './modules'; -const app = createApp({ - apis, - bindRoutes({ bind }) { - bind(catalogPlugin.externalRoutes, { - createComponent: scaffolderPlugin.routes.root, - viewTechDoc: techdocsPlugin.routes.docRoot, - createFromTemplate: scaffolderPlugin.routes.selectedTemplate, - }); - bind(apiDocsPlugin.externalRoutes, { - registerApi: catalogImportPlugin.routes.importPage, - }); - bind(scaffolderPlugin.externalRoutes, { - registerComponent: catalogImportPlugin.routes.importPage, - viewTechDoc: techdocsPlugin.routes.docRoot, - }); - bind(orgPlugin.externalRoutes, { - catalogIndex: catalogPlugin.routes.catalogIndex, - }); - }, - components: { - SignInPage: props => , - }, - themes: getAllThemes(), +/** + * RHDH themes as NFS extensions (ThemeBlueprint). + * Only the app can register ThemeBlueprint; we use the same theme definitions + * from the theme plugin (getAllThemes()) so behavior matches the legacy app. + */ +const rhdhThemeExtensions = getAllThemes().map(appTheme => + ThemeBlueprint.make({ + name: appTheme.id, + params: { + theme: { + id: appTheme.id, + title: appTheme.title, + variant: appTheme.variant, + icon: appTheme.icon, + Provider: appTheme.Provider, + }, + }, + }), +); + +const rhdhThemeModule = createFrontendModule({ + pluginId: 'app', + extensions: rhdhThemeExtensions, }); -const routes = ( - - } /> - } /> - } - > - {entityPage} - - } /> - } - > - - - - - } /> - } /> - - - - } - /> - }> - {searchPage} - - } /> - } /> - } /> - } /> - } /> - } /> - -); +const homeRouteModule = createFrontendModule({ + pluginId: 'app', + extensions: [ + PageBlueprint.make({ + name: 'catalog-alias', + params: { + path: '/catalog', + loader: async () => , + }, + }), + ], +}); + +const testPagesModule = createFrontendModule({ + pluginId: 'app', + extensions: [ + PageBlueprint.make({ + name: 'bcc-tests-direct', + params: { + path: '/bcc-tests', + loader: async () => , + }, + }), + PageBlueprint.make({ + name: 'bui-tests-direct', + params: { + path: '/bui-tests', + loader: async () => , + }, + }), + PageBlueprint.make({ + name: 'mui4-tests-direct', + params: { + path: '/mui4-tests', + loader: async () => , + }, + }), + PageBlueprint.make({ + name: 'mui5-tests-direct', + params: { + path: '/mui5-tests', + loader: async () => , + }, + }), + ], +}); -export default app.createRoot( +// Routes are parsed by convertLegacyApp to register NFS page extensions. convertLegacyApp +// requires a "root" element that wraps FlatRoutes (it looks for AppRouter -> root -> FlatRoutes). +const legacyRootElement = ( <> - {routes} +
+ + } /> + } + > + {entityPage} + + } /> + } + > + + + + + } /> + } /> + {/* Top-level element must be a plugin component for convertLegacyApp */} + } /> + }> + {searchPage} + + } /> + } /> + +
- , + ); + +const app = createApp({ + features: [ + rhdhThemeModule, + ...(convertLegacyApp(legacyRootElement) as unknown as ( + | FrontendFeature + | FrontendFeatureLoader + )[]), + homeRouteModule, + navModule, + testPagesModule, + ], +}); + +export default app.createRoot(); diff --git a/workspaces/theme/packages/app/src/components/Root/LogoFull.tsx b/workspaces/theme/packages/app/src/components/Root/LogoFull.tsx index c7536520e7..939a665bc8 100644 --- a/workspaces/theme/packages/app/src/components/Root/LogoFull.tsx +++ b/workspaces/theme/packages/app/src/components/Root/LogoFull.tsx @@ -36,7 +36,7 @@ const LogoFull = () => { > ); diff --git a/workspaces/theme/packages/app/src/components/Root/LogoIcon.tsx b/workspaces/theme/packages/app/src/components/Root/LogoIcon.tsx index 5d0ff212c8..441566c0cc 100644 --- a/workspaces/theme/packages/app/src/components/Root/LogoIcon.tsx +++ b/workspaces/theme/packages/app/src/components/Root/LogoIcon.tsx @@ -37,7 +37,7 @@ const LogoIcon = () => { > ); diff --git a/workspaces/theme/packages/app/src/components/Root/Root.tsx b/workspaces/theme/packages/app/src/components/Root/Root.tsx index 18198b3a66..05fdaa4df2 100644 --- a/workspaces/theme/packages/app/src/components/Root/Root.tsx +++ b/workspaces/theme/packages/app/src/components/Root/Root.tsx @@ -81,8 +81,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => ( }> - {/* Global nav, not org-specific */} - + ) => ( - {/* End global nav */} - - {/* Items in this group will be scrollable if they run out of space */} - + diff --git a/workspaces/theme/packages/app/src/components/catalog/EntityPage.tsx b/workspaces/theme/packages/app/src/components/catalog/EntityPage.tsx index f82362c31c..aab4738bce 100644 --- a/workspaces/theme/packages/app/src/components/catalog/EntityPage.tsx +++ b/workspaces/theme/packages/app/src/components/catalog/EntityPage.tsx @@ -83,16 +83,7 @@ const techdocsContent = ( ); const cicdContent = ( - // This is an example of how you can implement your company's logic in entity page. - // You can for example enforce that all components of type 'service' should use GitHubActions - {/* - Here you can add support for different CI/CD services, for example - using @backstage-community/plugin-github-actions as follows: - - - - */} - @@ -129,7 +119,6 @@ const entityWarningContent = ( - @@ -149,7 +138,6 @@ const overviewContent = ( - @@ -164,11 +152,9 @@ const serviceEntityPage = ( {overviewContent} - {cicdContent} - - @@ -187,7 +172,6 @@ const serviceEntityPage = ( - @@ -198,7 +182,6 @@ const serviceEntityPage = ( - {techdocsContent} @@ -210,11 +193,9 @@ const websiteEntityPage = ( {overviewContent} - {cicdContent} - - @@ -233,26 +213,17 @@ const websiteEntityPage = ( - {techdocsContent} ); -/** - * NOTE: This page is designed to work on small screens such as mobile devices. - * This is based on Material UI Grid. If breakpoints are used, each grid item must set the `xs` prop to a column size or to `true`, - * since this does not default. If no breakpoints are used, the items will equitably share the available space. - * https://material-ui.com/components/grid/#basic-grid. - */ - const defaultEntityPage = ( {overviewContent} - {techdocsContent} @@ -264,11 +235,9 @@ const componentPage = ( {serviceEntityPage} - {websiteEntityPage} - {defaultEntityPage} ); @@ -297,7 +266,6 @@ const apiPage = ( - @@ -420,7 +388,6 @@ export const entityPage = ( - {defaultEntityPage} ); diff --git a/workspaces/theme/packages/app/src/components/search/SearchPage.tsx b/workspaces/theme/packages/app/src/components/search/SearchPage.tsx index 008fc1619a..1518e8f95f 100644 --- a/workspaces/theme/packages/app/src/components/search/SearchPage.tsx +++ b/workspaces/theme/packages/app/src/components/search/SearchPage.tsx @@ -94,7 +94,6 @@ const SearchPage = () => { label="Entity" name="name" values={async () => { - // Return a list of entities which are documented. const { items } = await catalogApi.getEntities({ fields: ['metadata.name'], filter: { @@ -102,7 +101,6 @@ const SearchPage = () => { CATALOG_FILTER_EXISTS, }, }); - const names = items.map(entity => entity.metadata.name); names.sort(); return names; diff --git a/workspaces/theme/packages/app/src/index.tsx b/workspaces/theme/packages/app/src/index.tsx index 631b76a44d..749de9dbf2 100644 --- a/workspaces/theme/packages/app/src/index.tsx +++ b/workspaces/theme/packages/app/src/index.tsx @@ -16,7 +16,7 @@ import '@backstage/cli/asset-types'; import ReactDOM from 'react-dom/client'; -import App from './App'; +import app from './App'; import '@backstage/ui/css/styles.css'; -ReactDOM.createRoot(document.getElementById('root')!).render(); +ReactDOM.createRoot(document.getElementById('root')!).render(app); diff --git a/workspaces/theme/packages/app/src/modules/index.ts b/workspaces/theme/packages/app/src/modules/index.ts new file mode 100644 index 0000000000..1e921ce4d0 --- /dev/null +++ b/workspaces/theme/packages/app/src/modules/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 permissions and limitations under the License. + */ + +import { navModule } from './nav'; + +export { navModule }; diff --git a/workspaces/theme/packages/app/src/modules/nav/LogoFull.tsx b/workspaces/theme/packages/app/src/modules/nav/LogoFull.tsx new file mode 100644 index 0000000000..6f29b25288 --- /dev/null +++ b/workspaces/theme/packages/app/src/modules/nav/LogoFull.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 permissions and limitations under the License. + */ + +import { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + width: 'auto', + height: 30, + }, + path: { + fill: '#7df3e1', + }, +}); + +const LogoFull = () => { + const classes = useStyles(); + + return ( + + + + ); +}; + +export default LogoFull; diff --git a/workspaces/theme/packages/app/src/modules/nav/LogoIcon.tsx b/workspaces/theme/packages/app/src/modules/nav/LogoIcon.tsx new file mode 100644 index 0000000000..48b3d1d82b --- /dev/null +++ b/workspaces/theme/packages/app/src/modules/nav/LogoIcon.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 permissions and limitations under the License. + */ + +import { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + width: 'auto', + height: 28, + }, + path: { + fill: '#7df3e1', + }, +}); + +const LogoIcon = () => { + const classes = useStyles(); + + return ( + + + + ); +}; + +export default LogoIcon; diff --git a/workspaces/theme/packages/app/src/modules/nav/Sidebar.tsx b/workspaces/theme/packages/app/src/modules/nav/Sidebar.tsx new file mode 100644 index 0000000000..c26af171ce --- /dev/null +++ b/workspaces/theme/packages/app/src/modules/nav/Sidebar.tsx @@ -0,0 +1,89 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 permissions and limitations under the License. + */ + +import { + Sidebar, + SidebarDivider, + SidebarGroup, + SidebarItem, + SidebarScrollWrapper, + SidebarSpace, +} from '@backstage/core-components'; +import { compatWrapper } from '@backstage/core-compat-api'; +import { + Settings as SidebarSettings, + UserSettingsSignInAvatar, +} from '@backstage/plugin-user-settings'; +import { SidebarSearchModal } from '@backstage/plugin-search'; +import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; +import ExtensionIcon from '@material-ui/icons/Extension'; +import HomeIcon from '@material-ui/icons/Home'; +import LibraryBooks from '@material-ui/icons/LibraryBooks'; +import MenuIcon from '@material-ui/icons/Menu'; +import SearchIcon from '@material-ui/icons/Search'; +import { MyGroupsSidebarItem } from '@backstage/plugin-org'; +import GroupIcon from '@material-ui/icons/People'; +import { SidebarLogo } from './SidebarLogo'; + +/** + * Custom nav content for the app sidebar (NavContentBlueprint). + * Receives `items` from the app (resolved nav items from page extensions); + * we render a fixed sidebar structure. + */ +export const SidebarContent = () => + compatWrapper( + + + } to="/search"> + + + + }> + + + + + + + + + + + + + + + + } + to="/settings" + > + + + , + ); diff --git a/workspaces/theme/packages/app/src/modules/nav/SidebarLogo.tsx b/workspaces/theme/packages/app/src/modules/nav/SidebarLogo.tsx new file mode 100644 index 0000000000..91960d8bb3 --- /dev/null +++ b/workspaces/theme/packages/app/src/modules/nav/SidebarLogo.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 permissions and limitations under the License. + */ + +import { + Link, + sidebarConfig, + useSidebarOpenState, +} from '@backstage/core-components'; +import { makeStyles } from '@material-ui/core'; +import LogoFull from './LogoFull'; +import LogoIcon from './LogoIcon'; + +const useSidebarLogoStyles = makeStyles({ + root: { + width: sidebarConfig.drawerWidthClosed, + height: 3 * sidebarConfig.logoHeight, + display: 'flex', + flexFlow: 'row nowrap', + alignItems: 'center', + marginBottom: -14, + }, + link: { + width: sidebarConfig.drawerWidthClosed, + marginLeft: 24, + }, +}); + +export const SidebarLogo = () => { + const classes = useSidebarLogoStyles(); + const { isOpen } = useSidebarOpenState(); + const sidebarWidth = isOpen + ? sidebarConfig.drawerWidthOpen + : sidebarConfig.drawerWidthClosed; + + return ( +
+ + {isOpen ? : } + +
+ ); +}; diff --git a/workspaces/theme/packages/app/src/modules/nav/index.ts b/workspaces/theme/packages/app/src/modules/nav/index.ts new file mode 100644 index 0000000000..b766e35104 --- /dev/null +++ b/workspaces/theme/packages/app/src/modules/nav/index.ts @@ -0,0 +1,29 @@ +/* + * Copyright Red Hat, Inc. + * + * 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 permissions and limitations under the License. + */ + +import { createFrontendModule } from '@backstage/frontend-plugin-api'; +import { NavContentBlueprint } from '@backstage/plugin-app-react'; +import { SidebarContent } from './Sidebar'; + +export const navModule = createFrontendModule({ + pluginId: 'app', + extensions: [ + NavContentBlueprint.make({ + params: { + component: SidebarContent, + }, + }), + ], +}); diff --git a/workspaces/theme/packages/backend/package.json b/workspaces/theme/packages/backend/package.json index d639ca0990..3d1235a5a0 100644 --- a/workspaces/theme/packages/backend/package.json +++ b/workspaces/theme/packages/backend/package.json @@ -21,7 +21,7 @@ "build-image": "docker build ../.. -f Dockerfile --tag backstage" }, "dependencies": { - "@backstage/backend-defaults": "^0.13.2", + "@backstage/backend-defaults": "^0.14.0", "@backstage/config": "^1.3.6", "@backstage/plugin-app-backend": "^0.5.8", "@backstage/plugin-auth-backend": "^0.25.6", diff --git a/workspaces/theme/plugins/bcc-test/report.api.md b/workspaces/theme/plugins/bcc-test/report.api.md index f1097c6bf3..1fb1dffcca 100644 --- a/workspaces/theme/plugins/bcc-test/report.api.md +++ b/workspaces/theme/plugins/bcc-test/report.api.md @@ -11,6 +11,9 @@ import { RouteRef } from '@backstage/core-plugin-api'; // @public (undocumented) export const BCCTestPage: () => JSX_2.Element; +// @public (undocumented) +export const BCCTestPageComponent: () => JSX_2.Element; + // @public (undocumented) export const bccTestPlugin: BackstagePlugin< { root: RouteRef; diff --git a/workspaces/theme/plugins/bcc-test/src/index.ts b/workspaces/theme/plugins/bcc-test/src/index.ts index 19c7467138..85a845eed7 100644 --- a/workspaces/theme/plugins/bcc-test/src/index.ts +++ b/workspaces/theme/plugins/bcc-test/src/index.ts @@ -22,3 +22,4 @@ ClassNameGenerator.configure(componentName => { }); export * from './plugin'; +export { BCCTestPage as BCCTestPageComponent } from './components/BCCTestPage'; diff --git a/workspaces/theme/plugins/bui-test/report.api.md b/workspaces/theme/plugins/bui-test/report.api.md index 5d32de7916..c760d0c5f6 100644 --- a/workspaces/theme/plugins/bui-test/report.api.md +++ b/workspaces/theme/plugins/bui-test/report.api.md @@ -11,6 +11,9 @@ import { RouteRef } from '@backstage/core-plugin-api'; // @public (undocumented) export const BUITestPage: () => JSX_2.Element; +// @public (undocumented) +export const BUITestPageComponent: () => JSX_2.Element; + // @public (undocumented) export const buiTestPlugin: BackstagePlugin< { root: RouteRef; diff --git a/workspaces/theme/plugins/bui-test/src/index.ts b/workspaces/theme/plugins/bui-test/src/index.ts index facae3037e..c4fc60108e 100644 --- a/workspaces/theme/plugins/bui-test/src/index.ts +++ b/workspaces/theme/plugins/bui-test/src/index.ts @@ -14,3 +14,4 @@ * limitations under the License. */ export * from './plugin'; +export { BUITestPage as BUITestPageComponent } from './components/BUITestPage'; diff --git a/workspaces/theme/plugins/mui4-test/report.api.md b/workspaces/theme/plugins/mui4-test/report.api.md index 44033e93a0..1852a44ac6 100644 --- a/workspaces/theme/plugins/mui4-test/report.api.md +++ b/workspaces/theme/plugins/mui4-test/report.api.md @@ -11,6 +11,9 @@ import { RouteRef } from '@backstage/core-plugin-api'; // @public (undocumented) export const MUI4TestPage: () => JSX_2.Element; +// @public (undocumented) +export const MUI4TestPageComponent: () => JSX_2.Element; + // @public (undocumented) export const mui4TestPlugin: BackstagePlugin< { root: RouteRef; diff --git a/workspaces/theme/plugins/mui4-test/src/index.ts b/workspaces/theme/plugins/mui4-test/src/index.ts index 19c7467138..242fe5fa94 100644 --- a/workspaces/theme/plugins/mui4-test/src/index.ts +++ b/workspaces/theme/plugins/mui4-test/src/index.ts @@ -22,3 +22,4 @@ ClassNameGenerator.configure(componentName => { }); export * from './plugin'; +export { MUI4TestPage as MUI4TestPageComponent } from './components/MUI4TestPage'; diff --git a/workspaces/theme/plugins/mui5-test/report.api.md b/workspaces/theme/plugins/mui5-test/report.api.md index 8167d95ff4..15c9550a28 100644 --- a/workspaces/theme/plugins/mui5-test/report.api.md +++ b/workspaces/theme/plugins/mui5-test/report.api.md @@ -11,6 +11,9 @@ import { RouteRef } from '@backstage/core-plugin-api'; // @public (undocumented) export const MUI5TestPage: () => JSX_2.Element; +// @public (undocumented) +export const MUI5TestPageComponent: () => JSX_2.Element; + // @public (undocumented) export const mui5TestPlugin: BackstagePlugin< { root: RouteRef; diff --git a/workspaces/theme/plugins/mui5-test/src/index.ts b/workspaces/theme/plugins/mui5-test/src/index.ts index 19c7467138..3b108ca46b 100644 --- a/workspaces/theme/plugins/mui5-test/src/index.ts +++ b/workspaces/theme/plugins/mui5-test/src/index.ts @@ -22,3 +22,4 @@ ClassNameGenerator.configure(componentName => { }); export * from './plugin'; +export { MUI5TestPage as MUI5TestPageComponent } from './components/MUI5TestPage'; diff --git a/workspaces/theme/yarn.lock b/workspaces/theme/yarn.lock index f8d56f27d2..9c478ebe15 100644 --- a/workspaces/theme/yarn.lock +++ b/workspaces/theme/yarn.lock @@ -1813,7 +1813,7 @@ __metadata: languageName: node linkType: hard -"@backstage/backend-app-api@npm:^1.3.0, @backstage/backend-app-api@npm:^1.4.0": +"@backstage/backend-app-api@npm:^1.4.0": version: 1.4.0 resolution: "@backstage/backend-app-api@npm:1.4.0" dependencies: @@ -1824,90 +1824,6 @@ __metadata: languageName: node linkType: hard -"@backstage/backend-defaults@npm:^0.13.2": - version: 0.13.2 - resolution: "@backstage/backend-defaults@npm:0.13.2" - dependencies: - "@aws-sdk/abort-controller": "npm:^3.347.0" - "@aws-sdk/client-codecommit": "npm:^3.350.0" - "@aws-sdk/client-s3": "npm:^3.350.0" - "@aws-sdk/credential-providers": "npm:^3.350.0" - "@aws-sdk/types": "npm:^3.347.0" - "@azure/storage-blob": "npm:^12.5.0" - "@backstage/backend-app-api": "npm:^1.3.0" - "@backstage/backend-dev-utils": "npm:^0.1.5" - "@backstage/backend-plugin-api": "npm:^1.5.0" - "@backstage/cli-node": "npm:^0.2.15" - "@backstage/config": "npm:^1.3.6" - "@backstage/config-loader": "npm:^1.10.6" - "@backstage/errors": "npm:^1.2.7" - "@backstage/integration": "npm:^1.18.2" - "@backstage/integration-aws-node": "npm:^0.1.19" - "@backstage/plugin-auth-node": "npm:^0.6.9" - "@backstage/plugin-events-node": "npm:^0.4.17" - "@backstage/plugin-permission-node": "npm:^0.10.6" - "@backstage/types": "npm:^1.2.2" - "@google-cloud/storage": "npm:^7.0.0" - "@keyv/memcache": "npm:^2.0.1" - "@keyv/redis": "npm:^4.0.1" - "@keyv/valkey": "npm:^1.0.1" - "@manypkg/get-packages": "npm:^1.1.3" - "@octokit/rest": "npm:^19.0.3" - "@opentelemetry/api": "npm:^1.9.0" - "@types/cors": "npm:^2.8.6" - "@types/express": "npm:^4.17.6" - archiver: "npm:^7.0.0" - base64-stream: "npm:^1.0.0" - better-sqlite3: "npm:^12.0.0" - compression: "npm:^1.7.4" - concat-stream: "npm:^2.0.0" - cookie: "npm:^0.7.0" - cors: "npm:^2.8.5" - cron: "npm:^3.0.0" - express: "npm:^4.17.1" - express-promise-router: "npm:^4.1.0" - express-rate-limit: "npm:^7.5.0" - fs-extra: "npm:^11.2.0" - git-url-parse: "npm:^15.0.0" - helmet: "npm:^6.0.0" - infinispan: "npm:^0.12.0" - is-glob: "npm:^4.0.3" - jose: "npm:^5.0.0" - keyv: "npm:^5.2.1" - knex: "npm:^3.0.0" - lodash: "npm:^4.17.21" - logform: "npm:^2.3.2" - luxon: "npm:^3.0.0" - minimatch: "npm:^9.0.0" - mysql2: "npm:^3.0.0" - node-fetch: "npm:^2.7.0" - node-forge: "npm:^1.3.1" - p-limit: "npm:^3.1.0" - path-to-regexp: "npm:^8.0.0" - pg: "npm:^8.11.3" - pg-connection-string: "npm:^2.3.0" - pg-format: "npm:^1.0.4" - rate-limit-redis: "npm:^4.2.0" - raw-body: "npm:^2.4.1" - selfsigned: "npm:^2.0.0" - tar: "npm:^6.1.12" - triple-beam: "npm:^1.4.1" - uuid: "npm:^11.0.0" - winston: "npm:^3.2.1" - winston-transport: "npm:^4.5.0" - yauzl: "npm:^3.0.0" - yn: "npm:^4.0.0" - zod: "npm:^3.22.4" - zod-to-json-schema: "npm:^3.20.4" - peerDependencies: - "@google-cloud/cloud-sql-connector": ^1.4.0 - peerDependenciesMeta: - "@google-cloud/cloud-sql-connector": - optional: true - checksum: 10c0/a84ca97b47282817be8fa26359c90f9b3dddc4c0d9f603c364d8a2e4aeeaf4e2bf38c0b5e0e1d883c5c0d15e20c52d469ddae2f896fe7453723a61f129a18465 - languageName: node - linkType: hard - "@backstage/backend-defaults@npm:^0.14.0": version: 0.14.0 resolution: "@backstage/backend-defaults@npm:0.14.0" @@ -1994,7 +1910,7 @@ __metadata: languageName: node linkType: hard -"@backstage/backend-dev-utils@npm:^0.1.5, @backstage/backend-dev-utils@npm:^0.1.6": +"@backstage/backend-dev-utils@npm:^0.1.6": version: 0.1.6 resolution: "@backstage/backend-dev-utils@npm:0.1.6" checksum: 10c0/5b473d550b9d38d2cd6c08255a59739a6d8ecfb1df80a287d2fc1575b3f8b83359426f6fb45760682e0ea4bf3e19ebae0560df23e61da706142857011a3216d6 @@ -2263,7 +2179,7 @@ __metadata: languageName: node linkType: hard -"@backstage/config@npm:^1.3.6": +"@backstage/config@npm:^1.2.0, @backstage/config@npm:^1.3.6": version: 1.3.6 resolution: "@backstage/config@npm:1.3.6" dependencies: @@ -2274,14 +2190,14 @@ __metadata: languageName: node linkType: hard -"@backstage/core-app-api@npm:^1.19.2, @backstage/core-app-api@npm:^1.19.3": - version: 1.19.3 - resolution: "@backstage/core-app-api@npm:1.19.3" +"@backstage/core-app-api@npm:^1.19.2, @backstage/core-app-api@npm:^1.19.3, @backstage/core-app-api@npm:^1.19.4": + version: 1.19.5 + resolution: "@backstage/core-app-api@npm:1.19.5" dependencies: "@backstage/config": "npm:^1.3.6" - "@backstage/core-plugin-api": "npm:^1.12.1" + "@backstage/core-plugin-api": "npm:^1.12.3" "@backstage/types": "npm:^1.2.2" - "@backstage/version-bridge": "npm:^1.0.11" + "@backstage/version-bridge": "npm:^1.0.12" "@types/prop-types": "npm:^15.7.3" history: "npm:^5.0.0" i18next: "npm:^22.4.15" @@ -2289,16 +2205,32 @@ __metadata: prop-types: "npm:^15.7.2" react-use: "npm:^17.2.4" zen-observable: "npm:^0.10.0" - zod: "npm:^3.22.4" + zod: "npm:^3.25.76" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.3.0 + react-router-dom: ^6.30.2 peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/d28768accf10433610b103fc66431997e860628503db9ebba1aacbed1fcfaff6dadedc20090a098b9b1c4b1871e86b5b24d94147af12c1fb98088ed203eae063 + checksum: 10c0/545dbcf178ca4b7517eec0792dc6d54ac5ac72f87ac71faae6c345b074e6883c364877346478d4ab6939ec840f5b4f039b9cba5869238ca21d12cb635d3a8444 + languageName: node + linkType: hard + +"@backstage/core-compat-api@npm:^0.2.0": + version: 0.2.8 + resolution: "@backstage/core-compat-api@npm:0.2.8" + dependencies: + "@backstage/core-plugin-api": "npm:^1.9.3" + "@backstage/frontend-plugin-api": "npm:^0.7.0" + "@backstage/version-bridge": "npm:^1.0.8" + "@types/react": "npm:^16.13.1 || ^17.0.0" + lodash: "npm:^4.17.21" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: 10c0/0f497f61c46da9bdf061c058ab20aa59ab74e25623d18930a2a8f461daeea6d49f93e0c7647efab87cbe84ccf6308be314088cd0ee50c286fd5db7218507815a languageName: node linkType: hard @@ -2325,15 +2257,64 @@ __metadata: languageName: node linkType: hard -"@backstage/core-components@npm:^0.18.3, @backstage/core-components@npm:^0.18.4": - version: 0.18.4 - resolution: "@backstage/core-components@npm:0.18.4" +"@backstage/core-components@npm:^0.14.10": + version: 0.14.10 + resolution: "@backstage/core-components@npm:0.14.10" + dependencies: + "@backstage/config": "npm:^1.2.0" + "@backstage/core-plugin-api": "npm:^1.9.3" + "@backstage/errors": "npm:^1.2.4" + "@backstage/theme": "npm:^0.5.6" + "@backstage/version-bridge": "npm:^1.0.8" + "@date-io/core": "npm:^1.3.13" + "@material-table/core": "npm:^3.1.0" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@react-hookz/web": "npm:^24.0.0" + "@types/react": "npm:^16.13.1 || ^17.0.0 || ^18.0.0" + "@types/react-sparklines": "npm:^1.7.0" + ansi-regex: "npm:^6.0.1" + classnames: "npm:^2.2.6" + d3-selection: "npm:^3.0.0" + d3-shape: "npm:^3.0.0" + d3-zoom: "npm:^3.0.0" + dagre: "npm:^0.8.5" + linkify-react: "npm:4.1.3" + linkifyjs: "npm:4.1.3" + lodash: "npm:^4.17.21" + pluralize: "npm:^8.0.0" + qs: "npm:^6.9.4" + rc-progress: "npm:3.5.1" + react-helmet: "npm:6.1.0" + react-hook-form: "npm:^7.12.2" + react-idle-timer: "npm:5.7.2" + react-markdown: "npm:^8.0.0" + react-sparklines: "npm:^1.7.0" + react-syntax-highlighter: "npm:^15.4.5" + react-use: "npm:^17.3.2" + react-virtualized-auto-sizer: "npm:^1.0.11" + react-window: "npm:^1.8.6" + remark-gfm: "npm:^3.0.1" + zen-observable: "npm:^0.10.0" + zod: "npm:^3.22.4" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: 10c0/5afb8394e254e6ded61dd87addbf298059e3393ee2bc1532193109d469c843bb434469ba888b6b07fe5381360e2f10b6d9e4d35a7625b1e8fc3a3c7fcf8036db + languageName: node + linkType: hard + +"@backstage/core-components@npm:^0.18.3, @backstage/core-components@npm:^0.18.4, @backstage/core-components@npm:^0.18.6": + version: 0.18.7 + resolution: "@backstage/core-components@npm:0.18.7" dependencies: "@backstage/config": "npm:^1.3.6" - "@backstage/core-plugin-api": "npm:^1.12.1" + "@backstage/core-plugin-api": "npm:^1.12.3" "@backstage/errors": "npm:^1.2.7" - "@backstage/theme": "npm:^0.7.1" - "@backstage/version-bridge": "npm:^1.0.11" + "@backstage/theme": "npm:^0.7.2" + "@backstage/version-bridge": "npm:^1.0.12" "@dagrejs/dagre": "npm:^1.1.4" "@date-io/core": "npm:^1.3.13" "@material-table/core": "npm:^3.1.0" @@ -2352,6 +2333,7 @@ __metadata: linkify-react: "npm:4.3.2" linkifyjs: "npm:4.3.2" lodash: "npm:^4.17.21" + parse5: "npm:^6.0.0" pluralize: "npm:^8.0.0" qs: "npm:^6.9.4" rc-progress: "npm:3.5.1" @@ -2365,41 +2347,43 @@ __metadata: react-use: "npm:^17.3.2" react-virtualized-auto-sizer: "npm:^1.0.11" react-window: "npm:^1.8.6" + rehype-raw: "npm:^6.0.0" + rehype-sanitize: "npm:^5.0.0" remark-gfm: "npm:^3.0.1" zen-observable: "npm:^0.10.0" - zod: "npm:^3.22.4" + zod: "npm:^3.25.76" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.3.0 + react-router-dom: ^6.30.2 peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/621f6abb6cc51240cfb25c98bd0c1bc9b5c15bcddda97fcc39e4552ae683abbe71778cb9bb39afd29a6f776e0503262fd12828f903e1b73ad74a3030628024fd + checksum: 10c0/c1a826b5e763de7d64c74fc15a1a5e7e9fab3cd5e12de257d749b372f759e2420c511390ad0dcfcb81491acac5a04212fa30941ff01845cf8984895d3350d331 languageName: node linkType: hard -"@backstage/core-plugin-api@npm:^1.12.0, @backstage/core-plugin-api@npm:^1.12.1": - version: 1.12.1 - resolution: "@backstage/core-plugin-api@npm:1.12.1" +"@backstage/core-plugin-api@npm:^1.12.0, @backstage/core-plugin-api@npm:^1.12.1, @backstage/core-plugin-api@npm:^1.12.2, @backstage/core-plugin-api@npm:^1.12.3, @backstage/core-plugin-api@npm:^1.9.3": + version: 1.12.3 + resolution: "@backstage/core-plugin-api@npm:1.12.3" dependencies: "@backstage/config": "npm:^1.3.6" "@backstage/errors": "npm:^1.2.7" - "@backstage/frontend-plugin-api": "npm:^0.13.2" + "@backstage/frontend-plugin-api": "npm:^0.14.0" "@backstage/types": "npm:^1.2.2" - "@backstage/version-bridge": "npm:^1.0.11" + "@backstage/version-bridge": "npm:^1.0.12" history: "npm:^5.0.0" - zod: "npm:^3.22.4" + zod: "npm:^3.25.76" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.3.0 + react-router-dom: ^6.30.2 peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/c0309caf08c62c282e9ff60acd433d66511055d5b1bc85360d69f7d5f2b5bb40b71e62c6bc9a57b3bff0bf069041eb48b70f81389f99ba13b1768313063fa276 + checksum: 10c0/ed81d3ac4a4d6d893672d76fff6d4764afde7550ff05707320d855e3495051f8eaeaf491b06a61c6efbeff1bdfe436604ee0fbd8f5dcb0d7445df505361b6abf languageName: node linkType: hard @@ -2446,7 +2430,7 @@ __metadata: languageName: node linkType: hard -"@backstage/errors@npm:^1.2.7": +"@backstage/errors@npm:^1.2.4, @backstage/errors@npm:^1.2.7": version: 1.2.7 resolution: "@backstage/errors@npm:1.2.7" dependencies: @@ -2492,16 +2476,42 @@ __metadata: languageName: node linkType: hard -"@backstage/frontend-defaults@npm:^0.3.4": - version: 0.3.4 - resolution: "@backstage/frontend-defaults@npm:0.3.4" +"@backstage/frontend-app-api@npm:^0.14.1": + version: 0.14.1 + resolution: "@backstage/frontend-app-api@npm:0.14.1" dependencies: "@backstage/config": "npm:^1.3.6" - "@backstage/core-components": "npm:^0.18.4" + "@backstage/core-app-api": "npm:^1.19.4" + "@backstage/core-plugin-api": "npm:^1.12.2" "@backstage/errors": "npm:^1.2.7" - "@backstage/frontend-app-api": "npm:^0.13.3" - "@backstage/frontend-plugin-api": "npm:^0.13.2" - "@backstage/plugin-app": "npm:^0.3.3" + "@backstage/frontend-defaults": "npm:^0.3.6" + "@backstage/frontend-plugin-api": "npm:^0.13.4" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.11" + lodash: "npm:^4.17.21" + zod: "npm:^3.25.76" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.3.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/ebd55a914db7fd08315b59656c24d20becd9d4ee772b6ef93c9ed07239bef028078fd74636c8ff2b7ea61d283013002d918e44ee956b11bd64365dda26309f50 + languageName: node + linkType: hard + +"@backstage/frontend-defaults@npm:^0.3.0, @backstage/frontend-defaults@npm:^0.3.4, @backstage/frontend-defaults@npm:^0.3.6": + version: 0.3.6 + resolution: "@backstage/frontend-defaults@npm:0.3.6" + dependencies: + "@backstage/config": "npm:^1.3.6" + "@backstage/core-components": "npm:^0.18.6" + "@backstage/errors": "npm:^1.2.7" + "@backstage/frontend-app-api": "npm:^0.14.1" + "@backstage/frontend-plugin-api": "npm:^0.13.4" + "@backstage/plugin-app": "npm:^0.3.5" "@react-hookz/web": "npm:^24.0.0" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -2511,19 +2521,19 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/f9e9153604c498dbee7695f2a1ddefe6fde4caf1a7769f6e8bb268d333eefec7a0d86737fb432e59d440f41d91cecb25062fd5e20f00bb640ea5144f9bbaf662 + checksum: 10c0/dbb774da769fed52e343124b01d198e4a20544d621f81f661078bc5765cf3eca5e4a31ef1c0a6091087e2a1920253318e4801084895d3d589c5abc8610307e06 languageName: node linkType: hard -"@backstage/frontend-plugin-api@npm:^0.13.2": - version: 0.13.2 - resolution: "@backstage/frontend-plugin-api@npm:0.13.2" +"@backstage/frontend-plugin-api@npm:^0.13.0, @backstage/frontend-plugin-api@npm:^0.13.2, @backstage/frontend-plugin-api@npm:^0.13.3, @backstage/frontend-plugin-api@npm:^0.13.4": + version: 0.13.4 + resolution: "@backstage/frontend-plugin-api@npm:0.13.4" dependencies: "@backstage/errors": "npm:^1.2.7" "@backstage/types": "npm:^1.2.2" "@backstage/version-bridge": "npm:^1.0.11" - zod: "npm:^3.22.4" - zod-to-json-schema: "npm:^3.21.4" + zod: "npm:^3.25.76" + zod-to-json-schema: "npm:^3.25.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -2532,7 +2542,48 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/d2152b57cb1de644f4f09c092b2db6aa22c388436983c0ac11262e8e206bf0c509845d672eaa638cdfcd989a53092858a5e943c109ff38b0b0a8c7167c153059 + checksum: 10c0/0e7375c3abb20cc849c00f5013b33e05032fce83e3758affa20ece8075904778f430cf6bfdf77ead3fae3a0c492a6e299e1c98dbc7ba7952ee9c19033b36fcc4 + languageName: node + linkType: hard + +"@backstage/frontend-plugin-api@npm:^0.14.0": + version: 0.14.1 + resolution: "@backstage/frontend-plugin-api@npm:0.14.1" + dependencies: + "@backstage/errors": "npm:^1.2.7" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + zod: "npm:^3.25.76" + zod-to-json-schema: "npm:^3.25.1" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/f25e216e6d10354c27cb90bb65e09aa0d9c6f3ba11fd29214833ddb59d45225e1893eb72637107d858490edde14ea97e31657525bc2f3d5a50d526dfc5dbcaa9 + languageName: node + linkType: hard + +"@backstage/frontend-plugin-api@npm:^0.7.0": + version: 0.7.0 + resolution: "@backstage/frontend-plugin-api@npm:0.7.0" + dependencies: + "@backstage/core-components": "npm:^0.14.10" + "@backstage/core-plugin-api": "npm:^1.9.3" + "@backstage/types": "npm:^1.1.1" + "@backstage/version-bridge": "npm:^1.0.8" + "@material-ui/core": "npm:^4.12.4" + "@types/react": "npm:^16.13.1 || ^17.0.0 || ^18.0.0" + lodash: "npm:^4.17.21" + zod: "npm:^3.22.4" + zod-to-json-schema: "npm:^3.21.4" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: 10c0/cad642587a8eb4f9dec6cd743e4e93c9b90d5269c8cd90f4ffe637d2b1e2c25f1cdee4ccc9659de1e19f08872acbe0b04e200812aaced0c57d6f3682d2bbf765 languageName: node linkType: hard @@ -2576,30 +2627,30 @@ __metadata: languageName: node linkType: hard -"@backstage/integration-react@npm:^1.2.12, @backstage/integration-react@npm:^1.2.13": - version: 1.2.13 - resolution: "@backstage/integration-react@npm:1.2.13" +"@backstage/integration-react@npm:^1.2.12, @backstage/integration-react@npm:^1.2.13, @backstage/integration-react@npm:^1.2.14": + version: 1.2.15 + resolution: "@backstage/integration-react@npm:1.2.15" dependencies: "@backstage/config": "npm:^1.3.6" - "@backstage/core-plugin-api": "npm:^1.12.1" - "@backstage/integration": "npm:^1.19.0" + "@backstage/core-plugin-api": "npm:^1.12.3" + "@backstage/integration": "npm:^1.20.0" "@material-ui/core": "npm:^4.12.2" "@material-ui/icons": "npm:^4.9.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.3.0 + react-router-dom: ^6.30.2 peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/c2b4a7356a9e3b9f5f55b65b7369bca8a185123abef27a24f0caef3af5a1c760d2710cf73747bfa90c9598e4023c5c76170b118b25666058f9d9eb95993e39bb + checksum: 10c0/86e374021646aa508348237e3d6cde55e8af130d1c11e3840190c24fa7a16084cf3172fb93a9be595663b40b8e4eb05f0a3e8bdcb9c6268777c53592ae885434 languageName: node linkType: hard -"@backstage/integration@npm:^1.18.2, @backstage/integration@npm:^1.19.0": - version: 1.19.0 - resolution: "@backstage/integration@npm:1.19.0" +"@backstage/integration@npm:^1.18.2, @backstage/integration@npm:^1.19.0, @backstage/integration@npm:^1.20.0": + version: 1.20.0 + resolution: "@backstage/integration@npm:1.20.0" dependencies: "@azure/identity": "npm:^4.0.0" "@azure/storage-blob": "npm:^12.5.0" @@ -2611,7 +2662,7 @@ __metadata: git-url-parse: "npm:^15.0.0" lodash: "npm:^4.17.21" luxon: "npm:^3.0.0" - checksum: 10c0/0ec55421038098890a55f4cbc2b7872b58826a10024f8a27da43bdf13a8959ac8e8033152cf80854205dbb4ea19172832dd1a64ca6cc30c50fc4ed0da2ae843d + checksum: 10c0/e96a553297fce0742dc3f0bb229ca8215c18720c7154f0889387b3ed9583203fc8ef4b5d9c9d180a2636b3906499d3ddccf91e40cadfd9d14a7873fee489e562 languageName: node linkType: hard @@ -2686,14 +2737,34 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-app@npm:^0.3.3": - version: 0.3.3 - resolution: "@backstage/plugin-app@npm:0.3.3" +"@backstage/plugin-app-react@npm:^0.1.0": + version: 0.1.0 + resolution: "@backstage/plugin-app-react@npm:0.1.0" dependencies: - "@backstage/core-components": "npm:^0.18.4" "@backstage/core-plugin-api": "npm:^1.12.1" - "@backstage/frontend-plugin-api": "npm:^0.13.2" - "@backstage/integration-react": "npm:^1.2.13" + "@backstage/frontend-plugin-api": "npm:^0.13.3" + "@material-ui/core": "npm:^4.9.13" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.3.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/a10716547b2c4a5c8c9d55d1283091b5009877996d2e0ad0b37babc631c35bd45a4cc359e18ae7f98f87b38b869baae5f68c5eeff5d79029ec79f9a9780abb19 + languageName: node + linkType: hard + +"@backstage/plugin-app@npm:^0.3.3, @backstage/plugin-app@npm:^0.3.5": + version: 0.3.5 + resolution: "@backstage/plugin-app@npm:0.3.5" + dependencies: + "@backstage/core-components": "npm:^0.18.6" + "@backstage/core-plugin-api": "npm:^1.12.2" + "@backstage/frontend-plugin-api": "npm:^0.13.4" + "@backstage/integration-react": "npm:^1.2.14" + "@backstage/plugin-app-react": "npm:^0.1.0" "@backstage/plugin-permission-react": "npm:^0.4.39" "@backstage/theme": "npm:^0.7.1" "@backstage/types": "npm:^1.2.2" @@ -2703,7 +2774,7 @@ __metadata: "@material-ui/lab": "npm:^4.0.0-alpha.61" "@react-hookz/web": "npm:^24.0.0" react-use: "npm:^17.2.4" - zod: "npm:^3.22.4" + zod: "npm:^3.25.76" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -2712,7 +2783,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/427dc3ee7340ff38df9f14d339f820e49946e677bccd3c73957cb66741f48ca0cd4d51ebf4609ac5af3f5a7913e3fe58b0f7fa86aa5fbfc9c1df41e307db5310 + checksum: 10c0/4c29c3d2671aa87fe6f4607b67e86a6607170ae310a5afadbdd961089424c6650b4a8d2aeb552ed317b334765e99ba471d8745c1fc52d8d1ea9a71f5addbd85d languageName: node linkType: hard @@ -3072,7 +3143,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-events-node@npm:^0.4.17, @backstage/plugin-events-node@npm:^0.4.18": +"@backstage/plugin-events-node@npm:^0.4.18": version: 0.4.18 resolution: "@backstage/plugin-events-node@npm:0.4.18" dependencies: @@ -4196,9 +4267,25 @@ __metadata: languageName: node linkType: hard -"@backstage/theme@npm:^0.7.0, @backstage/theme@npm:^0.7.1": - version: 0.7.1 - resolution: "@backstage/theme@npm:0.7.1" +"@backstage/theme@npm:^0.5.6": + version: 0.5.7 + resolution: "@backstage/theme@npm:0.5.7" + dependencies: + "@emotion/react": "npm:^11.10.5" + "@emotion/styled": "npm:^11.10.5" + "@mui/material": "npm:^5.12.2" + peerDependencies: + "@material-ui/core": ^4.12.2 + "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0 + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + checksum: 10c0/56956c8e75f5c3eaedbbc1c3fb799477b17e03cbf3c63222a40a7eb519769a6490a221a006471fb5712f58bdd299d4f1a9dbd5e9131173c90089370535f4b937 + languageName: node + linkType: hard + +"@backstage/theme@npm:^0.7.0, @backstage/theme@npm:^0.7.1, @backstage/theme@npm:^0.7.2": + version: 0.7.2 + resolution: "@backstage/theme@npm:0.7.2" dependencies: "@emotion/react": "npm:^11.10.5" "@emotion/styled": "npm:^11.10.5" @@ -4208,15 +4295,15 @@ __metadata: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.3.0 + react-router-dom: ^6.30.2 peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/f5069e55b2c36c4322065ded3938363c81c69cfcfdb32f9379eafa7a67f247e32e61e9f661616fd4c26da41b7e6c6d8902d7ef26ba0fa0f4efcf5172e7ae9fdc + checksum: 10c0/f3d10319727dde23b2f30813dd9e1981167670b04f5143dd0da222c9e5b8f8da43d9d8c42935b4a07d4ddd09e6fa18014cd8e5bd7dcb86c03a7593b3cee67d2a languageName: node linkType: hard -"@backstage/types@npm:^1.2.1, @backstage/types@npm:^1.2.2": +"@backstage/types@npm:^1.1.1, @backstage/types@npm:^1.2.1, @backstage/types@npm:^1.2.2": version: 1.2.2 resolution: "@backstage/types@npm:1.2.2" checksum: 10c0/3c947cf83c058a56b0cfd90d91483e9a5c1c913f7978a0d5a3c0fd9b502d08e9bdf279afba626826eee84159e698ee4cdaa70040789ac47fc8a25df9f1925612 @@ -4263,18 +4350,18 @@ __metadata: languageName: node linkType: hard -"@backstage/version-bridge@npm:^1.0.11": - version: 1.0.11 - resolution: "@backstage/version-bridge@npm:1.0.11" +"@backstage/version-bridge@npm:^1.0.11, @backstage/version-bridge@npm:^1.0.12, @backstage/version-bridge@npm:^1.0.8": + version: 1.0.12 + resolution: "@backstage/version-bridge@npm:1.0.12" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.3.0 + react-router-dom: ^6.30.2 peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/0120844910cfabe12d7f1a6c9cab6da5dd0e48f021ed7f46ae6094f8611903fa28385f5e1606a329a31a1b6e714b91c73dfbfe6f2b836b0b50a6180b1f58770c + checksum: 10c0/1dc2d45ccef8287bd7bf0ed0f8f87ce742e207ab7fb2d17ec25defb4dd93240ba0a63365f627cc17b97423a0a0e043ab433cfe9e7772eb178dc84983d4a03104 languageName: node linkType: hard @@ -13745,6 +13832,13 @@ __metadata: languageName: node linkType: hard +"@types/parse5@npm:^6.0.0": + version: 6.0.3 + resolution: "@types/parse5@npm:6.0.3" + checksum: 10c0/a7c7ef6625974b74b93c1105953003a2291897e453369efcadc569b907de2784d61d4e6905de3ef959fa07f3278f41ed0c22ead0173776023fc43b6ed31042d0 + languageName: node + linkType: hard + "@types/passport@npm:^1.0.3": version: 1.0.17 resolution: "@types/passport@npm:1.0.17" @@ -14785,6 +14879,58 @@ __metadata: languageName: node linkType: hard +"app-legacy@workspace:packages/app-legacy": + version: 0.0.0-use.local + resolution: "app-legacy@workspace:packages/app-legacy" + dependencies: + "@axe-core/playwright": "npm:^4.11.0" + "@backstage/app-defaults": "npm:^1.7.2" + "@backstage/catalog-model": "npm:^1.7.6" + "@backstage/cli": "npm:^0.34.5" + "@backstage/core-app-api": "npm:^1.19.2" + "@backstage/core-components": "npm:^0.18.3" + "@backstage/core-plugin-api": "npm:^1.12.0" + "@backstage/integration-react": "npm:^1.2.12" + "@backstage/plugin-api-docs": "npm:^0.13.1" + "@backstage/plugin-catalog": "npm:^1.32.0" + "@backstage/plugin-catalog-common": "npm:^1.1.7" + "@backstage/plugin-catalog-graph": "npm:^0.5.3" + "@backstage/plugin-catalog-import": "npm:^0.13.7" + "@backstage/plugin-catalog-react": "npm:^1.21.3" + "@backstage/plugin-kubernetes": "npm:^0.12.13" + "@backstage/plugin-org": "npm:^0.6.46" + "@backstage/plugin-permission-react": "npm:^0.4.38" + "@backstage/plugin-scaffolder": "npm:^1.34.3" + "@backstage/plugin-search": "npm:^1.5.0" + "@backstage/plugin-search-react": "npm:^1.10.0" + "@backstage/plugin-techdocs": "npm:^1.16.0" + "@backstage/plugin-techdocs-module-addons-contrib": "npm:^1.1.30" + "@backstage/plugin-techdocs-react": "npm:^1.3.5" + "@backstage/plugin-user-settings": "npm:^0.8.29" + "@backstage/test-utils": "npm:^1.7.13" + "@backstage/theme": "npm:^0.7.0" + "@backstage/ui": "npm:^0.9.1" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@playwright/test": "npm:1.58.2" + "@red-hat-developer-hub/backstage-plugin-bcc-test": "workspace:^" + "@red-hat-developer-hub/backstage-plugin-bui-test": "workspace:^" + "@red-hat-developer-hub/backstage-plugin-mui4-test": "workspace:^" + "@red-hat-developer-hub/backstage-plugin-mui5-test": "workspace:^" + "@red-hat-developer-hub/backstage-plugin-theme": "workspace:^" + "@testing-library/dom": "npm:^9.0.0" + "@testing-library/jest-dom": "npm:^6.0.0" + "@testing-library/react": "npm:^14.0.0" + "@testing-library/user-event": "npm:^14.0.0" + "@types/react-dom": "npm:*" + cross-env: "npm:^7.0.0" + react: "npm:^18.0.2" + react-dom: "npm:^18.0.2" + react-router: "npm:^6.3.0" + react-router-dom: "npm:^6.3.0" + languageName: unknown + linkType: soft + "app@link:../app::locator=backend%40workspace%3Apackages%2Fbackend": version: 0.0.0-use.local resolution: "app@link:../app::locator=backend%40workspace%3Apackages%2Fbackend" @@ -14795,15 +14941,17 @@ __metadata: version: 0.0.0-use.local resolution: "app@workspace:packages/app" dependencies: - "@axe-core/playwright": "npm:^4.11.0" - "@backstage/app-defaults": "npm:^1.7.2" "@backstage/catalog-model": "npm:^1.7.6" "@backstage/cli": "npm:^0.34.5" "@backstage/core-app-api": "npm:^1.19.2" + "@backstage/core-compat-api": "npm:^0.2.0" "@backstage/core-components": "npm:^0.18.3" "@backstage/core-plugin-api": "npm:^1.12.0" + "@backstage/frontend-defaults": "npm:^0.3.0" + "@backstage/frontend-plugin-api": "npm:^0.13.0" "@backstage/integration-react": "npm:^1.2.12" "@backstage/plugin-api-docs": "npm:^0.13.1" + "@backstage/plugin-app-react": "npm:^0.1.0" "@backstage/plugin-catalog": "npm:^1.32.0" "@backstage/plugin-catalog-common": "npm:^1.1.7" "@backstage/plugin-catalog-graph": "npm:^0.5.3" @@ -14824,7 +14972,6 @@ __metadata: "@backstage/ui": "npm:^0.9.1" "@material-ui/core": "npm:^4.12.2" "@material-ui/icons": "npm:^4.9.1" - "@playwright/test": "npm:1.58.2" "@red-hat-developer-hub/backstage-plugin-bcc-test": "workspace:^" "@red-hat-developer-hub/backstage-plugin-bui-test": "workspace:^" "@red-hat-developer-hub/backstage-plugin-mui4-test": "workspace:^" @@ -15440,7 +15587,7 @@ __metadata: version: 0.0.0-use.local resolution: "backend@workspace:packages/backend" dependencies: - "@backstage/backend-defaults": "npm:^0.13.2" + "@backstage/backend-defaults": "npm:^0.14.0" "@backstage/cli": "npm:^0.34.5" "@backstage/config": "npm:^1.3.6" "@backstage/plugin-app-backend": "npm:^0.5.8" @@ -17676,6 +17823,16 @@ __metadata: languageName: node linkType: hard +"dagre@npm:^0.8.5": + version: 0.8.5 + resolution: "dagre@npm:0.8.5" + dependencies: + graphlib: "npm:^2.1.8" + lodash: "npm:^4.17.15" + checksum: 10c0/1c021b66961aa9a700bb6ec51747bcc214720a661ad6cb1878eab7316ecb550a759664a6754081a315b37d0355e3c19ff162813b36f20cbeb2e37f7440364d62 + languageName: node + linkType: hard + "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -20780,6 +20937,15 @@ __metadata: languageName: node linkType: hard +"graphlib@npm:^2.1.8": + version: 2.1.8 + resolution: "graphlib@npm:2.1.8" + dependencies: + lodash: "npm:^4.17.15" + checksum: 10c0/41c525e4d91a6d8b4e8da1883bf4e85689a547e908557ccc53f64db9141bdfb351b9162a79f13cae81c5b3a410027f59e4fc1edc1ea442234ec08e629859b188 + languageName: node + linkType: hard + "graphql-config@npm:^5.0.2": version: 5.1.3 resolution: "graphql-config@npm:5.1.3" @@ -21027,6 +21193,21 @@ __metadata: languageName: node linkType: hard +"hast-util-from-parse5@npm:^7.0.0": + version: 7.1.2 + resolution: "hast-util-from-parse5@npm:7.1.2" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/unist": "npm:^2.0.0" + hastscript: "npm:^7.0.0" + property-information: "npm:^6.0.0" + vfile: "npm:^5.0.0" + vfile-location: "npm:^4.0.0" + web-namespaces: "npm:^2.0.0" + checksum: 10c0/c1002816d0235ff0a1e888d71c191d3ecfbaba510aaef86eec00edcba8803a3e0ad901bb0e5430a9d2aee2d52c31aabacae8282394dc519c333017a46c68d1c8 + languageName: node + linkType: hard + "hast-util-parse-selector@npm:^2.0.0": version: 2.2.5 resolution: "hast-util-parse-selector@npm:2.2.5" @@ -21034,6 +21215,15 @@ __metadata: languageName: node linkType: hard +"hast-util-parse-selector@npm:^3.0.0": + version: 3.1.1 + resolution: "hast-util-parse-selector@npm:3.1.1" + dependencies: + "@types/hast": "npm:^2.0.0" + checksum: 10c0/34ac1707a477fd9764e328087163f1f21857bdb0f8d425bf41f6def7baf840e50e4bca2eb03072e3da4e39856de28893c4b688dcba0cc305160d53afcece4df4 + languageName: node + linkType: hard + "hast-util-parse-selector@npm:^4.0.0": version: 4.0.0 resolution: "hast-util-parse-selector@npm:4.0.0" @@ -21043,6 +21233,48 @@ __metadata: languageName: node linkType: hard +"hast-util-raw@npm:^7.2.0": + version: 7.2.3 + resolution: "hast-util-raw@npm:7.2.3" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/parse5": "npm:^6.0.0" + hast-util-from-parse5: "npm:^7.0.0" + hast-util-to-parse5: "npm:^7.0.0" + html-void-elements: "npm:^2.0.0" + parse5: "npm:^6.0.0" + unist-util-position: "npm:^4.0.0" + unist-util-visit: "npm:^4.0.0" + vfile: "npm:^5.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/c7bf994938cbc1acaaeb337f99773773b51ad77695b559c6352cba5c35b26610e6de2936b5086ef8bc53b436dd8032a3860e7357f28b6bb0365f751919745398 + languageName: node + linkType: hard + +"hast-util-sanitize@npm:^4.0.0": + version: 4.1.0 + resolution: "hast-util-sanitize@npm:4.1.0" + dependencies: + "@types/hast": "npm:^2.0.0" + checksum: 10c0/d8c10a0fa42a38c46913666da2bf770198a56ceac6f0f0bcfcab157bc97659a19634ed0c4b08582b4c8f6b3c330ee64a4aeb64327f6a6969eb53848544d79b2d + languageName: node + linkType: hard + +"hast-util-to-parse5@npm:^7.0.0": + version: 7.1.0 + resolution: "hast-util-to-parse5@npm:7.1.0" + dependencies: + "@types/hast": "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/2a96302b8f25fa2d5b657a94bb20a3d9a1a81e66c2f81582a242c5634dd850e3bd95313a7471eef8282b597f2129551fef5a1631f4ce14c41aab646281b339a0 + languageName: node + linkType: hard + "hast-util-whitespace@npm:^2.0.0": version: 2.0.1 resolution: "hast-util-whitespace@npm:2.0.1" @@ -21063,6 +21295,19 @@ __metadata: languageName: node linkType: hard +"hastscript@npm:^7.0.0": + version: 7.2.0 + resolution: "hastscript@npm:7.2.0" + dependencies: + "@types/hast": "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-parse-selector: "npm:^3.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + checksum: 10c0/579912b03ff4a5b19eb609df7403c6dba2505ef1a1e2bc47cbf467cbd7cffcd51df40e74d882de1ccdda40aaf18487f82619eb9cb9f2077cba778017e95e868e + languageName: node + linkType: hard + "hastscript@npm:^9.0.0": version: 9.0.1 resolution: "hastscript@npm:9.0.1" @@ -21233,6 +21478,13 @@ __metadata: languageName: node linkType: hard +"html-void-elements@npm:^2.0.0": + version: 2.0.1 + resolution: "html-void-elements@npm:2.0.1" + checksum: 10c0/1079c9e9fdb3b6a2481f2a282098a0183f3d45bf2b9d76c7dfc1671ee1857d7bacdd04fd8c6e2418f5ff550c30cabf97a010fe31ec402d0c89189807b48e6d79 + languageName: node + linkType: hard + "html-webpack-plugin@npm:^5.6.3": version: 5.6.3 resolution: "html-webpack-plugin@npm:5.6.3" @@ -24051,6 +24303,16 @@ __metadata: languageName: node linkType: hard +"linkify-react@npm:4.1.3": + version: 4.1.3 + resolution: "linkify-react@npm:4.1.3" + peerDependencies: + linkifyjs: ^4.0.0 + react: ">= 15.0.0" + checksum: 10c0/c8c0e96301c3fbe5df19110dd778f4f0004f7c2f127fecb192ba9d4cf3e581d59f7d99ab0311c72a99cf039f5b34421e6ce71f2fcdd90f51655d7736fed4b370 + languageName: node + linkType: hard + "linkify-react@npm:4.3.2": version: 4.3.2 resolution: "linkify-react@npm:4.3.2" @@ -24061,6 +24323,13 @@ __metadata: languageName: node linkType: hard +"linkifyjs@npm:4.1.3": + version: 4.1.3 + resolution: "linkifyjs@npm:4.1.3" + checksum: 10c0/9fb71da06ee710b5587c8b61ff9a0e45303d448f61fab135e44652cff95c09c1abe276158a72384cff6f35a2371d1cec33dfaa7e5280b71dbb142b43d210c75a + languageName: node + linkType: hard + "linkifyjs@npm:4.3.2": version: 4.3.2 resolution: "linkifyjs@npm:4.3.2" @@ -26035,7 +26304,7 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.1, node-forge@npm:^1.3.2": +"node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.2": version: 1.3.3 resolution: "node-forge@npm:1.3.3" checksum: 10c0/9c6f53b0ebb34865872cf62a35b0aef8fb337e2efc766626c2e3a0040f4c02933bf29a62ba999eb44a2aca73bd512c4eda22705a47b94654b9fb8ed53db9a1db @@ -27007,6 +27276,13 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^6.0.0": + version: 6.0.1 + resolution: "parse5@npm:6.0.1" + checksum: 10c0/595821edc094ecbcfb9ddcb46a3e1fe3a718540f8320eff08b8cf6742a5114cce2d46d45f95c26191c11b184dcaf4e2960abcd9c5ed9eb9393ac9a37efcfdecb + languageName: node + linkType: hard + "parse5@npm:^7.0.0, parse5@npm:^7.1.1, parse5@npm:^7.2.1": version: 7.2.1 resolution: "parse5@npm:7.2.1" @@ -29439,6 +29715,28 @@ __metadata: languageName: node linkType: hard +"rehype-raw@npm:^6.0.0": + version: 6.1.1 + resolution: "rehype-raw@npm:6.1.1" + dependencies: + "@types/hast": "npm:^2.0.0" + hast-util-raw: "npm:^7.2.0" + unified: "npm:^10.0.0" + checksum: 10c0/c68b460d313cad877e731d83770913417e4759b3d7a824ffc0e60a7a62cdd7e24c461ead9b081760005382dd4510330e3bb961370e58dfeed09732675037a1a9 + languageName: node + linkType: hard + +"rehype-sanitize@npm:^5.0.0": + version: 5.0.1 + resolution: "rehype-sanitize@npm:5.0.1" + dependencies: + "@types/hast": "npm:^2.0.0" + hast-util-sanitize: "npm:^4.0.0" + unified: "npm:^10.0.0" + checksum: 10c0/e04a747db87c008fbaff82c06ea159a853f869e6d69418a671c237ea60f47cea842b53c40ec8971bee8e480c154b83b1e3fa6b355a45557dc62d91821dc0b2e1 + languageName: node + linkType: hard + "relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" @@ -33117,6 +33415,16 @@ __metadata: languageName: node linkType: hard +"vfile-location@npm:^4.0.0": + version: 4.1.0 + resolution: "vfile-location@npm:4.1.0" + dependencies: + "@types/unist": "npm:^2.0.0" + vfile: "npm:^5.0.0" + checksum: 10c0/77097e819579214d3346aaa2b06e4d23e2413221ac4914679d312cf64973011b76f0e2424fa8f18987befcd6ed60f4f6c4c6ebd5d5326062173a95f6b4445a96 + languageName: node + linkType: hard + "vfile-message@npm:^3.0.0": version: 3.1.4 resolution: "vfile-message@npm:3.1.4" @@ -33230,6 +33538,13 @@ __metadata: languageName: node linkType: hard +"web-namespaces@npm:^2.0.0": + version: 2.0.1 + resolution: "web-namespaces@npm:2.0.1" + checksum: 10c0/df245f466ad83bd5cd80bfffc1674c7f64b7b84d1de0e4d2c0934fb0782e0a599164e7197a4bce310ee3342fd61817b8047ff04f076a1ce12dd470584142a4bd + languageName: node + linkType: hard + "web-streams-polyfill@npm:4.0.0-beta.3": version: 4.0.0-beta.3 resolution: "web-streams-polyfill@npm:4.0.0-beta.3" @@ -33878,12 +34193,12 @@ __metadata: languageName: node linkType: hard -"zod-to-json-schema@npm:^3.20.4, zod-to-json-schema@npm:^3.21.4": - version: 3.23.5 - resolution: "zod-to-json-schema@npm:3.23.5" +"zod-to-json-schema@npm:^3.20.4, zod-to-json-schema@npm:^3.21.4, zod-to-json-schema@npm:^3.25.1": + version: 3.25.1 + resolution: "zod-to-json-schema@npm:3.25.1" peerDependencies: - zod: ^3.23.3 - checksum: 10c0/bf50455f446c96b9a161476347ebab6e3bcae7fdf1376ce0b74248e79db733590164476dac2fc481a921868f705fefdcafd223a98203a700b3f01ba1cda6aa90 + zod: ^3.25 || ^4 + checksum: 10c0/711b30e34d1f1211f1afe64bf457f0d799234199dc005cca720b236ea808804c03164039c232f5df33c46f462023874015a8a0b3aab1585eca14124c324db7e2 languageName: node linkType: hard @@ -33896,10 +34211,10 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.22.4": - version: 3.23.8 - resolution: "zod@npm:3.23.8" - checksum: 10c0/8f14c87d6b1b53c944c25ce7a28616896319d95bc46a9660fe441adc0ed0a81253b02b5abdaeffedbeb23bdd25a0bf1c29d2c12dd919aef6447652dd295e3e69 +"zod@npm:^3.22.4, zod@npm:^3.25.76": + version: 3.25.76 + resolution: "zod@npm:3.25.76" + checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c languageName: node linkType: hard