From 0bf3ae9c3b39efe91615fcf09c72c4256795d7be Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Wed, 15 Jul 2026 17:20:16 -0400 Subject: [PATCH 01/10] chore(app-next): add runnable RHDH NFS shell for local development Signed-off-by: Yi Cai --- app-config.yaml | 59 + packages/app-next/README.md | 129 +- packages/app-next/package.json | 15 +- packages/app-next/src/App.test.tsx | 28 +- packages/app-next/src/App.tsx | 43 +- packages/app-next/src/modules/nav/Sidebar.tsx | 49 + packages/app-next/src/modules/nav/index.ts | 14 + .../src/modules/quickstartHelp/index.tsx | 41 + .../modules/signIn/SignInPageComponent.tsx | 14 + packages/app-next/src/modules/signIn/index.ts | 14 + packages/app-next/tsconfig.json | 10 + yarn.lock | 1875 +++++++++++++++-- 12 files changed, 2110 insertions(+), 181 deletions(-) create mode 100644 packages/app-next/src/modules/nav/Sidebar.tsx create mode 100644 packages/app-next/src/modules/nav/index.ts create mode 100644 packages/app-next/src/modules/quickstartHelp/index.tsx create mode 100644 packages/app-next/src/modules/signIn/SignInPageComponent.tsx create mode 100644 packages/app-next/src/modules/signIn/index.ts create mode 100644 packages/app-next/tsconfig.json diff --git a/app-config.yaml b/app-config.yaml index 57a26f086b..8ec190833f 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -3,6 +3,52 @@ developerHub: app: title: Red Hat Developer Hub baseUrl: http://localhost:3000 + # NFS extension settings for plugins statically bundled in app-next + # (homepage, global-header, quickstart). + extensions: + # Homepage — route, visit tracking, and default RHDH layout + - page:home: + config: + path: / + - api:home/visits: true + - app-root-element:home/visit-listener: true + - home-page-layout:home/dynamic-homepage-layout: + config: + customizable: true + widgetLayout: + RhdhTemplateSection: + priority: 300 + breakpoints: + xl: { w: 12, h: 5 } + lg: { w: 12, h: 5 } + md: { w: 12, h: 5 } + sm: { w: 12, h: 5 } + xs: { w: 12, h: 7.5 } + xxs: { w: 12, h: 13.5 } + RhdhEntitySection: + priority: 200 + breakpoints: + xl: { w: 12, h: 7 } + lg: { w: 12, h: 7 } + md: { w: 12, h: 8 } + sm: { w: 12, h: 9 } + xs: { w: 12, h: 11 } + xxs: { w: 12, h: 15 } + RhdhOnboardingSection: + priority: 100 + breakpoints: + xl: { w: 12, h: 6 } + lg: { w: 12, h: 6 } + md: { w: 12, h: 7 } + sm: { w: 12, h: 8 } + xs: { w: 12, h: 9 } + xxs: { w: 12, h: 14 } + # Global header and quickstart drawer + - app-root-wrapper:app/global-header: true + - app-root-wrapper:app/drawer: true + - app-drawer-content:quickstart/quickstart: true + - gh-menu-item:quickstart/quickstart: false + - gh-menu-item:app/quickstart-help: true branding: fullLogoWidth: ${FULL_LOGO_WIDTH} theme: @@ -171,5 +217,18 @@ dynatrace: permission: enabled: ${PERMISSION_ENABLED} +# Auth providers for local development (app-next via `backend start:next`). +# Guest works out of the box; GitHub requires GITHUB_OAUTH_APP_ID and +# GITHUB_OAUTH_APP_SECRET (create a GitHub OAuth App with callback URL +# `/api/auth/github/handler/frame`). +auth: + environment: development + providers: + guest: {} + github: + development: + clientId: ${GITHUB_OAUTH_APP_ID} + clientSecret: ${GITHUB_OAUTH_APP_SECRET} + dynamicPlugins: rootDirectory: dynamic-plugins-root diff --git a/packages/app-next/README.md b/packages/app-next/README.md index cb857b50a0..99abfc2991 100644 --- a/packages/app-next/README.md +++ b/packages/app-next/README.md @@ -2,41 +2,132 @@ ## Overview -This package contains the Red Hat Developer Hub (RHDH) frontend application built using Backstage's new frontend system architecture. The `app-next` package leverages Backstage's new frontend system, which introduces a more modular and extensible architecture compared to the legacy frontend system. This new system is built around the concepts of extensions, plugins, and utility APIs, providing better composability and customization options. +This package contains the Red Hat Developer Hub (RHDH) frontend application built using Backstage's [new frontend system](https://backstage.io/docs/frontend-system/architecture/index). It is the NFS (New Frontend System) app shell used for local development and for testing plugins loaded via module federation. -## Development +The shell includes RHDH theme, sign-in, navigation sidebar, home page, global header, quickstart, and the dynamic feature loader. Optional plugins (for example notifications or signals) are **not** bundled here — they are deployed separately to `dynamic-plugins-root` and loaded at runtime. -### Primary Development Workflow +## Prerequisites -The recommended way to run the new frontend system is using the `backend start:next` command: +- Dependencies installed from the repo root: `yarn install` +- A local config overlay such as `app-config.local.yaml` (not committed) that points the backend at this app and your local port +- Backend dynamic plugins copied or exported into `dynamic-plugins-root/` as needed for your scenario + +## First-time setup + +Build the app shell before starting the backend: ```bash -# from the root of the repo +# from the repo root +EXPERIMENTAL_MODULE_FEDERATION=true yarn workspace app-next build +``` + +## Running locally + +The recommended workflow serves `app-next` through the backend: + +```bash +# from the repo root yarn workspace backend start:next ``` -### Standalone Development +`start:next` sets `APP_CONFIG_app_packageName=app-next` and `ENABLE_STANDARD_MODULE_FEDERATION=true` automatically (see `packages/backend/package.json`). -You can also run the frontend application independently for development: +Wait for logs similar to: + +```text +Listening on :7011 +Serving static app content from .../packages/app-next/dist +``` + +Then open the app at your configured `app.baseUrl` (for example `http://localhost:7011`). + +Rebuild `app-next` after changing files under `packages/app-next/`: + +```bash +EXPERIMENTAL_MODULE_FEDERATION=true yarn workspace app-next build +``` + +Restart the backend to pick up a new build. + +## Local configuration + +Use `app-config.local.yaml` to override defaults from `app-config.yaml`. Typical settings for NFS local development: + +```yaml +app: + baseUrl: http://localhost:7011 + +backend: + baseUrl: http://localhost:7011 + listen: + port: 7011 + cors: + origin: http://localhost:7011 + methods: [GET, HEAD, PATCH, POST, PUT, DELETE] + credentials: true + csp: + connect-src: + - "'self'" + - 'http:' + - 'https:' + # Required when testing plugins that use WebSockets (for example signals): + # - 'ws:' + # - 'wss:' + +dynamicPlugins: + rootDirectory: dynamic-plugins-root +``` + +Quickstart, homepage, and global-header NFS extensions plus guest/GitHub auth providers are defined in `app-config.yaml`. For GitHub sign-in, set `GITHUB_OAUTH_APP_ID` and `GITHUB_OAUTH_APP_SECRET` in your environment (or in `app-config.local.yaml`) and ensure the OAuth App callback URL matches `/api/auth/github/handler/frame`. + +Sign-in: + +- **Guest** — enabled via `auth.providers.guest` in `app-config.yaml`. +- **GitHub** — offered on the sign-in page when `GITHUB_OAUTH_APP_ID` and `GITHUB_OAUTH_APP_SECRET` are configured. + +## Verifying the shell + +1. Sign in as guest (or with a configured provider). +2. Confirm the home page, sidebar (Home, Catalog, Scaffolder, Search), and global header render. +3. Open the extension visualizer at `/visualizer/tree` and confirm core extensions load (for example `page:home`, `page:catalog`). + +Loading additional NFS plugins via module federation is documented separately (see repo docs for exporting plugins to `dynamic-plugins-root`). + +## Standalone frontend development + +You can run the frontend dev server without the full backend workflow: ```bash -# from the root of the repo yarn workspace app-next start ``` -### Other Available Commands +This uses `app-config.yaml` only and does not enable the same module federation backend integration as `start:next`. -- `yarn build` - Build the application for production -- `yarn test` - Run the test suite -- `yarn lint` - Run linting checks -- `yarn clean` - Clean build artifacts +## Other commands + +- `yarn build` — production build (module federation enabled via `package.json` script) +- `yarn test` — run tests +- `yarn lint` — lint checks +- `yarn clean` — remove build artifacts +- `yarn tsc` — typecheck ## Architecture -This application is built using Backstage's [new frontend system](https://backstage.io/docs/frontend-system/architecture/index), which provides: +Static features registered in `src/App.tsx`: + +| Module | Purpose | +|--------|---------| +| `rhdhThemeModule` | RHDH branding and theme | +| `signInModule` | Sign-in page (guest + GitHub) | +| `navModule` | Sidebar navigation | +| `homePlugin` / `homePageModule` | Home page and RHDH homepage layout | +| `globalHeaderPlugin` | Top navigation bar (loaded after MF remotes) | +| `quickstartPlugin` | Quickstart drawer and content | +| `dynamicFrontendFeaturesLoader()` | Loads NFS plugins from `dynamic-plugins-root` | + +Plugin load order matters: `dynamicFrontendFeaturesLoader()` runs before static global header so the static header wins if the same plugin is also present as an MF remote. + +## Related documentation -- **Extension-based architecture**: Modular components that can be composed together -- **Plugin system**: Reusable functionality packages -- **Utility APIs**: Shared services and functionality -- **Route management**: Dynamic routing system for plugin navigation -- **Theming and customization**: Flexible styling and branding options +- [Backstage new frontend system](https://backstage.io/docs/frontend-system/architecture/index) +- Exporting and testing NFS plugins via module federation — see companion doc in this repo (Part 2) diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 9e88410580..58c40612ba 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -22,7 +22,8 @@ "lint:check": "backstage-cli package lint", "lint:fix": "backstage-cli package lint --fix", "start": "backstage-cli package start --config ../../app-config.yaml", - "test": "backstage-cli package test --passWithNoTests --coverage" + "test": "backstage-cli package test --passWithNoTests --coverage", + "tsc": "tsc" }, "browserslist": { "production": [ @@ -52,14 +53,16 @@ "@backstage/frontend-plugin-api": "0.17.2", "@backstage/integration-react": "1.2.19", "@backstage/plugin-app": "0.5.0", + "@backstage/plugin-app-react": "0.2.4", "@backstage/plugin-app-visualizer": "0.2.5", "@backstage/plugin-auth-react": "0.1.28", - "@backstage/plugin-catalog": "2.0.6", + "@backstage/plugin-catalog": "2.0.7", "@backstage/plugin-catalog-common": "1.1.10", "@backstage/plugin-catalog-graph": "0.6.5", "@backstage/plugin-catalog-import": "0.13.14", - "@backstage/plugin-catalog-react": "3.1.0", + "@backstage/plugin-catalog-react": "3.2.0", "@backstage/plugin-catalog-unprocessed-entities": "0.2.32", + "@backstage/plugin-home": "0.9.4", "@backstage/plugin-permission-react": "0.5.2", "@backstage/plugin-scaffolder": "1.38.0", "@backstage/plugin-scaffolder-react": "2.0.1", @@ -72,7 +75,13 @@ "@material-ui/core": "4.12.4", "@material-ui/icons": "4.11.3", "@material-ui/lab": "4.0.0-alpha.61", + "@mui/icons-material": "5.18.0", "@octokit/rest": "19.0.13", + "@red-hat-developer-hub/backstage-plugin-app-react": "0.0.5", + "@red-hat-developer-hub/backstage-plugin-global-header": "1.21.5", + "@red-hat-developer-hub/backstage-plugin-homepage": "1.15.0", + "@red-hat-developer-hub/backstage-plugin-quickstart": "1.10.0", + "@red-hat-developer-hub/backstage-plugin-theme": "0.14.7", "history": "5.3.0", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/app-next/src/App.test.tsx b/packages/app-next/src/App.test.tsx index d00e40d327..a222d7e8ab 100644 --- a/packages/app-next/src/App.test.tsx +++ b/packages/app-next/src/App.test.tsx @@ -1,6 +1,18 @@ import { renderWithEffects } from '@backstage/test-utils'; -jest.setTimeout(30_000); +jest.mock('@backstage/frontend-dynamic-feature-loader', () => { + const { createFrontendFeatureLoader } = jest.requireActual( + '@backstage/frontend-plugin-api', + ); + return { + dynamicFrontendFeaturesLoader: () => + createFrontendFeatureLoader({ + async loader() { + return []; + }, + }), + }; +}); describe('App', () => { it('should render', async () => { @@ -12,8 +24,20 @@ describe('App', () => { app: { title: 'Test', support: { url: 'http://localhost:7007/support' }, + extensions: [ + { 'page:home': { config: { path: '/' } } }, + { 'api:home/visits': true }, + { 'app-root-element:home/visit-listener': true }, + { 'app-root-wrapper:app/global-header': true }, + { 'app-root-wrapper:app/drawer': true }, + { 'app-drawer-content:quickstart/quickstart': true }, + { 'gh-menu-item:quickstart/quickstart': false }, + { 'gh-menu-item:app/quickstart-help': true }, + ], }, + auth: { environment: 'development' }, backend: { baseUrl: 'http://localhost:7007' }, + dynamicPlugins: { rootDirectory: 'dynamic-plugins-root' }, lighthouse: { baseUrl: 'http://localhost:3003', }, @@ -29,5 +53,5 @@ describe('App', () => { const { default: app } = await import('./App'); const rendered = await renderWithEffects(app); expect(rendered.baseElement).toBeInTheDocument(); - }); + }, 100_000); }); diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index fafcd6a17b..df34101299 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -5,15 +5,48 @@ import scaffolderPlugin from '@backstage/plugin-scaffolder/alpha'; import searchPlugin from '@backstage/plugin-search/alpha'; import userSettingsPlugin from '@backstage/plugin-user-settings/alpha'; import { dynamicFrontendFeaturesLoader } from '@backstage/frontend-dynamic-feature-loader'; +import { appDrawerModule } from '@red-hat-developer-hub/backstage-plugin-app-react/alpha'; +import globalHeaderPlugin, { + globalHeaderModule, + globalHeaderTranslationsModule, +} from '@red-hat-developer-hub/backstage-plugin-global-header/alpha'; +import { rhdhThemeModule } from '@red-hat-developer-hub/backstage-plugin-theme/alpha'; +import { + homePageModule, + homepageTranslationsModule, +} from '@red-hat-developer-hub/backstage-plugin-homepage/alpha'; +import quickstartPlugin, { + quickstartInitModule, + quickstartTranslationsModule, +} from '@red-hat-developer-hub/backstage-plugin-quickstart/alpha'; +import homePlugin from '@backstage/plugin-home/alpha'; +import { navModule } from './modules/nav'; +import { quickstartHelpModule } from './modules/quickstartHelp'; +import { signInModule } from './modules/signIn'; const app = createApp({ features: [ - appVisualizerPlugin, - catalogPlugin, - scaffolderPlugin, - searchPlugin, + rhdhThemeModule, + navModule, + signInModule, + homePlugin, + homePageModule, + homepageTranslationsModule, + appVisualizerPlugin, + catalogPlugin, + scaffolderPlugin, + searchPlugin, userSettingsPlugin, - dynamicFrontendFeaturesLoader() + appDrawerModule, + dynamicFrontendFeaturesLoader(), + // Static global-header must load after MF remotes so it wins plugin deduplication. + globalHeaderModule, + globalHeaderPlugin, + globalHeaderTranslationsModule, + quickstartHelpModule, + quickstartPlugin, + quickstartInitModule, + quickstartTranslationsModule, ], }); diff --git a/packages/app-next/src/modules/nav/Sidebar.tsx b/packages/app-next/src/modules/nav/Sidebar.tsx new file mode 100644 index 0000000000..d04555096d --- /dev/null +++ b/packages/app-next/src/modules/nav/Sidebar.tsx @@ -0,0 +1,49 @@ +import { + Sidebar, + SidebarDivider, + SidebarGroup, + SidebarItem, + SidebarScrollWrapper, + SidebarSpace, +} from '@backstage/core-components'; +import type { NavContentComponent } from '@backstage/plugin-app-react'; +import { SidebarSearchModal } from '@backstage/plugin-search'; +import { UserSettingsSignInAvatar } from '@backstage/plugin-user-settings'; +import MenuIcon from '@mui/icons-material/Menu'; +import SearchIcon from '@mui/icons-material/Search'; + +export const sidebarNavContent: NavContentComponent = ({ navItems }) => { + const nav = navItems.withComponent(item => ( + item.icon} to={item.href} text={item.title} /> + )); + + nav.take('page:search'); + + return ( + + } to="/search"> + + + + }> + {nav.take('page:home')} + {nav.take('page:catalog')} + {nav.take('page:scaffolder')} + + + {nav.rest({ sortBy: 'title' })} + + + + + } + to="/settings" + > + {nav.take('page:app-visualizer')} + {nav.take('page:user-settings')} + + + ); +}; diff --git a/packages/app-next/src/modules/nav/index.ts b/packages/app-next/src/modules/nav/index.ts new file mode 100644 index 0000000000..25805f9648 --- /dev/null +++ b/packages/app-next/src/modules/nav/index.ts @@ -0,0 +1,14 @@ +import { createFrontendModule } from '@backstage/frontend-plugin-api'; +import { NavContentBlueprint } from '@backstage/plugin-app-react'; +import { sidebarNavContent } from './Sidebar'; + +export const navModule = createFrontendModule({ + pluginId: 'app', + extensions: [ + NavContentBlueprint.make({ + params: { + component: sidebarNavContent, + }, + }), + ], +}); diff --git a/packages/app-next/src/modules/quickstartHelp/index.tsx b/packages/app-next/src/modules/quickstartHelp/index.tsx new file mode 100644 index 0000000000..f753cbab0a --- /dev/null +++ b/packages/app-next/src/modules/quickstartHelp/index.tsx @@ -0,0 +1,41 @@ +import { createFrontendModule } from '@backstage/frontend-plugin-api'; +import { useAppDrawer } from '@red-hat-developer-hub/backstage-plugin-app-react/alpha'; +import { + GlobalHeaderMenuItem, + GlobalHeaderMenuItemBlueprint, +} from '@red-hat-developer-hub/backstage-plugin-global-header/alpha'; + +const QUICKSTART_DRAWER_ID = 'quickstart'; + +const QuickstartHelpMenuItem = ({ + handleClose, +}: { + handleClose?: () => void; +}) => { + const { toggleDrawer } = useAppDrawer(); + + return ( + { + toggleDrawer(QUICKSTART_DRAWER_ID); + handleClose?.(); + }} + /> + ); +}; + +const quickstartHelpMenuItem = GlobalHeaderMenuItemBlueprint.make({ + name: 'quickstart-help', + params: { + target: 'help', + component: QuickstartHelpMenuItem, + priority: 50, + }, +}); + +export const quickstartHelpModule = createFrontendModule({ + pluginId: 'app', + extensions: [quickstartHelpMenuItem], +}); diff --git a/packages/app-next/src/modules/signIn/SignInPageComponent.tsx b/packages/app-next/src/modules/signIn/SignInPageComponent.tsx new file mode 100644 index 0000000000..cbab3d19ae --- /dev/null +++ b/packages/app-next/src/modules/signIn/SignInPageComponent.tsx @@ -0,0 +1,14 @@ +import { SignInPage } from '@backstage/core-components'; +import { githubAuthApiRef } from '@backstage/core-plugin-api'; +import type { SignInPageProps } from '@backstage/plugin-app-react'; + +const githubProvider = { + id: 'github-auth-provider', + title: 'GitHub', + message: 'Sign in using GitHub', + apiRef: githubAuthApiRef, +}; + +export function SignInPageComponent(props: SignInPageProps) { + return ; +} diff --git a/packages/app-next/src/modules/signIn/index.ts b/packages/app-next/src/modules/signIn/index.ts new file mode 100644 index 0000000000..990d9ec2e7 --- /dev/null +++ b/packages/app-next/src/modules/signIn/index.ts @@ -0,0 +1,14 @@ +import { createFrontendModule } from '@backstage/frontend-plugin-api'; +import { SignInPageBlueprint } from '@backstage/plugin-app-react'; + +export const signInModule = createFrontendModule({ + pluginId: 'app', + extensions: [ + SignInPageBlueprint.make({ + params: { + loader: () => + import('./SignInPageComponent').then(m => m.SignInPageComponent), + }, + }), + ], +}); diff --git a/packages/app-next/tsconfig.json b/packages/app-next/tsconfig.json new file mode 100644 index 0000000000..e9276c0509 --- /dev/null +++ b/packages/app-next/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@backstage/cli/config/tsconfig.json", + "include": ["src"], + "exclude": ["node_modules"], + "compilerOptions": { + "jsx": "preserve", + "outDir": "../../dist-types/packages/app-next", + "rootDir": "." + } +} diff --git a/yarn.lock b/yarn.lock index faa64f1826..0228ad9f73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -591,6 +591,22 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/lib-storage@npm:^3.350.0": + version: 3.1086.0 + resolution: "@aws-sdk/lib-storage@npm:3.1086.0" + dependencies: + "@smithy/core": "npm:^3.29.2" + "@smithy/types": "npm:^4.16.0" + buffer: "npm:5.6.0" + events: "npm:3.3.0" + stream-browserify: "npm:3.0.0" + tslib: "npm:^2.6.2" + peerDependencies: + "@aws-sdk/client-s3": ^3.1086.0 + checksum: 10c0/fa84b5e4a625f08df2be60dd09e73e96d1f1244c673bacc7f8cb750b32ac9162b43fb3b9cd9c54660e0f097c5df7eb19dbf03b511da37dff604c950db59e951f + languageName: node + linkType: hard + "@aws-sdk/middleware-flexible-checksums@npm:^3.974.32": version: 3.974.32 resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.974.32" @@ -2408,13 +2424,13 @@ __metadata: languageName: node linkType: hard -"@backstage-community/plugin-rbac-common@npm:^1.26.1, @backstage-community/plugin-rbac-common@npm:^1.27.0": - version: 1.27.0 - resolution: "@backstage-community/plugin-rbac-common@npm:1.27.0" +"@backstage-community/plugin-rbac-common@npm:^1.19.0, @backstage-community/plugin-rbac-common@npm:^1.26.1, @backstage-community/plugin-rbac-common@npm:^1.27.0": + version: 1.29.0 + resolution: "@backstage-community/plugin-rbac-common@npm:1.29.0" peerDependencies: - "@backstage/errors": ^1.3.0 - "@backstage/plugin-permission-common": ^0.9.8 - checksum: 10c0/198593041500f78b742760e20b39e2e8b97caf7dc84d1894e377d4bef83db8792bee63e164f513a22c50147e0cbf333ed8321c86143d7dee181c4ec99f73a109 + "@backstage/errors": ^1.3.1 + "@backstage/plugin-permission-common": ^0.9.9 + checksum: 10c0/0503a0eeae5a91e301f461f04d271ba23256f8bbc2b468f343a8672e90f01270642239a6d82786efcf978f0de9be917e06c4fec49687f490d19c68043c797d1b languageName: node linkType: hard @@ -2730,7 +2746,31 @@ __metadata: languageName: node linkType: hard -"@backstage/backend-plugin-api@npm:1.9.2, @backstage/backend-plugin-api@npm:^1.8.0, @backstage/backend-plugin-api@npm:^1.9.0, @backstage/backend-plugin-api@npm:^1.9.2": +"@backstage/backend-openapi-utils@npm:^0.7.0": + version: 0.7.0 + resolution: "@backstage/backend-openapi-utils@npm:0.7.0" + dependencies: + "@apidevtools/swagger-parser": "npm:^10.1.0" + "@backstage/backend-plugin-api": "npm:^1.9.3" + "@backstage/errors": "npm:^1.3.1" + "@backstage/types": "npm:^1.2.2" + "@types/express": "npm:^4.17.6" + "@types/express-serve-static-core": "npm:^4.17.5" + ajv: "npm:^8.16.0" + express: "npm:^4.22.0" + express-openapi-validator: "npm:^5.5.8" + express-promise-router: "npm:^4.1.0" + get-port: "npm:^5.1.1" + json-schema-to-ts: "npm:^3.0.0" + lodash: "npm:^4.17.21" + mockttp: "npm:^3.13.0" + openapi-merge: "npm:^1.3.2" + openapi3-ts: "npm:^3.1.2" + checksum: 10c0/e64cbaee1bab945407e8db3776e0cef240e88135fdc2433e6fbc3d959d59e85a6f8d631ca758c2d4dbaff1deba0ae185ca0175b7efca187b545b54c25ac283d2 + languageName: node + linkType: hard + +"@backstage/backend-plugin-api@npm:1.9.2": version: 1.9.2 resolution: "@backstage/backend-plugin-api@npm:1.9.2" dependencies: @@ -2751,6 +2791,27 @@ __metadata: languageName: node linkType: hard +"@backstage/backend-plugin-api@npm:^1.8.0, @backstage/backend-plugin-api@npm:^1.9.0, @backstage/backend-plugin-api@npm:^1.9.2, @backstage/backend-plugin-api@npm:^1.9.3": + version: 1.9.3 + resolution: "@backstage/backend-plugin-api@npm:1.9.3" + dependencies: + "@backstage/cli-common": "npm:^0.3.0" + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/plugin-auth-node": "npm:^0.7.3" + "@backstage/plugin-permission-common": "npm:^0.9.9" + "@backstage/plugin-permission-node": "npm:^0.11.2" + "@backstage/types": "npm:^1.2.2" + "@types/express": "npm:^4.17.6" + "@types/json-schema": "npm:^7.0.6" + "@types/luxon": "npm:^3.0.0" + knex: "npm:^3.0.0" + luxon: "npm:^3.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + checksum: 10c0/cf8547920e88bc94b812aae4b93a2d68dcf8e1cba0aa9065ca4530b795f6e89a9ec8e184a4e44ed342612ec2bb4fb25e195325a25b08edd1264b3e2de76208c2 + languageName: node + linkType: hard + "@backstage/backend-test-utils@npm:1.11.4": version: 1.11.4 resolution: "@backstage/backend-test-utils@npm:1.11.4" @@ -2795,7 +2856,7 @@ __metadata: languageName: node linkType: hard -"@backstage/catalog-client@npm:1.16.0, @backstage/catalog-client@npm:^1.14.0, @backstage/catalog-client@npm:^1.16.0": +"@backstage/catalog-client@npm:1.16.0": version: 1.16.0 resolution: "@backstage/catalog-client@npm:1.16.0" dependencies: @@ -2810,7 +2871,22 @@ __metadata: languageName: node linkType: hard -"@backstage/catalog-model@npm:1.9.0, @backstage/catalog-model@npm:^1.7.7, @backstage/catalog-model@npm:^1.9.0": +"@backstage/catalog-client@npm:^1.14.0, @backstage/catalog-client@npm:^1.15.0, @backstage/catalog-client@npm:^1.15.1, @backstage/catalog-client@npm:^1.16.0, @backstage/catalog-client@npm:^1.16.1": + version: 1.16.1 + resolution: "@backstage/catalog-client@npm:1.16.1" + dependencies: + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/errors": "npm:^1.3.1" + "@backstage/filter-predicates": "npm:^0.1.4" + "@backstage/plugin-catalog-common": "npm:^1.1.10" + cross-fetch: "npm:^4.0.0" + lodash: "npm:^4.17.21" + uri-template: "npm:^2.0.0" + checksum: 10c0/4b00fbada78234dd7a17863cef6134193b6d0396888cbcbfcda397d7321c594826f4f092d6bd6ac725e32a91ac3baf44a53a3bab5645ac7ef7c7ee803388f64f + languageName: node + linkType: hard + +"@backstage/catalog-model@npm:1.9.0, @backstage/catalog-model@npm:^1.7.7, @backstage/catalog-model@npm:^1.8.0, @backstage/catalog-model@npm:^1.9.0": version: 1.9.0 resolution: "@backstage/catalog-model@npm:1.9.0" dependencies: @@ -2848,6 +2924,16 @@ __metadata: languageName: node linkType: hard +"@backstage/cli-common@npm:^0.3.0": + version: 0.3.0 + resolution: "@backstage/cli-common@npm:0.3.0" + dependencies: + "@backstage/errors": "npm:^1.3.1" + cross-spawn: "npm:^7.0.3" + checksum: 10c0/c6ae3bf3697bf463e0043150c0e56e4075ff9fd516e786593845c02de47ee72c4dad64cc1cfd9f54685b11ba9ed075ffa11eb764cc65da58ca3367da18a5dca1 + languageName: node + linkType: hard + "@backstage/cli-defaults@npm:0.1.3, @backstage/cli-defaults@npm:^0.1.3": version: 0.1.3 resolution: "@backstage/cli-defaults@npm:0.1.3" @@ -3317,7 +3403,7 @@ __metadata: languageName: node linkType: hard -"@backstage/core-app-api@npm:1.20.2, @backstage/core-app-api@npm:^1.20.2": +"@backstage/core-app-api@npm:1.20.2": version: 1.20.2 resolution: "@backstage/core-app-api@npm:1.20.2" dependencies: @@ -3346,7 +3432,36 @@ __metadata: languageName: node linkType: hard -"@backstage/core-compat-api@npm:0.5.12, @backstage/core-compat-api@npm:^0.5.12": +"@backstage/core-app-api@npm:^1.20.0, @backstage/core-app-api@npm:^1.20.2, @backstage/core-app-api@npm:^1.20.3": + version: 1.20.3 + resolution: "@backstage/core-app-api@npm:1.20.3" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.17.0" + "@backstage/version-bridge": "npm:^1.0.12" + "@types/prop-types": "npm:^15.7.3" + history: "npm:^5.0.0" + i18next: "npm:^22.4.15" + lodash: "npm:^4.17.21" + prop-types: "npm:^15.7.2" + react-use: "npm:^17.2.4" + zen-observable: "npm:^0.10.0" + zod: "npm:^3.25.76 || ^4.0.0" + 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/505b3dac1d91c4f5ae0e63eca9bf619e2f1e9559833036dd190fa81fab9db2908064aa89c0e9ecf15c452a558f48d23c41951a0403b5c3abb44cf292bd6202e9 + languageName: node + linkType: hard + +"@backstage/core-compat-api@npm:0.5.12": version: 0.5.12 resolution: "@backstage/core-compat-api@npm:0.5.12" dependencies: @@ -3371,7 +3486,32 @@ __metadata: languageName: node linkType: hard -"@backstage/core-components@npm:0.18.11, @backstage/core-components@npm:^0.18.11, @backstage/core-components@npm:^0.18.8": +"@backstage/core-compat-api@npm:^0.5.10, @backstage/core-compat-api@npm:^0.5.11, @backstage/core-compat-api@npm:^0.5.12, @backstage/core-compat-api@npm:^0.5.13": + version: 0.5.13 + resolution: "@backstage/core-compat-api@npm:0.5.13" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/filter-predicates": "npm:^0.1.4" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/plugin-app-react": "npm:^0.2.5" + "@backstage/plugin-catalog-react": "npm:^3.2.0" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + lodash: "npm:^4.17.21" + 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/63ad4d56aea675e6764488069922d091652e411e64fcf98618b00a71b32a300896312d6b15a22b5b97d8e253741c94bbcd0babc9f44b7a9f2bc6a14d74202b69 + languageName: node + linkType: hard + +"@backstage/core-components@npm:0.18.11": version: 0.18.11 resolution: "@backstage/core-components@npm:0.18.11" dependencies: @@ -3429,7 +3569,66 @@ __metadata: languageName: node linkType: hard -"@backstage/core-plugin-api@npm:1.12.7, @backstage/core-plugin-api@npm:^1.12.4, @backstage/core-plugin-api@npm:^1.12.7": +"@backstage/core-components@npm:^0.18.10, @backstage/core-components@npm:^0.18.11, @backstage/core-components@npm:^0.18.12, @backstage/core-components@npm:^0.18.8, @backstage/core-components@npm:^0.18.9": + version: 0.18.12 + resolution: "@backstage/core-components@npm:0.18.12" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/theme": "npm:^0.7.3" + "@backstage/ui": "npm:^0.17.0" + "@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" + "@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" + "@testing-library/react": "npm:^16.0.0" + "@types/react-sparklines": "npm:^1.7.0" + ansi-regex: "npm:^6.0.1" + classnames: "npm:^2.2.6" + csstype: "npm:^3.0.2" + d3-selection: "npm:^3.0.0" + d3-shape: "npm:^3.0.0" + d3-zoom: "npm:^3.0.0" + js-yaml: "npm:^4.2.0" + linkify-react: "npm:4.3.2" + linkifyjs: "npm:4.3.2" + lodash: "npm:^4.17.21" + parse5: "npm:^6.0.0" + qs: "npm:^6.15.2" + rc-progress: "npm:3.5.1" + react-full-screen: "npm:^1.1.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" + 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.25.76 || ^4.0.0" + 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/fa94668cf0f8facac7512dc8b2fff70c3dceefcfee569ae2983aa67e72452b35120674f1123a91a965781ae27bd9fa3bdf8af22d88dc6c15cc8220013e500627 + languageName: node + linkType: hard + +"@backstage/core-plugin-api@npm:1.12.7": version: 1.12.7 resolution: "@backstage/core-plugin-api@npm:1.12.7" dependencies: @@ -3452,6 +3651,29 @@ __metadata: languageName: node linkType: hard +"@backstage/core-plugin-api@npm:^1.12.4, @backstage/core-plugin-api@npm:^1.12.5, @backstage/core-plugin-api@npm:^1.12.6, @backstage/core-plugin-api@npm:^1.12.7, @backstage/core-plugin-api@npm:^1.12.8": + version: 1.12.8 + resolution: "@backstage/core-plugin-api@npm:1.12.8" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + history: "npm:^5.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + 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/87d99483edca1969a6d56f91b9dccdd1ec544f67f566c0abf15ecfc67984b0322c18128defa841de8fdaaab89be931e8d38a70b14359868056ddd458cbd283bd + languageName: node + linkType: hard + "@backstage/errors@npm:1.3.1, @backstage/errors@npm:^1.2.7, @backstage/errors@npm:^1.3.0, @backstage/errors@npm:^1.3.1": version: 1.3.1 resolution: "@backstage/errors@npm:1.3.1" @@ -3472,16 +3694,16 @@ __metadata: languageName: node linkType: hard -"@backstage/filter-predicates@npm:^0.1.1, @backstage/filter-predicates@npm:^0.1.3": - version: 0.1.3 - resolution: "@backstage/filter-predicates@npm:0.1.3" +"@backstage/filter-predicates@npm:^0.1.1, @backstage/filter-predicates@npm:^0.1.2, @backstage/filter-predicates@npm:^0.1.3, @backstage/filter-predicates@npm:^0.1.4": + version: 0.1.4 + resolution: "@backstage/filter-predicates@npm:0.1.4" dependencies: "@backstage/config": "npm:^1.3.8" "@backstage/errors": "npm:^1.3.1" "@backstage/types": "npm:^1.2.2" zod: "npm:^3.25.76 || ^4.0.0" - zod-validation-error: "npm:^4.0.2" - checksum: 10c0/73cbf7c1719492b56a18c19494e98df0896cad7838b834ca18df3b184bd599a3bb612b9cb6302a1a69546a2bcfe1056d862772cc91844d124692c5eddf95de18 + zod-validation-error: "npm:^5.0.0" + checksum: 10c0/0e54760800797c45df47f58f0c1138cd2667939f0d1a4b83c63466fed82b293ffc144751bf98684b2e61edcc111c1cb34ebf607f19befd361e9b8f061f04d1cc languageName: node linkType: hard @@ -3559,7 +3781,7 @@ __metadata: languageName: node linkType: hard -"@backstage/frontend-plugin-api@npm:0.17.2, @backstage/frontend-plugin-api@npm:^0.17.2": +"@backstage/frontend-plugin-api@npm:0.17.2": version: 0.17.2 resolution: "@backstage/frontend-plugin-api@npm:0.17.2" dependencies: @@ -3605,6 +3827,53 @@ __metadata: languageName: node linkType: hard +"@backstage/frontend-plugin-api@npm:^0.16.0, @backstage/frontend-plugin-api@npm:^0.16.2": + version: 0.16.2 + resolution: "@backstage/frontend-plugin-api@npm:0.16.2" + dependencies: + "@backstage/errors": "npm:^1.3.0" + "@backstage/filter-predicates": "npm:^0.1.2" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + "@standard-schema/spec": "npm:^1.1.0" + zod: "npm:^4.0.0" + 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/7308d6417d922f285446cf8f59d98f807fa69bfcfe22e6db7be0cf8640b67bbecad4520c009bce8a3e21dd29f938e8c154b51472e56918dac06bae9a0dccaeb0 + languageName: node + linkType: hard + +"@backstage/frontend-plugin-api@npm:^0.17.0, @backstage/frontend-plugin-api@npm:^0.17.2, @backstage/frontend-plugin-api@npm:^0.17.3": + version: 0.17.3 + resolution: "@backstage/frontend-plugin-api@npm:0.17.3" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/filter-predicates": "npm:^0.1.4" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + "@standard-schema/spec": "npm:^1.1.0" + zod: "npm:^4.0.0" + 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/d321dd4e37d655a2b1e5a4b50aa280d5d21e9b96dc674505bce2b35820c33e04926f89a9335c3f1ea658e4321d6480efb7ce75eb2729fbeeb07af40d426cd7be + languageName: node + linkType: hard + "@backstage/frontend-test-utils@npm:0.6.1": version: 0.6.1 resolution: "@backstage/frontend-test-utils@npm:0.6.1" @@ -3671,7 +3940,7 @@ __metadata: languageName: node linkType: hard -"@backstage/integration-react@npm:1.2.19, @backstage/integration-react@npm:^1.2.19": +"@backstage/integration-react@npm:1.2.19": version: 1.2.19 resolution: "@backstage/integration-react@npm:1.2.19" dependencies: @@ -3692,6 +3961,27 @@ __metadata: languageName: node linkType: hard +"@backstage/integration-react@npm:^1.2.17, @backstage/integration-react@npm:^1.2.19, @backstage/integration-react@npm:^1.2.20": + version: 1.2.20 + resolution: "@backstage/integration-react@npm:1.2.20" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/integration": "npm:^2.0.3" + "@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.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/fe94dae7691c206ba325207fce9849d13142783583af62a661bba2718aff3dc4c5781837fce31cbf948bfd255c452c14886b76aa80af5a8bea32f7e9ee985991 + languageName: node + linkType: hard + "@backstage/integration@npm:^2.0.0, @backstage/integration@npm:^2.0.3": version: 2.0.3 resolution: "@backstage/integration@npm:2.0.3" @@ -3807,7 +4097,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-app-react@npm:^0.2.1, @backstage/plugin-app-react@npm:^0.2.4": +"@backstage/plugin-app-react@npm:0.2.4": version: 0.2.4 resolution: "@backstage/plugin-app-react@npm:0.2.4" dependencies: @@ -3826,6 +4116,25 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-app-react@npm:^0.2.1, @backstage/plugin-app-react@npm:^0.2.3, @backstage/plugin-app-react@npm:^0.2.4, @backstage/plugin-app-react@npm:^0.2.5": + version: 0.2.5 + resolution: "@backstage/plugin-app-react@npm:0.2.5" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/frontend-plugin-api": "npm:^0.17.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.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/9f570ec91eb2799e60193e9734a7d5e7981fb3314b7e297cb60df9f2734cfdc8e0c42296a7feef184c23ea4a38e9826eeba4cd6828dfba6bf08d2031f39853e9 + languageName: node + linkType: hard + "@backstage/plugin-app-visualizer@npm:0.2.5": version: 0.2.5 resolution: "@backstage/plugin-app-visualizer@npm:0.2.5" @@ -4145,7 +4454,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-auth-node@npm:0.7.2, @backstage/plugin-auth-node@npm:^0.7.0, @backstage/plugin-auth-node@npm:^0.7.2": +"@backstage/plugin-auth-node@npm:0.7.2": version: 0.7.2 resolution: "@backstage/plugin-auth-node@npm:0.7.2" dependencies: @@ -4191,6 +4500,29 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-auth-node@npm:^0.7.0, @backstage/plugin-auth-node@npm:^0.7.2, @backstage/plugin-auth-node@npm:^0.7.3": + version: 0.7.3 + resolution: "@backstage/plugin-auth-node@npm:0.7.3" + dependencies: + "@backstage/backend-plugin-api": "npm:^1.9.3" + "@backstage/catalog-client": "npm:^1.16.1" + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/types": "npm:^1.2.2" + "@types/express": "npm:^4.17.6" + "@types/passport": "npm:^1.0.3" + express: "npm:^4.22.0" + jose: "npm:^5.0.0" + lodash: "npm:^4.17.21" + passport: "npm:^0.7.0" + zod: "npm:^3.25.76 || ^4.0.0" + zod-to-json-schema: "npm:^3.25.1" + zod-validation-error: "npm:^5.0.0" + checksum: 10c0/faf274cc6d13193ef8aa6daa8dba33219ee8661029e603c6eb8e80f3ed7a35860a7b5603b2667c61b9c2df976a1ede836467ee3a94be08b4b31cb910fea10f90 + languageName: node + linkType: hard + "@backstage/plugin-auth-react@npm:0.1.28": version: 0.1.28 resolution: "@backstage/plugin-auth-react@npm:0.1.28" @@ -4294,7 +4626,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog-common@npm:1.1.10, @backstage/plugin-catalog-common@npm:^1.1.10": +"@backstage/plugin-catalog-common@npm:1.1.10, @backstage/plugin-catalog-common@npm:^1.1.10, @backstage/plugin-catalog-common@npm:^1.1.9": version: 1.1.10 resolution: "@backstage/plugin-catalog-common@npm:1.1.10" dependencies: @@ -4377,7 +4709,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog-node@npm:2.2.2, @backstage/plugin-catalog-node@npm:^2.1.0, @backstage/plugin-catalog-node@npm:^2.2.2": +"@backstage/plugin-catalog-node@npm:2.2.2": version: 2.2.2 resolution: "@backstage/plugin-catalog-node@npm:2.2.2" dependencies: @@ -4401,7 +4733,31 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog-react@npm:3.1.0, @backstage/plugin-catalog-react@npm:^3.1.0": +"@backstage/plugin-catalog-node@npm:^2.1.0, @backstage/plugin-catalog-node@npm:^2.2.2, @backstage/plugin-catalog-node@npm:^2.2.3": + version: 2.2.3 + resolution: "@backstage/plugin-catalog-node@npm:2.2.3" + dependencies: + "@backstage/backend-plugin-api": "npm:^1.9.3" + "@backstage/catalog-client": "npm:^1.16.1" + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/errors": "npm:^1.3.1" + "@backstage/plugin-catalog-common": "npm:^1.1.10" + "@backstage/plugin-permission-common": "npm:^0.9.9" + "@backstage/plugin-permission-node": "npm:^0.11.2" + "@backstage/types": "npm:^1.2.2" + "@opentelemetry/api": "npm:^1.9.0" + lodash: "npm:^4.17.21" + yaml: "npm:^2.0.0" + peerDependencies: + "@backstage/backend-test-utils": ^1.11.5 + peerDependenciesMeta: + "@backstage/backend-test-utils": + optional: true + checksum: 10c0/57291ea0acbe791af9a3a88cc5461af481a29f7100f55f98fd970e89515df10f2df705484e6dce556dd083d298cdb843a724856043a42b064d272258d95135aa + languageName: node + linkType: hard + +"@backstage/plugin-catalog-react@npm:3.1.0": version: 3.1.0 resolution: "@backstage/plugin-catalog-react@npm:3.1.0" dependencies: @@ -4447,6 +4803,99 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-catalog-react@npm:3.2.0, @backstage/plugin-catalog-react@npm:^3.0.0, @backstage/plugin-catalog-react@npm:^3.1.0, @backstage/plugin-catalog-react@npm:^3.2.0": + version: 3.2.0 + resolution: "@backstage/plugin-catalog-react@npm:3.2.0" + dependencies: + "@backstage/catalog-client": "npm:^1.16.1" + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/core-compat-api": "npm:^0.5.13" + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/filter-predicates": "npm:^0.1.4" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/integration-react": "npm:^1.2.20" + "@backstage/plugin-permission-common": "npm:^0.9.9" + "@backstage/plugin-permission-react": "npm:^0.5.3" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.17.0" + "@backstage/version-bridge": "npm:^1.0.12" + "@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" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + classnames: "npm:^2.2.6" + lodash: "npm:^4.17.21" + material-ui-popup-state: "npm:^5.3.6" + qs: "npm:^6.15.2" + react-use: "npm:^17.2.4" + yaml: "npm:^2.0.0" + zen-observable: "npm:^0.10.0" + zod: "npm:^4.0.0" + peerDependencies: + "@backstage/frontend-test-utils": ^0.6.2 + "@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: + "@backstage/frontend-test-utils": + optional: true + "@types/react": + optional: true + checksum: 10c0/dee0b80998d0ab98c073e1dd688c6c4398e59f5a247402096a3d9b02c71e0f332f223203c530518ebc9e15347954c963f8e869ab03b7c37a4fda4e2ddbfc4244 + languageName: node + linkType: hard + +"@backstage/plugin-catalog-react@npm:^2.1.0, @backstage/plugin-catalog-react@npm:^2.1.2": + version: 2.1.4 + resolution: "@backstage/plugin-catalog-react@npm:2.1.4" + dependencies: + "@backstage/catalog-client": "npm:^1.15.0" + "@backstage/catalog-model": "npm:^1.8.0" + "@backstage/core-compat-api": "npm:^0.5.10" + "@backstage/core-components": "npm:^0.18.9" + "@backstage/core-plugin-api": "npm:^1.12.5" + "@backstage/errors": "npm:^1.3.0" + "@backstage/filter-predicates": "npm:^0.1.2" + "@backstage/frontend-plugin-api": "npm:^0.16.2" + "@backstage/integration-react": "npm:^1.2.17" + "@backstage/plugin-catalog-common": "npm:^1.1.9" + "@backstage/plugin-permission-common": "npm:^0.9.8" + "@backstage/plugin-permission-react": "npm:^0.5.0" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.14.2" + "@backstage/version-bridge": "npm:^1.0.12" + "@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" + "@remixicon/react": "npm:^4.6.0" + classnames: "npm:^2.2.6" + lodash: "npm:^4.17.21" + material-ui-popup-state: "npm:^5.3.6" + qs: "npm:^6.9.4" + react-use: "npm:^17.2.4" + yaml: "npm:^2.0.0" + zen-observable: "npm:^0.10.0" + zod: "npm:^4.0.0" + peerDependencies: + "@backstage/frontend-test-utils": ^0.5.2 + "@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: + "@backstage/frontend-test-utils": + optional: true + "@types/react": + optional: true + checksum: 10c0/581d670a099835254d12ff224db6c67e7b986e227b975ced5cb1f2df349011102b85434fc51d2e49a50c513613e3feab8e99a00224c852440cb3bfbbebbb2ca4 + languageName: node + linkType: hard + "@backstage/plugin-catalog-unprocessed-entities-common@npm:^0.0.16": version: 0.0.16 resolution: "@backstage/plugin-catalog-unprocessed-entities-common@npm:0.0.16" @@ -4486,7 +4935,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog@npm:2.0.6, @backstage/plugin-catalog@npm:^2.0.6": +"@backstage/plugin-catalog@npm:2.0.6": version: 2.0.6 resolution: "@backstage/plugin-catalog@npm:2.0.6" dependencies: @@ -4535,6 +4984,55 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-catalog@npm:2.0.7, @backstage/plugin-catalog@npm:^2.0.6": + version: 2.0.7 + resolution: "@backstage/plugin-catalog@npm:2.0.7" + dependencies: + "@backstage/catalog-client": "npm:^1.16.1" + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/core-compat-api": "npm:^0.5.13" + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/integration-react": "npm:^1.2.20" + "@backstage/plugin-catalog-common": "npm:^1.1.10" + "@backstage/plugin-catalog-react": "npm:^3.2.0" + "@backstage/plugin-permission-react": "npm:^0.5.3" + "@backstage/plugin-scaffolder-common": "npm:^2.2.1" + "@backstage/plugin-search-common": "npm:^1.2.24" + "@backstage/plugin-search-react": "npm:^1.11.6" + "@backstage/plugin-techdocs-common": "npm:^0.1.1" + "@backstage/plugin-techdocs-react": "npm:^1.3.13" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.17.0" + "@backstage/version-bridge": "npm:^1.0.12" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@mui/utils": "npm:^5.14.15" + "@remixicon/react": "npm:^4.6.0" + classnames: "npm:^2.3.1" + csv-stringify: "npm:^5.6.5" + dataloader: "npm:^2.0.0" + lodash: "npm:^4.17.21" + pluralize: "npm:^8.0.0" + react-helmet: "npm:6.1.0" + react-use: "npm:^17.2.4" + zen-observable: "npm:^0.10.0" + zod: "npm:^4.0.0" + 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/3fc39b278e5aa7468465f26ae19f37f016e9f7d4ba118af0b28848947a9d8112ece500a426873e6805a90a077abefea4fd0349ebe296f48d3bbc4e18c9d1af93 + languageName: node + linkType: hard + "@backstage/plugin-events-backend@npm:0.6.3, @backstage/plugin-events-backend@npm:^0.6.3": version: 0.6.3 resolution: "@backstage/plugin-events-backend@npm:0.6.3" @@ -4571,6 +5069,149 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-home-react@npm:^0.1.37, @backstage/plugin-home-react@npm:^0.1.38, @backstage/plugin-home-react@npm:^0.1.40": + version: 0.1.40 + resolution: "@backstage/plugin-home-react@npm:0.1.40" + dependencies: + "@backstage/core-compat-api": "npm:^0.5.13" + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@rjsf/utils": "npm:5.24.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.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/7fb6272d2b267c02df951151a87f5dd04ac7aedb5f2e8d85ff6ae11762cb2305da6bda1d026a7772e0c3d561123041401c32cbb1eb6aa449dd5a93fd2d9b306e + languageName: node + linkType: hard + +"@backstage/plugin-home@npm:0.9.4": + version: 0.9.4 + resolution: "@backstage/plugin-home@npm:0.9.4" + dependencies: + "@backstage/catalog-client": "npm:^1.15.0" + "@backstage/catalog-model": "npm:^1.8.0" + "@backstage/config": "npm:^1.3.7" + "@backstage/core-app-api": "npm:^1.20.0" + "@backstage/core-compat-api": "npm:^0.5.10" + "@backstage/core-components": "npm:^0.18.9" + "@backstage/core-plugin-api": "npm:^1.12.5" + "@backstage/frontend-plugin-api": "npm:^0.16.0" + "@backstage/plugin-catalog-react": "npm:^2.1.2" + "@backstage/plugin-home-react": "npm:^0.1.37" + "@backstage/theme": "npm:^0.7.3" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@rjsf/core": "npm:5.24.13" + "@rjsf/material-ui": "npm:5.24.13" + "@rjsf/utils": "npm:5.24.13" + "@rjsf/validator-ajv8": "npm:5.24.13" + lodash: "npm:^4.17.21" + luxon: "npm:^3.4.3" + react-grid-layout: "npm:1.3.4" + react-resizable: "npm:^3.0.4" + react-use: "npm:^17.2.4" + zod: "npm:^3.25.76 || ^4.0.0" + 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/20e932f3d85e1ae22ba5d4996b513ba504ccd6e80baace9634ece1a9b7df421bad25aae09ad5dabc314e9191a15bdf59f9439fbb574c74586c3cfc61a54cf79e + languageName: node + linkType: hard + +"@backstage/plugin-home@npm:^0.9.6": + version: 0.9.8 + resolution: "@backstage/plugin-home@npm:0.9.8" + dependencies: + "@backstage/catalog-client": "npm:^1.16.1" + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/config": "npm:^1.3.8" + "@backstage/core-app-api": "npm:^1.20.3" + "@backstage/core-compat-api": "npm:^0.5.13" + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/plugin-catalog-react": "npm:^3.2.0" + "@backstage/plugin-home-react": "npm:^0.1.40" + "@backstage/theme": "npm:^0.7.3" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@rjsf/core": "npm:5.24.13" + "@rjsf/material-ui": "npm:5.24.13" + "@rjsf/utils": "npm:5.24.13" + "@rjsf/validator-ajv8": "npm:5.24.13" + lodash: "npm:^4.17.21" + luxon: "npm:^3.4.3" + react-grid-layout: "npm:1.3.4" + react-resizable: "npm:^3.0.4" + react-use: "npm:^17.2.4" + zod: "npm:^3.25.76 || ^4.0.0" + 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/92000195570bf65f7bf2b7397b311b31804562e43350b8c3a92625e9ce2d4759ba14039865be349203b54520d72c08421688631cc3ac2ccf71428a8bb804e224 + languageName: node + linkType: hard + +"@backstage/plugin-notifications-common@npm:^0.2.1, @backstage/plugin-notifications-common@npm:^0.2.3": + version: 0.2.3 + resolution: "@backstage/plugin-notifications-common@npm:0.2.3" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/types": "npm:^1.2.2" + checksum: 10c0/d8a64fca1771d6b8b59d24f0fa06610484e5842c757b1fde4b7cdbd7ee98c6a35cbba0302a5208fcc6e9981b10a64123f8d73b8c0c07f400500f8fa749b28436 + languageName: node + linkType: hard + +"@backstage/plugin-notifications@npm:^0.5.15": + version: 0.5.19 + resolution: "@backstage/plugin-notifications@npm:0.5.19" + dependencies: + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/plugin-notifications-common": "npm:^0.2.3" + "@backstage/plugin-signals-react": "npm:^0.0.24" + "@backstage/theme": "npm:^0.7.3" + "@backstage/ui": "npm:^0.17.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + lodash: "npm:^4.17.21" + notistack: "npm:^3.0.1" + react-aria-components: "npm:~1.17.0" + react-relative-time: "npm:^0.0.9" + react-use: "npm:^17.2.4" + 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/ad348655ed3bce82b5c0b01ff1fbca9fd761fce6a17a48b7799e4916314df88e2136c08c84e625a0d925cc5870cf15660a6fcf7c2bcdd416165bd20b44ebb107 + languageName: node + linkType: hard + "@backstage/plugin-org@npm:0.7.5": version: 0.7.5 resolution: "@backstage/plugin-org@npm:0.7.5" @@ -4655,11 +5296,11 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-permission-node@npm:^0.11.1": - version: 0.11.1 - resolution: "@backstage/plugin-permission-node@npm:0.11.1" +"@backstage/plugin-permission-node@npm:^0.11.1, @backstage/plugin-permission-node@npm:^0.11.2": + version: 0.11.2 + resolution: "@backstage/plugin-permission-node@npm:0.11.2" dependencies: - "@backstage/backend-plugin-api": "npm:^1.9.2" + "@backstage/backend-plugin-api": "npm:^1.9.3" "@backstage/config": "npm:^1.3.8" "@backstage/errors": "npm:^1.3.1" "@backstage/plugin-permission-common": "npm:^0.9.9" @@ -4668,11 +5309,11 @@ __metadata: express-promise-router: "npm:^4.1.0" zod: "npm:^3.25.76 || ^4.0.0" zod-to-json-schema: "npm:^3.25.1" - checksum: 10c0/96efe0e8ccdecc4c640cf693d29988de226bd7cce9495e973d4e8ba7e26838bfa23678b47f668c2d33d1c1ea70b7613291a919bcbf67700cc507df316b637a8b + checksum: 10c0/70ac2494ff39fd55dfb82dad8f7be6fab91b0b21fdba3e978b2108b63cf4848f89f7bd38578629d71ddd072af7b3c4ad0c1d8916e20e4bdce88e8201c7e97d3d languageName: node linkType: hard -"@backstage/plugin-permission-react@npm:0.5.2, @backstage/plugin-permission-react@npm:^0.5.2": +"@backstage/plugin-permission-react@npm:0.5.2": version: 0.5.2 resolution: "@backstage/plugin-permission-react@npm:0.5.2" dependencies: @@ -4692,6 +5333,47 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-permission-react@npm:^0.4.41": + version: 0.4.41 + resolution: "@backstage/plugin-permission-react@npm:0.4.41" + dependencies: + "@backstage/config": "npm:^1.3.6" + "@backstage/core-plugin-api": "npm:^1.12.4" + "@backstage/plugin-permission-common": "npm:^0.9.7" + dataloader: "npm:^2.0.0" + swr: "npm:^2.0.0" + 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/d04a28f02cd98a0415f0ccc21b755fb88190bf3b1cf61c6f48086f4823d674ac25152fa14a5b273ae4232617e514334198efab670daae06aaa07b5ff1be7f4a6 + languageName: node + linkType: hard + +"@backstage/plugin-permission-react@npm:^0.5.0, @backstage/plugin-permission-react@npm:^0.5.2, @backstage/plugin-permission-react@npm:^0.5.3": + version: 0.5.3 + resolution: "@backstage/plugin-permission-react@npm:0.5.3" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/plugin-permission-common": "npm:^0.9.9" + dataloader: "npm:^2.0.0" + swr: "npm:^2.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/2cc5c076fdc7bf28aee8dd68b8073b2f1439a9d8f73b8fb486517f94d84493e4ab36ac3bd4ca92b235d4f41a4849757f288c253488c45821d2c052ef815a32e4 + languageName: node + linkType: hard + "@backstage/plugin-proxy-backend@npm:0.6.14": version: 0.6.14 resolution: "@backstage/plugin-proxy-backend@npm:0.6.14" @@ -4949,6 +5631,24 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-search-backend-module-catalog@npm:^0.3.13": + version: 0.3.17 + resolution: "@backstage/plugin-search-backend-module-catalog@npm:0.3.17" + dependencies: + "@backstage/backend-plugin-api": "npm:^1.9.3" + "@backstage/catalog-client": "npm:^1.16.1" + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/plugin-catalog-common": "npm:^1.1.10" + "@backstage/plugin-catalog-node": "npm:^2.2.3" + "@backstage/plugin-permission-common": "npm:^0.9.9" + "@backstage/plugin-search-backend-node": "npm:^1.4.6" + "@backstage/plugin-search-common": "npm:^1.2.24" + checksum: 10c0/3c4770c0d3864bf9acba4154285419fbce66b34b8f6c35fd78f5b25b28975929ccb2fda710681ec05cd5077eea8e85b7cf1910fbe3222a9b483a5186e313a373 + languageName: node + linkType: hard + "@backstage/plugin-search-backend-module-pg@npm:0.5.56": version: 0.5.56 resolution: "@backstage/plugin-search-backend-module-pg@npm:0.5.56" @@ -4963,11 +5663,45 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-search-backend-node@npm:^1.4.5": - version: 1.4.5 - resolution: "@backstage/plugin-search-backend-node@npm:1.4.5" +"@backstage/plugin-search-backend-module-pg@npm:^0.5.53": + version: 0.5.57 + resolution: "@backstage/plugin-search-backend-module-pg@npm:0.5.57" dependencies: - "@backstage/backend-plugin-api": "npm:^1.9.2" + "@backstage/backend-plugin-api": "npm:^1.9.3" + "@backstage/config": "npm:^1.3.8" + "@backstage/plugin-search-backend-node": "npm:^1.4.6" + "@backstage/plugin-search-common": "npm:^1.2.24" + knex: "npm:^3.0.0" + lodash: "npm:^4.17.21" + checksum: 10c0/c63a01b062c3d0daaf94da33410a107c9fe590d2615e9ac49e84b975f31ae370a2e39fbcb050c0bd01075e31de9da0026e725a74ace951c4c47ba7cea6c60d3d + languageName: node + linkType: hard + +"@backstage/plugin-search-backend-module-techdocs@npm:^0.4.12": + version: 0.4.16 + resolution: "@backstage/plugin-search-backend-module-techdocs@npm:0.4.16" + dependencies: + "@backstage/backend-plugin-api": "npm:^1.9.3" + "@backstage/catalog-client": "npm:^1.16.1" + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/config": "npm:^1.3.8" + "@backstage/plugin-catalog-common": "npm:^1.1.10" + "@backstage/plugin-catalog-node": "npm:^2.2.3" + "@backstage/plugin-permission-common": "npm:^0.9.9" + "@backstage/plugin-search-backend-node": "npm:^1.4.6" + "@backstage/plugin-search-common": "npm:^1.2.24" + "@backstage/plugin-techdocs-node": "npm:^1.15.2" + lodash: "npm:^4.17.21" + p-limit: "npm:^3.1.0" + checksum: 10c0/f1d7a59e665b222ba72e60b6017b604f8f226a6263b2662a7dc867d44b0643ab6e79b88c43beffdccc6b570133b617341b61846e6b6861964869ebcb50988a33 + languageName: node + linkType: hard + +"@backstage/plugin-search-backend-node@npm:^1.4.5, @backstage/plugin-search-backend-node@npm:^1.4.6": + version: 1.4.6 + resolution: "@backstage/plugin-search-backend-node@npm:1.4.6" + dependencies: + "@backstage/backend-plugin-api": "npm:^1.9.3" "@backstage/config": "npm:^1.3.8" "@backstage/errors": "npm:^1.3.1" "@backstage/plugin-permission-common": "npm:^0.9.9" @@ -4976,7 +5710,7 @@ __metadata: lodash: "npm:^4.17.21" lunr: "npm:^2.3.9" ndjson: "npm:^2.0.0" - checksum: 10c0/43980226ce3292429917d7a7beb57ca154b29f9fd66c5e0948bcce7e7dd6c1abf87fa25473e727167598b5ecc7090f3f49a57a5c44e31b6a77f6dc80793d977f + checksum: 10c0/2e5ade4acbad4355b0db2d31440c1e9dc551604c98c2c3f30b8b7aae8c4649cb05e40f9e329d6b7a9d93f804d029ea38d01288247b2c46aa4a7feb2eb88829b5 languageName: node linkType: hard @@ -5002,7 +5736,29 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-search-common@npm:1.2.24, @backstage/plugin-search-common@npm:^1.2.24": +"@backstage/plugin-search-backend@npm:^2.1.0": + version: 2.1.4 + resolution: "@backstage/plugin-search-backend@npm:2.1.4" + dependencies: + "@backstage/backend-openapi-utils": "npm:^0.7.0" + "@backstage/backend-plugin-api": "npm:^1.9.3" + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/plugin-permission-common": "npm:^0.9.9" + "@backstage/plugin-permission-node": "npm:^0.11.2" + "@backstage/plugin-search-backend-node": "npm:^1.4.6" + "@backstage/plugin-search-common": "npm:^1.2.24" + "@backstage/types": "npm:^1.2.2" + dataloader: "npm:^2.0.0" + express: "npm:^4.22.0" + lodash: "npm:^4.17.21" + qs: "npm:^6.15.2" + zod: "npm:^3.25.76 || ^4.0.0" + checksum: 10c0/c5334503c8eb715b46a7bbbccc268f5adeca45704835a431ab803b1f0aab55e0121cdbaa7c344c491f65a4de93e9632f7f0bfdaea1746f7a5f8f9a5689a0a9d3 + languageName: node + linkType: hard + +"@backstage/plugin-search-common@npm:1.2.24, @backstage/plugin-search-common@npm:^1.2.22, @backstage/plugin-search-common@npm:^1.2.24": version: 1.2.24 resolution: "@backstage/plugin-search-common@npm:1.2.24" dependencies: @@ -5012,7 +5768,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-search-react@npm:1.11.5, @backstage/plugin-search-react@npm:^1.11.5": +"@backstage/plugin-search-react@npm:1.11.5": version: 1.11.5 resolution: "@backstage/plugin-search-react@npm:1.11.5" dependencies: @@ -5042,6 +5798,36 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-search-react@npm:^1.11.0, @backstage/plugin-search-react@npm:^1.11.4, @backstage/plugin-search-react@npm:^1.11.5, @backstage/plugin-search-react@npm:^1.11.6": + version: 1.11.6 + resolution: "@backstage/plugin-search-react@npm:1.11.6" + dependencies: + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/plugin-search-common": "npm:^1.2.24" + "@backstage/theme": "npm:^0.7.3" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + lodash: "npm:^4.17.21" + qs: "npm:^6.15.2" + react-use: "npm:^17.3.2" + zod: "npm:^4.0.0" + 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/47e0593024492134d1695c0cf6ac177ec51fd9127c2be2006145fb643e8cded902a8c0315caf7d576fb98666d4d1bb466f4f63353647841da88e43fafbbabff5 + languageName: node + linkType: hard + "@backstage/plugin-search@npm:1.7.5": version: 1.7.5 resolution: "@backstage/plugin-search@npm:1.7.5" @@ -5073,6 +5859,37 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-search@npm:^1.7.0": + version: 1.7.6 + resolution: "@backstage/plugin-search@npm:1.7.6" + dependencies: + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/plugin-catalog-react": "npm:^3.2.0" + "@backstage/plugin-search-common": "npm:^1.2.24" + "@backstage/plugin-search-react": "npm:^1.11.6" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.17.0" + "@backstage/version-bridge": "npm:^1.0.12" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + qs: "npm:^6.15.2" + react-use: "npm:^17.2.4" + zod: "npm:^4.0.0" + 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/5a904fe4dd8b4c0a0546f64db0e07b82b0fc393e8e03c7dc78d42cb412e9f73d5777328e434696d41f8c96709f35742c5a6ca1c17924a00cacd7ec2febbbca63 + languageName: node + linkType: hard + "@backstage/plugin-signals-node@npm:^0.2.2": version: 0.2.2 resolution: "@backstage/plugin-signals-node@npm:0.2.2" @@ -5084,6 +5901,25 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-signals-react@npm:^0.0.20": + version: 0.0.20 + resolution: "@backstage/plugin-signals-react@npm:0.0.20" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.4" + "@backstage/types": "npm:^1.2.2" + "@material-ui/core": "npm:^4.12.4" + 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/49b43501979ffb1f9f5c3dc0cc5606249bdde3c8952bfeca0257dc686b49a843022056613b401ff58f551437fc9b5a450aef04494b154a1ca0e29d72a33b0668 + languageName: node + linkType: hard + "@backstage/plugin-signals-react@npm:^0.0.23": version: 0.0.23 resolution: "@backstage/plugin-signals-react@npm:0.0.23" @@ -5103,6 +5939,25 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-signals-react@npm:^0.0.24": + version: 0.0.24 + resolution: "@backstage/plugin-signals-react@npm:0.0.24" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/types": "npm:^1.2.2" + "@material-ui/core": "npm:^4.12.4" + 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/3f886d6dbf589dcb81fda31bc971d32ce4afb01fca78db7f2723ef9250823ca0ca6625b1373a9ee85fe71ffb8d48e9a708e494ecf8044a67d783f32e77e4c2ad + languageName: node + linkType: hard + "@backstage/plugin-techdocs-common@npm:^0.1.1": version: 0.1.1 resolution: "@backstage/plugin-techdocs-common@npm:0.1.1" @@ -5110,15 +5965,52 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-techdocs-react@npm:^1.3.12": - version: 1.3.12 - resolution: "@backstage/plugin-techdocs-react@npm:1.3.12" +"@backstage/plugin-techdocs-node@npm:^1.15.2": + version: 1.15.2 + resolution: "@backstage/plugin-techdocs-node@npm:1.15.2" dependencies: + "@aws-sdk/client-s3": "npm:^3.350.0" + "@aws-sdk/credential-providers": "npm:^3.350.0" + "@aws-sdk/lib-storage": "npm:^3.350.0" + "@aws-sdk/types": "npm:^3.347.0" + "@azure/identity": "npm:^4.0.0" + "@azure/storage-blob": "npm:^12.5.0" + "@backstage/backend-plugin-api": "npm:^1.9.3" "@backstage/catalog-model": "npm:^1.9.0" "@backstage/config": "npm:^1.3.8" - "@backstage/core-components": "npm:^0.18.11" - "@backstage/core-plugin-api": "npm:^1.12.7" - "@backstage/frontend-plugin-api": "npm:^0.17.2" + "@backstage/errors": "npm:^1.3.1" + "@backstage/integration": "npm:^2.0.3" + "@backstage/integration-aws-node": "npm:^0.2.0" + "@backstage/plugin-search-common": "npm:^1.2.24" + "@backstage/plugin-techdocs-common": "npm:^0.1.1" + "@google-cloud/storage": "npm:^7.0.0" + "@smithy/node-http-handler": "npm:^3.0.0" + "@trendyol-js/openstack-swift-sdk": "npm:^0.0.7" + "@types/express": "npm:^4.17.6" + dockerode: "npm:^4.0.0" + express: "npm:^4.22.0" + fs-extra: "npm:^11.2.0" + git-url-parse: "npm:^15.0.0" + hpagent: "npm:^1.2.0" + js-yaml: "npm:^4.2.0" + json5: "npm:^2.1.3" + mime-types: "npm:^2.1.27" + p-limit: "npm:^3.1.0" + recursive-readdir: "npm:^2.2.2" + winston: "npm:^3.2.1" + checksum: 10c0/e681281d1147e4a2fcd77f03c1cc4e45582b5836f60feca67a7aaa37da4c40ebc7a8518d8e8d8a94d3e787e939464172f14f14f81e2ac71863d25b5406701640 + languageName: node + linkType: hard + +"@backstage/plugin-techdocs-react@npm:^1.3.12, @backstage/plugin-techdocs-react@npm:^1.3.13": + version: 1.3.13 + resolution: "@backstage/plugin-techdocs-react@npm:1.3.13" + dependencies: + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/config": "npm:^1.3.8" + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/frontend-plugin-api": "npm:^0.17.3" "@backstage/plugin-techdocs-common": "npm:^0.1.1" "@backstage/version-bridge": "npm:^1.0.12" "@material-ui/core": "npm:^4.12.2" @@ -5134,7 +6026,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/606932860c98a032652ebb866e6f12d83a9d34517ef6d29ca4431ae7315921de70d5f3dbdb3b0d89dd8e99257a9d6abec38f3853cda4b9ca6042b1797c928043 + checksum: 10c0/9277b4a14cdedfd1f29156b564e451dd659d2e7cb53ef2ba25622e6179c58bce7da2d0cbe59ce11f589d950398ffeb79653dc19b3cee6144062b865db6a89102 languageName: node linkType: hard @@ -5166,7 +6058,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-user-settings@npm:0.9.4, @backstage/plugin-user-settings@npm:^0.9.1": +"@backstage/plugin-user-settings@npm:0.9.4": version: 0.9.4 resolution: "@backstage/plugin-user-settings@npm:0.9.4" dependencies: @@ -5200,6 +6092,40 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-user-settings@npm:^0.9.1, @backstage/plugin-user-settings@npm:^0.9.3": + version: 0.9.5 + resolution: "@backstage/plugin-user-settings@npm:0.9.5" + dependencies: + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/core-app-api": "npm:^1.20.3" + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/plugin-catalog-react": "npm:^3.2.0" + "@backstage/plugin-signals-react": "npm:^0.0.24" + "@backstage/plugin-user-settings-common": "npm:^0.1.0" + "@backstage/theme": "npm:^0.7.3" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.17.0" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + dataloader: "npm:^2.0.0" + react-use: "npm:^17.2.4" + zen-observable: "npm:^0.10.0" + 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/14ed2ad26aac9bdaec16056f772ce22faac04859164318da420d41d3c2ac0cd12454dce358471449c02d93dc44cf9c36157d67b7e7a27eb33c63ecac1b84c4fd + languageName: node + linkType: hard + "@backstage/release-manifests@npm:^0.0.13": version: 0.0.13 resolution: "@backstage/release-manifests@npm:0.0.13" @@ -5293,6 +6219,57 @@ __metadata: languageName: node linkType: hard +"@backstage/ui@npm:^0.14.2": + version: 0.14.3 + resolution: "@backstage/ui@npm:0.14.3" + dependencies: + "@backstage/version-bridge": "npm:^1.0.12" + "@remixicon/react": "npm:^4.6.0" + "@tanstack/react-table": "npm:^8.21.3" + clsx: "npm:^2.1.1" + react-aria: "npm:~3.48.0" + react-aria-components: "npm:~1.17.0" + react-stately: "npm:~3.46.0" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/1b1854db882f94d605ee270160cb95b72e8e8328b2fcc638d03590a27f3e4579da04272059168bbf152baf3bdf7b91e8d1ed55659bd80bde582fa5d8f20e7c72 + languageName: node + linkType: hard + +"@backstage/ui@npm:^0.17.0": + version: 0.17.0 + resolution: "@backstage/ui@npm:0.17.0" + dependencies: + "@backstage/version-bridge": "npm:^1.0.12" + "@braintree/sanitize-url": "npm:^7.1.2" + "@internationalized/date": "npm:^3.12.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + "@tanstack/react-table": "npm:^8.21.3" + clsx: "npm:^2.1.1" + marked: "npm:^15.0.12" + react-aria: "npm:~3.48.0" + react-aria-components: "npm:~1.17.0" + react-stately: "npm:~3.46.0" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/0e36fa81bfc6b872ef69e369e00fae6a020232e49e6997bb81ba027f783d6a8a539ecc761ed93cf5b80c2810ee71a20ef27e475f2a33b8343333c699348ad68d + languageName: node + linkType: hard + "@backstage/version-bridge@npm:^1.0.12": version: 1.0.12 resolution: "@backstage/version-bridge@npm:1.0.12" @@ -5705,7 +6682,7 @@ __metadata: languageName: node linkType: hard -"@emotion/hash@npm:^0.9.2": +"@emotion/hash@npm:^0.9.1, @emotion/hash@npm:^0.9.2": version: 0.9.2 resolution: "@emotion/hash@npm:0.9.2" checksum: 10c0/0dc254561a3cc0a06a10bbce7f6a997883fd240c8c1928b93713f803a2e9153a257a488537012efe89dbe1246f2abfe2add62cdb3471a13d67137fcb808e81c2 @@ -8665,6 +9642,37 @@ __metadata: languageName: node linkType: hard +"@mui/styles@npm:5.18.0": + version: 5.18.0 + resolution: "@mui/styles@npm:5.18.0" + dependencies: + "@babel/runtime": "npm:^7.23.9" + "@emotion/hash": "npm:^0.9.1" + "@mui/private-theming": "npm:^5.17.1" + "@mui/types": "npm:~7.2.15" + "@mui/utils": "npm:^5.17.1" + clsx: "npm:^2.1.0" + csstype: "npm:^3.1.3" + hoist-non-react-statics: "npm:^3.3.2" + jss: "npm:^10.10.0" + jss-plugin-camel-case: "npm:^10.10.0" + jss-plugin-default-unit: "npm:^10.10.0" + jss-plugin-global: "npm:^10.10.0" + jss-plugin-nested: "npm:^10.10.0" + jss-plugin-props-sort: "npm:^10.10.0" + jss-plugin-rule-value-function: "npm:^10.10.0" + jss-plugin-vendor-prefixer: "npm:^10.10.0" + prop-types: "npm:^15.8.1" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/dbf9f95cb1c035b5080448f8b9ab9414a394ddc787d94be69213a926ac3e0d5ad763b6e73ab369e524db7f2c46ef9e88bf31c1a6b3798630ebf5d64cd5576434 + languageName: node + linkType: hard + "@mui/system@npm:^5.18.0": version: 5.18.0 resolution: "@mui/system@npm:5.18.0" @@ -10399,6 +11407,18 @@ __metadata: languageName: node linkType: hard +"@patternfly/react-icons@npm:^6.5.0": + version: 6.6.0 + resolution: "@patternfly/react-icons@npm:6.6.0" + dependencies: + tslib: "npm:^2.8.1" + peerDependencies: + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + checksum: 10c0/55ce255ce1acedc0405c3ceb22c4ac1843b2e19d9c2953bfe3cdd76561b402490bf233ad51b8aa3904616173131da78ab7792c46c9a5d0d859bded3c8dccbc73 + languageName: node + linkType: hard + "@peculiar/asn1-cms@npm:^2.6.0, @peculiar/asn1-cms@npm:^2.8.0": version: 2.8.0 resolution: "@peculiar/asn1-cms@npm:2.8.0" @@ -11309,6 +12329,157 @@ __metadata: languageName: node linkType: hard +"@red-hat-developer-hub/backstage-plugin-app-react@npm:0.0.5, @red-hat-developer-hub/backstage-plugin-app-react@npm:^0.0.5": + version: 0.0.5 + resolution: "@red-hat-developer-hub/backstage-plugin-app-react@npm:0.0.5" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.4" + "@backstage/frontend-plugin-api": "npm:^0.15.1" + "@backstage/plugin-app-react": "npm:^0.2.1" + "@backstage/version-bridge": "npm:^1.0.12" + "@mui/material": "npm:5.18.0" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + checksum: 10c0/b993e0cd34abf86a858af6d4c599a831b6cf7282dbe4f4897d75bc2ac027a29addcfc59710cc3fc34c14674ddc181bb3acc638972bbb642ef76b0fc9afd29243 + languageName: node + linkType: hard + +"@red-hat-developer-hub/backstage-plugin-global-header@npm:1.21.5": + version: 1.21.5 + resolution: "@red-hat-developer-hub/backstage-plugin-global-header@npm:1.21.5" + dependencies: + "@backstage/catalog-model": "npm:^1.7.7" + "@backstage/core-components": "npm:^0.18.8" + "@backstage/core-plugin-api": "npm:^1.12.4" + "@backstage/frontend-plugin-api": "npm:^0.15.1" + "@backstage/plugin-app-react": "npm:^0.2.1" + "@backstage/plugin-catalog-react": "npm:^2.1.0" + "@backstage/plugin-notifications": "npm:^0.5.15" + "@backstage/plugin-notifications-common": "npm:^0.2.1" + "@backstage/plugin-search": "npm:^1.7.0" + "@backstage/plugin-search-backend": "npm:^2.1.0" + "@backstage/plugin-search-backend-module-catalog": "npm:^0.3.13" + "@backstage/plugin-search-backend-module-pg": "npm:^0.5.53" + "@backstage/plugin-search-backend-module-techdocs": "npm:^0.4.12" + "@backstage/plugin-search-common": "npm:^1.2.22" + "@backstage/plugin-search-react": "npm:^1.11.0" + "@backstage/plugin-signals-react": "npm:^0.0.20" + "@backstage/plugin-user-settings": "npm:^0.9.1" + "@backstage/theme": "npm:^0.7.2" + "@mui/icons-material": "npm:5.18.0" + "@mui/material": "npm:5.18.0" + "@mui/styled-engine": "npm:5.18.0" + "@scalprum/react-core": "npm:0.11.1" + react-use: "npm:^17.5.0" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + checksum: 10c0/951e18545eb6c1f9d24153fdf18950f89bc53d5b22a01da4c5cb59efed9acff218932e6171795d31a5a4fe6ae851b6eae0792d88926ef0970283a6d7d837b4c1 + languageName: node + linkType: hard + +"@red-hat-developer-hub/backstage-plugin-global-header@npm:^1.21.0": + version: 1.21.6 + resolution: "@red-hat-developer-hub/backstage-plugin-global-header@npm:1.21.6" + dependencies: + "@backstage/catalog-model": "npm:^1.7.7" + "@backstage/core-components": "npm:^0.18.8" + "@backstage/core-plugin-api": "npm:^1.12.4" + "@backstage/frontend-plugin-api": "npm:^0.15.1" + "@backstage/plugin-app-react": "npm:^0.2.1" + "@backstage/plugin-catalog-react": "npm:^2.1.0" + "@backstage/plugin-notifications": "npm:^0.5.15" + "@backstage/plugin-notifications-common": "npm:^0.2.1" + "@backstage/plugin-search": "npm:^1.7.0" + "@backstage/plugin-search-backend": "npm:^2.1.0" + "@backstage/plugin-search-backend-module-catalog": "npm:^0.3.13" + "@backstage/plugin-search-backend-module-pg": "npm:^0.5.53" + "@backstage/plugin-search-backend-module-techdocs": "npm:^0.4.12" + "@backstage/plugin-search-common": "npm:^1.2.22" + "@backstage/plugin-search-react": "npm:^1.11.0" + "@backstage/plugin-signals-react": "npm:^0.0.20" + "@backstage/plugin-user-settings": "npm:^0.9.1" + "@backstage/theme": "npm:^0.7.2" + "@mui/icons-material": "npm:5.18.0" + "@mui/material": "npm:5.18.0" + "@mui/styled-engine": "npm:5.18.0" + "@mui/styles": "npm:5.18.0" + "@scalprum/react-core": "npm:0.11.1" + react-use: "npm:^17.5.0" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + checksum: 10c0/41f8461140389b3ba5ac3a7373e6dffa77831d98ef94bdb39545a1f85c5e9138a628c840fa84e2bb74419211fc69d32bc664fb084463ff68cb85f62eeef5def7 + languageName: node + linkType: hard + +"@red-hat-developer-hub/backstage-plugin-homepage-common@npm:^0.2.1": + version: 0.2.1 + resolution: "@red-hat-developer-hub/backstage-plugin-homepage-common@npm:0.2.1" + dependencies: + "@backstage/plugin-permission-common": "npm:^0.9.9" + checksum: 10c0/1a2aec14e52e8d021c57b93bf25ee9931ecc816991831655e275e365aec7b52d36fbd6e358212526b75ec59dc917e6fb5e4a237e92ba84b0859caafb791cf49c + languageName: node + linkType: hard + +"@red-hat-developer-hub/backstage-plugin-homepage@npm:1.15.0": + version: 1.15.0 + resolution: "@red-hat-developer-hub/backstage-plugin-homepage@npm:1.15.0" + dependencies: + "@backstage/catalog-client": "npm:^1.15.1" + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/core-compat-api": "npm:^0.5.11" + "@backstage/core-components": "npm:^0.18.10" + "@backstage/core-plugin-api": "npm:^1.12.6" + "@backstage/frontend-plugin-api": "npm:^0.17.0" + "@backstage/plugin-app-react": "npm:^0.2.3" + "@backstage/plugin-catalog-react": "npm:^3.0.0" + "@backstage/plugin-home": "npm:^0.9.6" + "@backstage/plugin-home-react": "npm:^0.1.38" + "@backstage/plugin-search-react": "npm:^1.11.4" + "@backstage/plugin-user-settings": "npm:^0.9.3" + "@backstage/theme": "npm:^0.7.3" + "@mui/icons-material": "npm:5.18.0" + "@mui/material": "npm:5.18.0" + "@mui/styles": "npm:5.18.0" + "@red-hat-developer-hub/backstage-plugin-homepage-common": "npm:^0.2.1" + "@scalprum/react-core": "npm:0.11.3" + react-grid-layout: "npm:1.5.3" + react-use: "npm:17.6.1" + peerDependencies: + react: 16.13.1 || ^17.0.0 || ^18.2.0 + react-router-dom: 6.30.4 + checksum: 10c0/4dd37495b05c4c5c955e69953ae3a5507aba2bb019fa543dc018dc05548114da629803ab457e889e59287e2d8318e8b5b84b23f3257afae3185da4f3da39cb43 + languageName: node + linkType: hard + +"@red-hat-developer-hub/backstage-plugin-quickstart@npm:1.10.0": + version: 1.10.0 + resolution: "@red-hat-developer-hub/backstage-plugin-quickstart@npm:1.10.0" + dependencies: + "@backstage-community/plugin-rbac-common": "npm:^1.19.0" + "@backstage/core-components": "npm:^0.18.8" + "@backstage/core-plugin-api": "npm:^1.12.4" + "@backstage/frontend-plugin-api": "npm:^0.15.1" + "@backstage/plugin-app-react": "npm:^0.2.1" + "@backstage/plugin-permission-react": "npm:^0.4.41" + "@backstage/theme": "npm:^0.7.2" + "@mui/icons-material": "npm:5.18.0" + "@mui/material": "npm:5.18.0" + "@mui/styles": "npm:5.18.0" + "@patternfly/react-icons": "npm:^6.5.0" + "@red-hat-developer-hub/backstage-plugin-app-react": "npm:^0.0.5" + "@red-hat-developer-hub/backstage-plugin-global-header": "npm:^1.21.0" + "@red-hat-developer-hub/backstage-plugin-theme": "npm:^0.14.0" + react-use: "npm:^17.6.0" + 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 + checksum: 10c0/f78535c159a78d75e494d4bb60d85da5a500b9bb814ef401e5095c12998e253a5550abfaf1528f7474fda521fbaac1ddc9b3f1c3d6e2dc08ccdd81fa5e209e45 + languageName: node + linkType: hard + "@red-hat-developer-hub/backstage-plugin-theme@npm:0.14.7": version: 0.14.7 resolution: "@red-hat-developer-hub/backstage-plugin-theme@npm:0.14.7" @@ -11327,6 +12498,24 @@ __metadata: languageName: node linkType: hard +"@red-hat-developer-hub/backstage-plugin-theme@npm:^0.14.0": + version: 0.14.8 + resolution: "@red-hat-developer-hub/backstage-plugin-theme@npm:0.14.8" + dependencies: + "@backstage/frontend-plugin-api": "npm:^0.15.1" + "@backstage/plugin-app-react": "npm:^0.2.1" + "@mui/icons-material": "npm:^5.17.1" + peerDependencies: + "@backstage/core-plugin-api": ^1.12.4 + "@backstage/theme": ^0.7.2 + "@mui/icons-material": ^5.17.1 + "@mui/material": ^5.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/9dc6f44a9eca0f0a033609ef1887837908737bf4e3eba2ff614202c9ad1c4886ef6a52e30c5c25015607205104846786dceabbf37f760835037e7016711bac4e + languageName: node + linkType: hard + "@red-hat-developer-hub/backstage-plugin-translations-backend@npm:0.3.1": version: 0.3.1 resolution: "@red-hat-developer-hub/backstage-plugin-translations-backend@npm:0.3.1" @@ -12066,14 +13255,23 @@ __metadata: languageName: node linkType: hard -"@smithy/core@npm:^3.24.6, @smithy/core@npm:^3.25.1": - version: 3.25.1 - resolution: "@smithy/core@npm:3.25.1" +"@smithy/abort-controller@npm:^3.1.9": + version: 3.1.9 + resolution: "@smithy/abort-controller@npm:3.1.9" dependencies: - "@aws-crypto/crc32": "npm:5.2.0" - "@smithy/types": "npm:^4.15.0" + "@smithy/types": "npm:^3.7.2" + tslib: "npm:^2.6.2" + checksum: 10c0/d8e27940a087a16922d3c292049b50847fe8a84e632701e5aa33c175ddd84c1ef2566ac3f6550bcc06689da64bf79bdbabaf4e442ba92b18c252e62ca6a8880e + languageName: node + linkType: hard + +"@smithy/core@npm:^3.24.6, @smithy/core@npm:^3.25.1, @smithy/core@npm:^3.29.2": + version: 3.29.3 + resolution: "@smithy/core@npm:3.29.3" + dependencies: + "@smithy/types": "npm:^4.16.1" tslib: "npm:^2.6.2" - checksum: 10c0/56dad79b35242e0bb1acc7541034ee1debb80974768a7d9567f3bc6bd66de9910a7a375a8769a256c58deafae2970af6649f899738f931919a01e436c64071b3 + checksum: 10c0/530322e1b4eeaf89c64c0e57385714f8e2dc53adeae7cfad56fa957dfa5f67755a0d875f3a15c67f01ecccef83cc51a3b854f6c35987606626e5c11901f2de94 languageName: node linkType: hard @@ -12108,6 +13306,19 @@ __metadata: languageName: node linkType: hard +"@smithy/node-http-handler@npm:^3.0.0": + version: 3.3.3 + resolution: "@smithy/node-http-handler@npm:3.3.3" + dependencies: + "@smithy/abort-controller": "npm:^3.1.9" + "@smithy/protocol-http": "npm:^4.1.8" + "@smithy/querystring-builder": "npm:^3.0.11" + "@smithy/types": "npm:^3.7.2" + tslib: "npm:^2.6.2" + checksum: 10c0/b95ac887388f5698583855a430ca6e727bff4fc32bc4143debbdde70061685174fde132c0475f9a5128cf7522d553e108e859b41b01b3e58843f0f9cf48acd3e + languageName: node + linkType: hard + "@smithy/node-http-handler@npm:^4.7.6": version: 4.8.1 resolution: "@smithy/node-http-handler@npm:4.8.1" @@ -12119,6 +13330,27 @@ __metadata: languageName: node linkType: hard +"@smithy/protocol-http@npm:^4.1.8": + version: 4.1.8 + resolution: "@smithy/protocol-http@npm:4.1.8" + dependencies: + "@smithy/types": "npm:^3.7.2" + tslib: "npm:^2.6.2" + checksum: 10c0/490425e7329962ede034cf04911c80a2653011dc2b15b9b76a1553545bec84aeef1b70c9f0ab6c2adfc3502afec6f4cf38499dba211e9f81370d470f6e35ca0f + languageName: node + linkType: hard + +"@smithy/querystring-builder@npm:^3.0.11": + version: 3.0.11 + resolution: "@smithy/querystring-builder@npm:3.0.11" + dependencies: + "@smithy/types": "npm:^3.7.2" + "@smithy/util-uri-escape": "npm:^3.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/77daf191c606178cc76f46739b4085660ed3036993a9c2274cb6b70a9ba29e000c33c3c093263a6a119e0a55f063d02a29806e1c90384e18f50a8c2bc0a1d7f0 + languageName: node + linkType: hard + "@smithy/signature-v4@npm:^5.4.6": version: 5.5.1 resolution: "@smithy/signature-v4@npm:5.5.1" @@ -12139,12 +13371,21 @@ __metadata: languageName: node linkType: hard -"@smithy/types@npm:^4.14.3, @smithy/types@npm:^4.15.0": - version: 4.15.0 - resolution: "@smithy/types@npm:4.15.0" +"@smithy/types@npm:^3.7.2": + version: 3.7.2 + resolution: "@smithy/types@npm:3.7.2" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10c0/4bf4674c922c092f9c92b482b074163ceea199e82466ccd4414c4cd9651f67757456414f969e9997371250e112778b636115727b5af53324334300f328069293 + languageName: node + linkType: hard + +"@smithy/types@npm:^4.14.3, @smithy/types@npm:^4.15.0, @smithy/types@npm:^4.16.0, @smithy/types@npm:^4.16.1": + version: 4.16.1 + resolution: "@smithy/types@npm:4.16.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10c0/18b7f64544c7450dbc5602817d6f1a6bc337fcb19bc56d6df977bfcf7a25e233640df1f7f1791cc50a291dfedf30b99f5942ea517e0611b37f4c4a79327637cf + checksum: 10c0/e024d9d148deca7bd21d032a9316db109bbe7cf256ffbb8d3981655b9f4f7695c08ec9b87f5a8cf1442e783ba26cb27e4f09603c5bfa3ba1e526c41b1b3e94d2 languageName: node linkType: hard @@ -12158,6 +13399,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-uri-escape@npm:^3.0.0": + version: 3.0.0 + resolution: "@smithy/util-uri-escape@npm:3.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10c0/b8d831348412cfafd9300069e74a12e0075b5e786d7ef6a210ba4ab576001c2525653eec68b71dfe6d7aef71c52f547404c4f0345c0fb476a67277f9d44b1156 + languageName: node + linkType: hard + "@smithy/util-utf8@npm:^2.0.0": version: 2.3.0 resolution: "@smithy/util-utf8@npm:2.3.0" @@ -13620,6 +14870,18 @@ __metadata: languageName: node linkType: hard +"@trendyol-js/openstack-swift-sdk@npm:^0.0.7": + version: 0.0.7 + resolution: "@trendyol-js/openstack-swift-sdk@npm:0.0.7" + dependencies: + agentkeepalive: "npm:^4.1.4" + axios: "npm:^1.0.0" + axios-cached-dns-resolve: "npm:0.5.2" + file-type: "npm:^16.5.4" + checksum: 10c0/321ceb734756b7534239ecbeadcd28d141773a8b2caaf7fae0e233d5e0065dca73c78a93d517a8ccb03d87774daa46e2231b42a6e522efb210bd6ec98e8b71b6 + languageName: node + linkType: hard + "@ts-morph/common@npm:~0.25.0": version: 0.25.0 resolution: "@ts-morph/common@npm:0.25.0" @@ -15591,6 +16853,15 @@ __metadata: languageName: node linkType: hard +"agentkeepalive@npm:^4.1.4": + version: 4.6.0 + resolution: "agentkeepalive@npm:4.6.0" + dependencies: + humanize-ms: "npm:^1.2.1" + checksum: 10c0/235c182432f75046835b05f239708107138a40103deee23b6a08caee5136873709155753b394ec212e49e60e94a378189562cb01347765515cff61b692c69187 + languageName: node + linkType: hard + "aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" @@ -15854,14 +17125,16 @@ __metadata: "@backstage/frontend-plugin-api": "npm:0.17.2" "@backstage/integration-react": "npm:1.2.19" "@backstage/plugin-app": "npm:0.5.0" + "@backstage/plugin-app-react": "npm:0.2.4" "@backstage/plugin-app-visualizer": "npm:0.2.5" "@backstage/plugin-auth-react": "npm:0.1.28" - "@backstage/plugin-catalog": "npm:2.0.6" + "@backstage/plugin-catalog": "npm:2.0.7" "@backstage/plugin-catalog-common": "npm:1.1.10" "@backstage/plugin-catalog-graph": "npm:0.6.5" "@backstage/plugin-catalog-import": "npm:0.13.14" - "@backstage/plugin-catalog-react": "npm:3.1.0" + "@backstage/plugin-catalog-react": "npm:3.2.0" "@backstage/plugin-catalog-unprocessed-entities": "npm:0.2.32" + "@backstage/plugin-home": "npm:0.9.4" "@backstage/plugin-permission-react": "npm:0.5.2" "@backstage/plugin-scaffolder": "npm:1.38.0" "@backstage/plugin-scaffolder-react": "npm:2.0.1" @@ -15875,7 +17148,13 @@ __metadata: "@material-ui/core": "npm:4.12.4" "@material-ui/icons": "npm:4.11.3" "@material-ui/lab": "npm:4.0.0-alpha.61" + "@mui/icons-material": "npm:5.18.0" "@octokit/rest": "npm:19.0.13" + "@red-hat-developer-hub/backstage-plugin-app-react": "npm:0.0.5" + "@red-hat-developer-hub/backstage-plugin-global-header": "npm:1.21.5" + "@red-hat-developer-hub/backstage-plugin-homepage": "npm:1.15.0" + "@red-hat-developer-hub/backstage-plugin-quickstart": "npm:1.10.0" + "@red-hat-developer-hub/backstage-plugin-theme": "npm:0.14.7" "@testing-library/dom": "npm:9.3.4" "@testing-library/jest-dom": "npm:6.9.1" "@testing-library/react": "npm:14.3.1" @@ -16018,6 +17297,18 @@ __metadata: languageName: node linkType: hard +"args@npm:^5.0.0": + version: 5.0.3 + resolution: "args@npm:5.0.3" + dependencies: + camelcase: "npm:5.0.0" + chalk: "npm:2.4.2" + leven: "npm:2.1.0" + mri: "npm:1.1.4" + checksum: 10c0/213871ae97d6f5990dc4637f53e48feef8566b2fd6d5cc9cb46ef78dc1db835b2f90fd536c1414441eaa0b5cb8f2a5ab94b973400b5fea096ee20b9893d3b573 + languageName: node + linkType: hard + "aria-hidden@npm:^1.2.3, aria-hidden@npm:^1.2.4": version: 1.2.6 resolution: "aria-hidden@npm:1.2.6" @@ -16334,6 +17625,13 @@ __metadata: languageName: node linkType: hard +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: 10c0/e329a6665512736a9bbb073e1761b4ec102f7926cce35037753146a9db9c8104f5044c1662e4a863576ce544fb8be27cd2be6bc8c1a40147d03f31eb1cfb6e8a + languageName: node + linkType: hard + "autolinker@npm:^3.11.0": version: 3.16.2 resolution: "autolinker@npm:3.16.2" @@ -16380,15 +17678,29 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.16.0, axios@npm:^1.7.3, axios@npm:^1.7.4": - version: 1.18.0 - resolution: "axios@npm:1.18.0" +"axios-cached-dns-resolve@npm:0.5.2": + version: 0.5.2 + resolution: "axios-cached-dns-resolve@npm:0.5.2" + dependencies: + babel-polyfill: "npm:^6.26.0" + json-stringify-safe: "npm:^5.0.1" + lodash: "npm:^4.17.15" + lru-cache: "npm:^5.1.1" + pino: "npm:^5.12.2" + pino-pretty: "npm:^2.6.0" + checksum: 10c0/c68d66b22a578f92b27eae3f37c25f719ee02f34d33ce67bfeeaed2a030e9106119600101ff00e8472b4f6c09c33c64c65b935b138b748f3594e5381c39c81a2 + languageName: node + linkType: hard + +"axios@npm:^1.0.0, axios@npm:^1.16.0, axios@npm:^1.7.3, axios@npm:^1.7.4": + version: 1.18.1 + resolution: "axios@npm:1.18.1" dependencies: follow-redirects: "npm:^1.16.0" form-data: "npm:^4.0.5" https-proxy-agent: "npm:^5.0.1" proxy-from-env: "npm:^2.1.0" - checksum: 10c0/f88aae13fd9dd395dea3053c7299178fee62f436f20424a1d6d79ec11ffb7656ba664b4630defbadab2c387b6ea07e29afb9f28b26d8e0e49d45be766983290d + checksum: 10c0/9d9378a3af0d0ad730a52ad9d15ec7201f3926ad6e7e8bbffc5ae21ca2835ad11d1d9598698f5dd9718917486039f55ea1d7dc23d8e44fa827a55cc3262c02fc languageName: node linkType: hard @@ -16497,6 +17809,17 @@ __metadata: languageName: node linkType: hard +"babel-polyfill@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-polyfill@npm:6.26.0" + dependencies: + babel-runtime: "npm:^6.26.0" + core-js: "npm:^2.5.0" + regenerator-runtime: "npm:^0.10.5" + checksum: 10c0/9fd1a5766744c29f15f77d3b2b38c73ce55e125b4f4379526ef6dc4b9480950218050b41d34bf19559980b85a8bcd848b416636fc07c0c3b4fe8851b961a3959 + languageName: node + linkType: hard + "babel-preset-current-node-syntax@npm:^1.2.0": version: 1.2.0 resolution: "babel-preset-current-node-syntax@npm:1.2.0" @@ -16534,6 +17857,16 @@ __metadata: languageName: node linkType: hard +"babel-runtime@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-runtime@npm:6.26.0" + dependencies: + core-js: "npm:^2.4.0" + regenerator-runtime: "npm:^0.11.0" + checksum: 10c0/caa752004936b1463765ed3199c52f6a55d0613b9bed108743d6f13ca532b821d4ea9decc4be1b583193164462b1e3e7eefdfa36b15c72e7daac58dd72c1772f + languageName: node + linkType: hard + "backend@workspace:packages/backend": version: 0.0.0-use.local resolution: "backend@workspace:packages/backend" @@ -17182,6 +18515,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:5.6.0": + version: 5.6.0 + resolution: "buffer@npm:5.6.0" + dependencies: + base64-js: "npm:^1.0.2" + ieee754: "npm:^1.1.4" + checksum: 10c0/07037a0278b07fbc779920f1ba1b473933ffb4a2e2f7b387c55daf6ac64a05b58c27da9e85730a4046e8f97a49f8acd9f7bf89605c0a4dfda88ebfb7e08bfe4a + languageName: node + linkType: hard + "buffer@npm:^4.3.0": version: 4.9.2 resolution: "buffer@npm:4.9.2" @@ -17349,6 +18692,13 @@ __metadata: languageName: node linkType: hard +"camelcase@npm:5.0.0": + version: 5.0.0 + resolution: "camelcase@npm:5.0.0" + checksum: 10c0/515f1ce911d65949708d9e179f1a40af71eb7de668230a0c85961a35590f7da39af79cfb48d834883dbcc7995bdb7dd6bae8027b101e37a10d95337ec8732800 + languageName: node + linkType: hard + "camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -17411,7 +18761,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:2.4.2, chalk@npm:^2.4.2": +"chalk@npm:2.4.2, chalk@npm:^2.3.2, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -17748,7 +19098,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.0.2, clsx@npm:^1.0.4, clsx@npm:^1.2.1": +"clsx@npm:^1.0.2, clsx@npm:^1.0.4, clsx@npm:^1.1.0, clsx@npm:^1.1.1, clsx@npm:^1.2.1": version: 1.2.1 resolution: "clsx@npm:1.2.1" checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 @@ -18359,6 +19709,13 @@ __metadata: languageName: node linkType: hard +"core-js@npm:^2.4.0, core-js@npm:^2.5.0": + version: 2.6.12 + resolution: "core-js@npm:2.6.12" + checksum: 10c0/00128efe427789120a06b819adc94cc72b96955acb331cb71d09287baf9bd37bebd191d91f1ee4939c893a050307ead4faea08876f09115112612b6a05684b63 + languageName: node + linkType: hard + "core-js@npm:^3.6.5": version: 3.49.0 resolution: "core-js@npm:3.49.0" @@ -18821,7 +20178,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3, csstype@npm:^3.2.2": +"csstype@npm:^3.0.10, csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3, csstype@npm:^3.2.2": version: 3.2.3 resolution: "csstype@npm:3.2.3" checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce @@ -19051,6 +20408,13 @@ __metadata: languageName: node linkType: hard +"dateformat@npm:^3.0.3": + version: 3.0.3 + resolution: "dateformat@npm:3.0.3" + checksum: 10c0/2effb8bef52ff912f87a05e4adbeacff46353e91313ad1ea9ed31412db26849f5a0fcc7e3ce36dbfb84fc6c881a986d5694f84838ad0da7000d5150693e78678 + languageName: node + linkType: hard + "dayjs@npm:^1.11.20": version: 1.11.21 resolution: "dayjs@npm:1.11.21" @@ -19535,7 +20899,7 @@ __metadata: languageName: node linkType: hard -"dockerode@npm:^4.0.10": +"dockerode@npm:^4.0.0, dockerode@npm:^4.0.10": version: 4.0.12 resolution: "dockerode@npm:4.0.12" dependencies: @@ -20964,7 +22328,7 @@ __metadata: languageName: node linkType: hard -"events@npm:^3.0.0, events@npm:^3.2.0, events@npm:^3.3.0": +"events@npm:3.3.0, events@npm:^3.0.0, events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 @@ -21285,6 +22649,13 @@ __metadata: languageName: node linkType: hard +"fast-equals@npm:^4.0.3": + version: 4.0.3 + resolution: "fast-equals@npm:4.0.3" + checksum: 10c0/87fd2609c945ee61e9ed4d041eb2a8f92723fc02884115f67e429dd858d880279e962334894f116b3e9b223f387d246e3db5424ae779287849015ddadbf5ff27 + languageName: node + linkType: hard + "fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": version: 1.3.2 resolution: "fast-fifo@npm:1.3.2" @@ -21305,6 +22676,13 @@ __metadata: languageName: node linkType: hard +"fast-json-parse@npm:^1.0.3": + version: 1.0.3 + resolution: "fast-json-parse@npm:1.0.3" + checksum: 10c0/2c58c7a0f7f1725c9da1272839f9bee3ccc13b77672b18ab4ac470c707999bca39828cd7e79b87c73017f21c3ddff37992d03fa2fd2da124d9bd06c1d02c9b7e + languageName: node + linkType: hard + "fast-json-patch@npm:^3.0.0-1, fast-json-patch@npm:^3.1.1": version: 3.1.1 resolution: "fast-json-patch@npm:3.1.1" @@ -21333,7 +22711,14 @@ __metadata: languageName: node linkType: hard -"fast-safe-stringify@npm:^2.1.1": +"fast-redact@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-redact@npm:2.1.0" + checksum: 10c0/2194374ab2c6eab5d69a680cd71aea3ee774be2e39e33ab0816c4935e8287f8c3755d481be6bd56def26c3288e2842b49cdc3a347abf311e91cafe74183fbbca + languageName: node + linkType: hard + +"fast-safe-stringify@npm:^2.0.6, fast-safe-stringify@npm:^2.0.7, fast-safe-stringify@npm:^2.1.1": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" checksum: 10c0/d90ec1c963394919828872f21edaa3ad6f1dddd288d2bd4e977027afff09f5db40f94e39536d4646f7e01761d704d72d51dce5af1b93717f3489ef808f5f4e4d @@ -21529,6 +22914,17 @@ __metadata: languageName: node linkType: hard +"file-type@npm:^16.5.4": + version: 16.5.4 + resolution: "file-type@npm:16.5.4" + dependencies: + readable-web-to-node-stream: "npm:^3.0.0" + strtok3: "npm:^6.2.4" + token-types: "npm:^4.1.1" + checksum: 10c0/a6c9ab8bc05bc9c212bec239fb0d5bf59ddc9b3912f00c4ef44622e67ae4e553a1cc8372e9e595e14859035188eb305d05d488fa3c5c2a2ad90bb7745b3004ef + languageName: node + linkType: hard + "file-type@npm:^21.1.1": version: 21.3.4 resolution: "file-type@npm:21.3.4" @@ -21682,6 +23078,13 @@ __metadata: languageName: node linkType: hard +"flatstr@npm:^1.0.12": + version: 1.0.12 + resolution: "flatstr@npm:1.0.12" + checksum: 10c0/f99cf801fd3606e8b4aa96b93ec09caab42bc304526ff55a80db03db0ef73c9a014e983a6d72009c4f1bc50e2483d137041fae18a325dc0d851d045c4d6929a9 + languageName: node + linkType: hard + "flatted@npm:^3.2.7, flatted@npm:^3.2.9, flatted@npm:^3.4.2": version: 3.4.2 resolution: "flatted@npm:3.4.2" @@ -22606,6 +24009,15 @@ __metadata: languageName: node linkType: hard +"goober@npm:^2.0.33": + version: 2.1.19 + resolution: "goober@npm:2.1.19" + peerDependencies: + csstype: ^3.0.10 + checksum: 10c0/f6a01f2e8abfef571ac539f96e650dcde964e7c0bef6c9055a8c8e110624ccd7b51ab90706a806ca570a56141ea689d355fb1cec3ee9209499c249638883990d + languageName: node + linkType: hard + "google-auth-library@npm:^9.0.0, google-auth-library@npm:^9.3.0, google-auth-library@npm:^9.6.3": version: 9.15.1 resolution: "google-auth-library@npm:9.15.1" @@ -23167,6 +24579,13 @@ __metadata: languageName: node linkType: hard +"hpagent@npm:^1.2.0": + version: 1.2.0 + resolution: "hpagent@npm:1.2.0" + checksum: 10c0/505ef42e5e067dba701ea21e7df9fa73f6f5080e59d53680829827d34cd7040f1ecf7c3c8391abe9df4eb4682ef4a4321608836b5b70a61b88c1b3a03d77510b + languageName: node + linkType: hard + "html-encoding-sniffer@npm:^6.0.0": version: 6.0.0 resolution: "html-encoding-sniffer@npm:6.0.0" @@ -23439,6 +24858,15 @@ __metadata: languageName: node linkType: hard +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: "npm:^2.0.0" + checksum: 10c0/f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a + languageName: node + linkType: hard + "husky@npm:8.0.3": version: 8.0.3 resolution: "husky@npm:8.0.3" @@ -25183,6 +26611,13 @@ __metadata: languageName: node linkType: hard +"jmespath@npm:^0.15.0": + version: 0.15.0 + resolution: "jmespath@npm:0.15.0" + checksum: 10c0/95fe1cabb4a12fc2b443a7aa9e85dca52a87437038276765fc54bfbb651a03f5f739266c0b3520531e7cf67986f716308edad8fadb8fbc26bf82a146f881d2e3 + languageName: node + linkType: hard + "jose@npm:5.10.0, jose@npm:^5.0.0": version: 5.10.0 resolution: "jose@npm:5.10.0" @@ -25551,7 +26986,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.0, json5@npm:^2.2.3": +"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.0, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -25656,7 +27091,7 @@ __metadata: languageName: node linkType: hard -"jss-plugin-camel-case@npm:^10.5.1": +"jss-plugin-camel-case@npm:^10.10.0, jss-plugin-camel-case@npm:^10.5.1": version: 10.10.0 resolution: "jss-plugin-camel-case@npm:10.10.0" dependencies: @@ -25667,7 +27102,7 @@ __metadata: languageName: node linkType: hard -"jss-plugin-default-unit@npm:^10.5.1": +"jss-plugin-default-unit@npm:^10.10.0, jss-plugin-default-unit@npm:^10.5.1": version: 10.10.0 resolution: "jss-plugin-default-unit@npm:10.10.0" dependencies: @@ -25677,7 +27112,7 @@ __metadata: languageName: node linkType: hard -"jss-plugin-global@npm:^10.5.1": +"jss-plugin-global@npm:^10.10.0, jss-plugin-global@npm:^10.5.1": version: 10.10.0 resolution: "jss-plugin-global@npm:10.10.0" dependencies: @@ -25687,7 +27122,7 @@ __metadata: languageName: node linkType: hard -"jss-plugin-nested@npm:^10.5.1": +"jss-plugin-nested@npm:^10.10.0, jss-plugin-nested@npm:^10.5.1": version: 10.10.0 resolution: "jss-plugin-nested@npm:10.10.0" dependencies: @@ -25698,7 +27133,7 @@ __metadata: languageName: node linkType: hard -"jss-plugin-props-sort@npm:^10.5.1": +"jss-plugin-props-sort@npm:^10.10.0, jss-plugin-props-sort@npm:^10.5.1": version: 10.10.0 resolution: "jss-plugin-props-sort@npm:10.10.0" dependencies: @@ -25708,7 +27143,7 @@ __metadata: languageName: node linkType: hard -"jss-plugin-rule-value-function@npm:^10.5.1": +"jss-plugin-rule-value-function@npm:^10.10.0, jss-plugin-rule-value-function@npm:^10.5.1": version: 10.10.0 resolution: "jss-plugin-rule-value-function@npm:10.10.0" dependencies: @@ -25719,7 +27154,7 @@ __metadata: languageName: node linkType: hard -"jss-plugin-vendor-prefixer@npm:^10.5.1": +"jss-plugin-vendor-prefixer@npm:^10.10.0, jss-plugin-vendor-prefixer@npm:^10.5.1": version: 10.10.0 resolution: "jss-plugin-vendor-prefixer@npm:10.10.0" dependencies: @@ -25730,7 +27165,7 @@ __metadata: languageName: node linkType: hard -"jss@npm:10.10.0, jss@npm:^10.5.1, jss@npm:~10.10.0": +"jss@npm:10.10.0, jss@npm:^10.10.0, jss@npm:^10.5.1, jss@npm:~10.10.0": version: 10.10.0 resolution: "jss@npm:10.10.0" dependencies: @@ -25855,50 +27290,7 @@ __metadata: languageName: node linkType: hard -"knex@npm:3, knex@npm:^3.0.0": - version: 3.2.10 - resolution: "knex@npm:3.2.10" - dependencies: - colorette: "npm:2.0.19" - commander: "npm:^10.0.0" - debug: "npm:4.3.4" - escalade: "npm:^3.1.1" - esm: "npm:^3.2.25" - get-package-type: "npm:^0.1.0" - getopts: "npm:2.3.0" - interpret: "npm:^2.2.0" - lodash: "npm:^4.18.1" - pg-connection-string: "npm:2.6.2" - rechoir: "npm:^0.8.0" - resolve-from: "npm:^5.0.0" - tarn: "npm:^3.0.2" - tildify: "npm:2.0.0" - peerDependencies: - pg-query-stream: ^4.14.0 - peerDependenciesMeta: - better-sqlite3: - optional: true - mysql: - optional: true - mysql2: - optional: true - pg: - optional: true - pg-native: - optional: true - pg-query-stream: - optional: true - sqlite3: - optional: true - tedious: - optional: true - bin: - knex: bin/cli.js - checksum: 10c0/b2dbb6a01f520a5775e6885ae09d9e35f998e1d0eea9aa283e5125d563ebade39b69d9e362368384415195f3db9cb3ac415b97875532e2ad3099d0f9685a6a37 - languageName: node - linkType: hard - -"knex@npm:3.3.0": +"knex@npm:3, knex@npm:3.3.0, knex@npm:^3.0.0": version: 3.3.0 resolution: "knex@npm:3.3.0" dependencies: @@ -26044,6 +27436,13 @@ __metadata: languageName: node linkType: hard +"leven@npm:2.1.0": + version: 2.1.0 + resolution: "leven@npm:2.1.0" + checksum: 10c0/e685243900aad7e854212001c9b7fe6d0806081e184d5077a561a91d07425852e8b7d1edf76b948f4be520b64e0015960be3a5f3e9acb0bec75a0e4134b422df + languageName: node + linkType: hard + "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -26302,6 +27701,13 @@ __metadata: languageName: node linkType: hard +"lodash.isequal@npm:^4.0.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: 10c0/dfdb2356db19631a4b445d5f37868a095e2402292d59539a987f134a8778c62a2810c2452d11ae9e6dcac71fc9de40a6fedcb20e2952a15b431ad8b29e50e28f + languageName: node + linkType: hard + "lodash.isinteger@npm:^4.0.4": version: 4.0.4 resolution: "lodash.isinteger@npm:4.0.4" @@ -26547,7 +27953,7 @@ __metadata: languageName: node linkType: hard -"luxon@npm:3.7.2, luxon@npm:^3.0.0, luxon@npm:^3.2.1, luxon@npm:^3.5.0": +"luxon@npm:3.7.2, luxon@npm:^3.0.0, luxon@npm:^3.2.1, luxon@npm:^3.4.3, luxon@npm:^3.5.0": version: 3.7.2 resolution: "luxon@npm:3.7.2" checksum: 10c0/ed8f0f637826c08c343a29dd478b00628be93bba6f068417b1d8896b61cb61c6deacbe1df1e057dbd9298334044afa150f9aaabbeb3181418ac8520acfdc2ae2 @@ -27874,6 +29280,13 @@ __metadata: languageName: node linkType: hard +"mri@npm:1.1.4": + version: 1.1.4 + resolution: "mri@npm:1.1.4" + checksum: 10c0/eb577c2ef60385aa287afdac777e536996f4fd3144250c201097e7ec121568139d482c92cb9a512f90e428d6dc3e9ba8e9de89bc204424cb96f187a4bdc465c1 + languageName: node + linkType: hard + "mri@npm:^1.1.0": version: 1.2.0 resolution: "mri@npm:1.2.0" @@ -27895,7 +29308,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -28478,6 +29891,19 @@ __metadata: languageName: node linkType: hard +"notistack@npm:^3.0.1": + version: 3.0.2 + resolution: "notistack@npm:3.0.2" + dependencies: + clsx: "npm:^1.1.0" + goober: "npm:^2.0.33" + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/82a0270ee1b9e70bc1dfad4d7e1d2bbb6dc08ac887b920986dcfa58cc2aa975bd48b71f7cf3afc2e11badd142ba9ade5f708c858ee2080b9d4cd950b80c43811 + languageName: node + linkType: hard + "npm-bundled@npm:^2.0.0": version: 2.0.1 resolution: "npm-bundled@npm:2.0.1" @@ -29617,6 +31043,13 @@ __metadata: languageName: node linkType: hard +"peek-readable@npm:^4.1.0": + version: 4.1.0 + resolution: "peek-readable@npm:4.1.0" + checksum: 10c0/f9b81ce3eed185cc9ebbf7dff0b6e130dd6da7b05f1802bbf726a78e4d84990b0a65f8e701959c50eb1124cc2ad352205147954bf39793faba29bb00ce742a44 + languageName: node + linkType: hard + "pend@npm:~1.2.0": version: 1.2.0 resolution: "pend@npm:1.2.0" @@ -29777,6 +31210,48 @@ __metadata: languageName: node linkType: hard +"pino-pretty@npm:^2.6.0": + version: 2.6.1 + resolution: "pino-pretty@npm:2.6.1" + dependencies: + args: "npm:^5.0.0" + chalk: "npm:^2.3.2" + dateformat: "npm:^3.0.3" + fast-json-parse: "npm:^1.0.3" + fast-safe-stringify: "npm:^2.0.6" + jmespath: "npm:^0.15.0" + pump: "npm:^3.0.0" + readable-stream: "npm:^3.0.6" + split2: "npm:^3.0.0" + bin: + pino-pretty: ./bin.js + checksum: 10c0/84ac2d32128028ceab84689d54ebdebe68ba4f89f094e04758af8f4915b2972f096a475a93d5da327971697d9e78a47034a038ffa3de568cc094370ce0c32387 + languageName: node + linkType: hard + +"pino-std-serializers@npm:^2.4.2": + version: 2.5.0 + resolution: "pino-std-serializers@npm:2.5.0" + checksum: 10c0/0d2f7aaa388258574dc45f3fe02de158e2da21f956d51aac2ee20cf0385c90bda464346d6a79bcfbe6dccf4140e23ccdd116ca41e804f6a7e95d5558d96fa7ee + languageName: node + linkType: hard + +"pino@npm:^5.12.2": + version: 5.17.0 + resolution: "pino@npm:5.17.0" + dependencies: + fast-redact: "npm:^2.0.0" + fast-safe-stringify: "npm:^2.0.7" + flatstr: "npm:^1.0.12" + pino-std-serializers: "npm:^2.4.2" + quick-format-unescaped: "npm:^3.0.3" + sonic-boom: "npm:^0.7.5" + bin: + pino: bin.js + checksum: 10c0/c83f28f14a3e0b7e45e59f924efe58f7f0c522a9c23ba574cbdf2e931c2b5b22b0d6e2d6fb7c78ac3331532ea328c4cfe78941801c5b39799de4c77a7c856ca9 + languageName: node + linkType: hard + "pipenet@npm:^1.3.0": version: 1.4.2 resolution: "pipenet@npm:1.4.2" @@ -30728,12 +32203,13 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.11.0, qs@npm:^6.11.2, qs@npm:^6.12.3, qs@npm:^6.14.0, qs@npm:^6.14.1, qs@npm:^6.15.0, qs@npm:^6.15.2, qs@npm:~6.15.1": - version: 6.15.2 - resolution: "qs@npm:6.15.2" +"qs@npm:^6.11.0, qs@npm:^6.11.2, qs@npm:^6.12.3, qs@npm:^6.14.0, qs@npm:^6.14.1, qs@npm:^6.15.0, qs@npm:^6.15.2, qs@npm:^6.9.4, qs@npm:~6.15.1": + version: 6.15.3 + resolution: "qs@npm:6.15.3" dependencies: - side-channel: "npm:^1.1.0" - checksum: 10c0/e6fd5f6f0aab06d480fe9ab15cebfc4ce4235303e2f91dc69a8f7f4df1e668a61c11d1cfbabacf4295cbbeb7b670ed23db45307480726259761f98e5695e93a7 + es-define-property: "npm:^1.0.1" + side-channel: "npm:^1.1.1" + checksum: 10c0/8f3f6e45ece255347d57696628401cde29e9ec649fff698b53bd3150dea7cefdf33036e1bc1826b9f110bfa7cb0ec4ab9f5297eca628ce216c55af82c304e08e languageName: node linkType: hard @@ -30758,6 +32234,13 @@ __metadata: languageName: node linkType: hard +"quick-format-unescaped@npm:^3.0.3": + version: 3.0.3 + resolution: "quick-format-unescaped@npm:3.0.3" + checksum: 10c0/7c14031e71e1d82c86205f735a1912f66173a4370f6a2de908cce0ead880f66d581c6ac7dcd9a8ee38889550ffd03abce26ffb015a9dbb7c3598d75a6a251b82 + languageName: node + linkType: hard + "quick-lru@npm:^5.1.1": version: 5.1.1 resolution: "quick-lru@npm:5.1.1" @@ -31112,7 +32595,7 @@ __metadata: languageName: node linkType: hard -"react-draggable@npm:^4.5.0": +"react-draggable@npm:^4.0.0, react-draggable@npm:^4.4.6, react-draggable@npm:^4.5.0": version: 4.7.0 resolution: "react-draggable@npm:4.7.0" dependencies: @@ -31172,6 +32655,39 @@ __metadata: languageName: node linkType: hard +"react-grid-layout@npm:1.3.4": + version: 1.3.4 + resolution: "react-grid-layout@npm:1.3.4" + dependencies: + clsx: "npm:^1.1.1" + lodash.isequal: "npm:^4.0.0" + prop-types: "npm:^15.8.1" + react-draggable: "npm:^4.0.0" + react-resizable: "npm:^3.0.4" + peerDependencies: + react: ">= 16.3.0" + react-dom: ">= 16.3.0" + checksum: 10c0/2c4a9ca1284cf6a618070aeccf8ffb8d2d91798452f7606395a4524bda27fad82ba9c818cb3e420d617fec8aed93c0caaae060c714d21a929c6f5c75727697b7 + languageName: node + linkType: hard + +"react-grid-layout@npm:1.5.3": + version: 1.5.3 + resolution: "react-grid-layout@npm:1.5.3" + dependencies: + clsx: "npm:^2.1.1" + fast-equals: "npm:^4.0.3" + prop-types: "npm:^15.8.1" + react-draggable: "npm:^4.4.6" + react-resizable: "npm:^3.0.5" + resize-observer-polyfill: "npm:^1.5.1" + peerDependencies: + react: ">= 16.3.0" + react-dom: ">= 16.3.0" + checksum: 10c0/e7ddacff138e7e83121b7356411a38056fa628dcd77ee8dfa5d5290fda76c2bafdc757578ed5cf4617731696e959ba8570f391b509e597f6563158ed2dd8dbb9 + languageName: node + linkType: hard + "react-helmet@npm:6.1.0": version: 6.1.0 resolution: "react-helmet@npm:6.1.0" @@ -31344,6 +32860,15 @@ __metadata: languageName: node linkType: hard +"react-relative-time@npm:^0.0.9": + version: 0.0.9 + resolution: "react-relative-time@npm:0.0.9" + peerDependencies: + react: ">=0.13.0" + checksum: 10c0/8489deccdae251812698d1bdce3239076e8237131565739a8c11f994183f585b6aa5a2a3564b6dae57e6ecd07eae8edc7992104e3720ca84776269c8d51a6055 + languageName: node + linkType: hard + "react-remove-scroll-bar@npm:^2.3.7": version: 2.3.8 resolution: "react-remove-scroll-bar@npm:2.3.8" @@ -31389,7 +32914,7 @@ __metadata: languageName: node linkType: hard -"react-resizable@npm:^3.0.5": +"react-resizable@npm:^3.0.4, react-resizable@npm:^3.0.5": version: 3.2.0 resolution: "react-resizable@npm:3.2.0" dependencies: @@ -31552,7 +33077,7 @@ __metadata: languageName: node linkType: hard -"react-use@npm:17.6.1, react-use@npm:^17.2.4, react-use@npm:^17.3.2": +"react-use@npm:17.6.1, react-use@npm:^17.2.4, react-use@npm:^17.3.2, react-use@npm:^17.5.0, react-use@npm:^17.6.0": version: 17.6.1 resolution: "react-use@npm:17.6.1" dependencies: @@ -31665,7 +33190,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^4.0.0": +"readable-stream@npm:^4.0.0, readable-stream@npm:^4.7.0": version: 4.7.0 resolution: "readable-stream@npm:4.7.0" dependencies: @@ -31678,6 +33203,15 @@ __metadata: languageName: node linkType: hard +"readable-web-to-node-stream@npm:^3.0.0": + version: 3.0.4 + resolution: "readable-web-to-node-stream@npm:3.0.4" + dependencies: + readable-stream: "npm:^4.7.0" + checksum: 10c0/2dc417d5d0b0c0191fcf57f87df3b2853db21d1da5554ec32b1e1c5a515e5a1243fc077a23f74046d711c2d736628f64b31054a8379b95bb016212430b5110c5 + languageName: node + linkType: hard + "readdir-glob@npm:^1.1.2": version: 1.1.3 resolution: "readdir-glob@npm:1.1.3" @@ -31834,6 +33368,20 @@ __metadata: languageName: node linkType: hard +"regenerator-runtime@npm:^0.10.5": + version: 0.10.5 + resolution: "regenerator-runtime@npm:0.10.5" + checksum: 10c0/2d21167780acfd6b4a93eb75d68345499bc4c887f465101e6facf6197f25963efadcab761dc77b45f252eccd3a5ebcf562a7edde54e437cec932fb92b2c30f65 + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.11.0": + version: 0.11.1 + resolution: "regenerator-runtime@npm:0.11.1" + checksum: 10c0/69cfa839efcf2d627fe358bf302ab8b24e5f182cb69f13e66f0612d3640d7838aad1e55662135e3ef2c1cc4322315b757626094fab13a48f9a64ab4bdeb8795b + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" @@ -33196,7 +34744,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4, side-channel@npm:^1.1.0": +"side-channel@npm:^1.0.4, side-channel@npm:^1.1.0, side-channel@npm:^1.1.1": version: 1.1.1 resolution: "side-channel@npm:1.1.1" dependencies: @@ -33357,6 +34905,16 @@ __metadata: languageName: node linkType: hard +"sonic-boom@npm:^0.7.5": + version: 0.7.7 + resolution: "sonic-boom@npm:0.7.7" + dependencies: + atomic-sleep: "npm:^1.0.0" + flatstr: "npm:^1.0.12" + checksum: 10c0/68c463a7bce3ec00cb4af4ceb1e77d44fb209d504479b665b65c6b13b272e3e099e3139623e94fa2fdc2b3f6582e7fd37c09aae17e2063f7e3d0da0f4153934b + languageName: node + linkType: hard + "sorted-array-functions@npm:^1.3.0": version: 1.3.0 resolution: "sorted-array-functions@npm:1.3.0" @@ -33663,6 +35221,16 @@ __metadata: languageName: node linkType: hard +"stream-browserify@npm:3.0.0, stream-browserify@npm:^3.0.0": + version: 3.0.0 + resolution: "stream-browserify@npm:3.0.0" + dependencies: + inherits: "npm:~2.0.4" + readable-stream: "npm:^3.5.0" + checksum: 10c0/ec3b975a4e0aa4b3dc5e70ffae3fc8fd29ac725353a14e72f213dff477b00330140ad014b163a8cbb9922dfe90803f81a5ea2b269e1bbfd8bd71511b88f889ad + languageName: node + linkType: hard + "stream-browserify@npm:^2.0.1": version: 2.0.2 resolution: "stream-browserify@npm:2.0.2" @@ -33673,16 +35241,6 @@ __metadata: languageName: node linkType: hard -"stream-browserify@npm:^3.0.0": - version: 3.0.0 - resolution: "stream-browserify@npm:3.0.0" - dependencies: - inherits: "npm:~2.0.4" - readable-stream: "npm:^3.5.0" - checksum: 10c0/ec3b975a4e0aa4b3dc5e70ffae3fc8fd29ac725353a14e72f213dff477b00330140ad014b163a8cbb9922dfe90803f81a5ea2b269e1bbfd8bd71511b88f889ad - languageName: node - linkType: hard - "stream-events@npm:^1.0.5": version: 1.0.5 resolution: "stream-events@npm:1.0.5" @@ -34042,6 +35600,16 @@ __metadata: languageName: node linkType: hard +"strtok3@npm:^6.2.4": + version: 6.3.0 + resolution: "strtok3@npm:6.3.0" + dependencies: + "@tokenizer/token": "npm:^0.3.0" + peek-readable: "npm:^4.1.0" + checksum: 10c0/8f1483a2a6758404502f2fc431586fcf37d747b10b125596ab5ec92319c247dd1195f82ba0bc2eaa582db3d807b5cca4b67ff61411756fec6622d051f8e255c2 + languageName: node + linkType: hard + "stubs@npm:^3.0.0": version: 3.0.0 resolution: "stubs@npm:3.0.0" @@ -34473,13 +36041,6 @@ __metadata: languageName: node linkType: hard -"tarn@npm:^3.0.2": - version: 3.0.2 - resolution: "tarn@npm:3.0.2" - checksum: 10c0/ea2344e3d21936111176375bd6f34eba69a38ef1bc59434d523fd313166f8a28a47b0a847846c119f72dcf2c1e1231596d74ac3fcfc3cc73966b3d293a327269 - languageName: node - linkType: hard - "tarn@npm:^3.1.0": version: 3.1.2 resolution: "tarn@npm:3.1.2" @@ -34841,6 +36402,16 @@ __metadata: languageName: node linkType: hard +"token-types@npm:^4.1.1": + version: 4.2.1 + resolution: "token-types@npm:4.2.1" + dependencies: + "@tokenizer/token": "npm:^0.3.0" + ieee754: "npm:^1.2.1" + checksum: 10c0/e9a4a139deba9515770cd7ac36a8f53f953b9d035d309e88a66d706760dba0df420753f2b8bdee6b9f3cbff8d66b24e69571e8dea27baa7b378229ab1bcca399 + languageName: node + linkType: hard + "token-types@npm:^6.1.1": version: 6.1.2 resolution: "token-types@npm:6.1.2" From d426389a5dbc558f28e1e5a3cf5ee90a03746220 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Thu, 16 Jul 2026 10:08:27 -0400 Subject: [PATCH 02/10] fix(app-next): align catalog deps with packages/app --- packages/app-next/package.json | 4 +- yarn.lock | 95 +++++++++++++++------------------- 2 files changed, 45 insertions(+), 54 deletions(-) diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 58c40612ba..160f223978 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -56,11 +56,11 @@ "@backstage/plugin-app-react": "0.2.4", "@backstage/plugin-app-visualizer": "0.2.5", "@backstage/plugin-auth-react": "0.1.28", - "@backstage/plugin-catalog": "2.0.7", + "@backstage/plugin-catalog": "2.0.6", "@backstage/plugin-catalog-common": "1.1.10", "@backstage/plugin-catalog-graph": "0.6.5", "@backstage/plugin-catalog-import": "0.13.14", - "@backstage/plugin-catalog-react": "3.2.0", + "@backstage/plugin-catalog-react": "3.1.0", "@backstage/plugin-catalog-unprocessed-entities": "0.2.32", "@backstage/plugin-home": "0.9.4", "@backstage/plugin-permission-react": "0.5.2", diff --git a/yarn.lock b/yarn.lock index 0228ad9f73..a2ce56842d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4803,39 +4803,40 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog-react@npm:3.2.0, @backstage/plugin-catalog-react@npm:^3.0.0, @backstage/plugin-catalog-react@npm:^3.1.0, @backstage/plugin-catalog-react@npm:^3.2.0": - version: 3.2.0 - resolution: "@backstage/plugin-catalog-react@npm:3.2.0" +"@backstage/plugin-catalog-react@npm:^2.1.0, @backstage/plugin-catalog-react@npm:^2.1.2": + version: 2.1.4 + resolution: "@backstage/plugin-catalog-react@npm:2.1.4" dependencies: - "@backstage/catalog-client": "npm:^1.16.1" - "@backstage/catalog-model": "npm:^1.9.0" - "@backstage/core-compat-api": "npm:^0.5.13" - "@backstage/core-components": "npm:^0.18.12" - "@backstage/core-plugin-api": "npm:^1.12.8" - "@backstage/errors": "npm:^1.3.1" - "@backstage/filter-predicates": "npm:^0.1.4" - "@backstage/frontend-plugin-api": "npm:^0.17.3" - "@backstage/integration-react": "npm:^1.2.20" - "@backstage/plugin-permission-common": "npm:^0.9.9" - "@backstage/plugin-permission-react": "npm:^0.5.3" + "@backstage/catalog-client": "npm:^1.15.0" + "@backstage/catalog-model": "npm:^1.8.0" + "@backstage/core-compat-api": "npm:^0.5.10" + "@backstage/core-components": "npm:^0.18.9" + "@backstage/core-plugin-api": "npm:^1.12.5" + "@backstage/errors": "npm:^1.3.0" + "@backstage/filter-predicates": "npm:^0.1.2" + "@backstage/frontend-plugin-api": "npm:^0.16.2" + "@backstage/integration-react": "npm:^1.2.17" + "@backstage/plugin-catalog-common": "npm:^1.1.9" + "@backstage/plugin-permission-common": "npm:^0.9.8" + "@backstage/plugin-permission-react": "npm:^0.5.0" "@backstage/types": "npm:^1.2.2" - "@backstage/ui": "npm:^0.17.0" + "@backstage/ui": "npm:^0.14.2" "@backstage/version-bridge": "npm:^1.0.12" "@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" - "@remixicon/react": "npm:>=4.6.0 <4.9.0" + "@remixicon/react": "npm:^4.6.0" classnames: "npm:^2.2.6" lodash: "npm:^4.17.21" material-ui-popup-state: "npm:^5.3.6" - qs: "npm:^6.15.2" + qs: "npm:^6.9.4" react-use: "npm:^17.2.4" yaml: "npm:^2.0.0" zen-observable: "npm:^0.10.0" zod: "npm:^4.0.0" peerDependencies: - "@backstage/frontend-test-utils": ^0.6.2 + "@backstage/frontend-test-utils": ^0.5.2 "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 @@ -4845,44 +4846,43 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10c0/dee0b80998d0ab98c073e1dd688c6c4398e59f5a247402096a3d9b02c71e0f332f223203c530518ebc9e15347954c963f8e869ab03b7c37a4fda4e2ddbfc4244 + checksum: 10c0/581d670a099835254d12ff224db6c67e7b986e227b975ced5cb1f2df349011102b85434fc51d2e49a50c513613e3feab8e99a00224c852440cb3bfbbebbb2ca4 languageName: node linkType: hard -"@backstage/plugin-catalog-react@npm:^2.1.0, @backstage/plugin-catalog-react@npm:^2.1.2": - version: 2.1.4 - resolution: "@backstage/plugin-catalog-react@npm:2.1.4" +"@backstage/plugin-catalog-react@npm:^3.0.0, @backstage/plugin-catalog-react@npm:^3.1.0, @backstage/plugin-catalog-react@npm:^3.2.0": + version: 3.2.0 + resolution: "@backstage/plugin-catalog-react@npm:3.2.0" dependencies: - "@backstage/catalog-client": "npm:^1.15.0" - "@backstage/catalog-model": "npm:^1.8.0" - "@backstage/core-compat-api": "npm:^0.5.10" - "@backstage/core-components": "npm:^0.18.9" - "@backstage/core-plugin-api": "npm:^1.12.5" - "@backstage/errors": "npm:^1.3.0" - "@backstage/filter-predicates": "npm:^0.1.2" - "@backstage/frontend-plugin-api": "npm:^0.16.2" - "@backstage/integration-react": "npm:^1.2.17" - "@backstage/plugin-catalog-common": "npm:^1.1.9" - "@backstage/plugin-permission-common": "npm:^0.9.8" - "@backstage/plugin-permission-react": "npm:^0.5.0" + "@backstage/catalog-client": "npm:^1.16.1" + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/core-compat-api": "npm:^0.5.13" + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/filter-predicates": "npm:^0.1.4" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/integration-react": "npm:^1.2.20" + "@backstage/plugin-permission-common": "npm:^0.9.9" + "@backstage/plugin-permission-react": "npm:^0.5.3" "@backstage/types": "npm:^1.2.2" - "@backstage/ui": "npm:^0.14.2" + "@backstage/ui": "npm:^0.17.0" "@backstage/version-bridge": "npm:^1.0.12" "@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" - "@remixicon/react": "npm:^4.6.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" classnames: "npm:^2.2.6" lodash: "npm:^4.17.21" material-ui-popup-state: "npm:^5.3.6" - qs: "npm:^6.9.4" + qs: "npm:^6.15.2" react-use: "npm:^17.2.4" yaml: "npm:^2.0.0" zen-observable: "npm:^0.10.0" zod: "npm:^4.0.0" peerDependencies: - "@backstage/frontend-test-utils": ^0.5.2 + "@backstage/frontend-test-utils": ^0.6.2 "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 @@ -4892,7 +4892,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10c0/581d670a099835254d12ff224db6c67e7b986e227b975ced5cb1f2df349011102b85434fc51d2e49a50c513613e3feab8e99a00224c852440cb3bfbbebbb2ca4 + checksum: 10c0/dee0b80998d0ab98c073e1dd688c6c4398e59f5a247402096a3d9b02c71e0f332f223203c530518ebc9e15347954c963f8e869ab03b7c37a4fda4e2ddbfc4244 languageName: node linkType: hard @@ -4984,7 +4984,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog@npm:2.0.7, @backstage/plugin-catalog@npm:^2.0.6": +"@backstage/plugin-catalog@npm:^2.0.6": version: 2.0.7 resolution: "@backstage/plugin-catalog@npm:2.0.7" dependencies: @@ -15563,7 +15563,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:24.13.3": +"@types/node@npm:24.13.3, @types/node@npm:^24.10.2": version: 24.13.3 resolution: "@types/node@npm:24.13.3" dependencies: @@ -15595,15 +15595,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^24.10.2": - version: 24.13.2 - resolution: "@types/node@npm:24.13.2" - dependencies: - undici-types: "npm:~7.18.0" - checksum: 10c0/d7d48a88a4feb0a6aac3cbfaf9ef3b12752b4b09447f88dd0b4c77c03b281e3d4330fe6982a99aedcd63fc16c7540a0c248b91eb2abb0b3edd884d7fe684e9ea - languageName: node - linkType: hard - "@types/oauth@npm:*": version: 0.9.6 resolution: "@types/oauth@npm:0.9.6" @@ -17128,11 +17119,11 @@ __metadata: "@backstage/plugin-app-react": "npm:0.2.4" "@backstage/plugin-app-visualizer": "npm:0.2.5" "@backstage/plugin-auth-react": "npm:0.1.28" - "@backstage/plugin-catalog": "npm:2.0.7" + "@backstage/plugin-catalog": "npm:2.0.6" "@backstage/plugin-catalog-common": "npm:1.1.10" "@backstage/plugin-catalog-graph": "npm:0.6.5" "@backstage/plugin-catalog-import": "npm:0.13.14" - "@backstage/plugin-catalog-react": "npm:3.2.0" + "@backstage/plugin-catalog-react": "npm:3.1.0" "@backstage/plugin-catalog-unprocessed-entities": "npm:0.2.32" "@backstage/plugin-home": "npm:0.9.4" "@backstage/plugin-permission-react": "npm:0.5.2" From d1f20946913caac4a3a8ef34925feb908de36403 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Thu, 16 Jul 2026 12:16:49 -0400 Subject: [PATCH 03/10] chore: trigger PR image rebuild for e2e From 1b84e28c2029d52254d26ae309489a9928c904ec Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Thu, 16 Jul 2026 21:49:53 -0400 Subject: [PATCH 04/10] resolved downgraded version issue Signed-off-by: Yi Cai --- packages/app-next/package.json | 4 +- packages/app/package.json | 4 +- yarn.lock | 133 +++++---------------------------- 3 files changed, 23 insertions(+), 118 deletions(-) diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 160f223978..58c40612ba 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -56,11 +56,11 @@ "@backstage/plugin-app-react": "0.2.4", "@backstage/plugin-app-visualizer": "0.2.5", "@backstage/plugin-auth-react": "0.1.28", - "@backstage/plugin-catalog": "2.0.6", + "@backstage/plugin-catalog": "2.0.7", "@backstage/plugin-catalog-common": "1.1.10", "@backstage/plugin-catalog-graph": "0.6.5", "@backstage/plugin-catalog-import": "0.13.14", - "@backstage/plugin-catalog-react": "3.1.0", + "@backstage/plugin-catalog-react": "3.2.0", "@backstage/plugin-catalog-unprocessed-entities": "0.2.32", "@backstage/plugin-home": "0.9.4", "@backstage/plugin-permission-react": "0.5.2", diff --git a/packages/app/package.json b/packages/app/package.json index bce29b06a2..f19cdc4eb6 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -30,11 +30,11 @@ "@backstage/core-plugin-api": "1.12.7", "@backstage/integration-react": "1.2.19", "@backstage/plugin-api-docs": "0.14.2", - "@backstage/plugin-catalog": "2.0.6", + "@backstage/plugin-catalog": "2.0.7", "@backstage/plugin-catalog-common": "1.1.10", "@backstage/plugin-catalog-graph": "0.6.5", "@backstage/plugin-catalog-import": "0.13.14", - "@backstage/plugin-catalog-react": "3.1.0", + "@backstage/plugin-catalog-react": "3.2.0", "@backstage/plugin-org": "0.7.5", "@backstage/plugin-permission-react": "0.5.2", "@backstage/plugin-scaffolder": "1.38.0", diff --git a/yarn.lock b/yarn.lock index a2ce56842d..890513d2a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4757,23 +4757,23 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog-react@npm:3.1.0": - version: 3.1.0 - resolution: "@backstage/plugin-catalog-react@npm:3.1.0" +"@backstage/plugin-catalog-react@npm:3.2.0, @backstage/plugin-catalog-react@npm:^3.0.0, @backstage/plugin-catalog-react@npm:^3.1.0, @backstage/plugin-catalog-react@npm:^3.2.0": + version: 3.2.0 + resolution: "@backstage/plugin-catalog-react@npm:3.2.0" dependencies: - "@backstage/catalog-client": "npm:^1.16.0" + "@backstage/catalog-client": "npm:^1.16.1" "@backstage/catalog-model": "npm:^1.9.0" - "@backstage/core-compat-api": "npm:^0.5.12" - "@backstage/core-components": "npm:^0.18.11" - "@backstage/core-plugin-api": "npm:^1.12.7" + "@backstage/core-compat-api": "npm:^0.5.13" + "@backstage/core-components": "npm:^0.18.12" + "@backstage/core-plugin-api": "npm:^1.12.8" "@backstage/errors": "npm:^1.3.1" - "@backstage/filter-predicates": "npm:^0.1.3" - "@backstage/frontend-plugin-api": "npm:^0.17.2" - "@backstage/integration-react": "npm:^1.2.19" + "@backstage/filter-predicates": "npm:^0.1.4" + "@backstage/frontend-plugin-api": "npm:^0.17.3" + "@backstage/integration-react": "npm:^1.2.20" "@backstage/plugin-permission-common": "npm:^0.9.9" - "@backstage/plugin-permission-react": "npm:^0.5.2" + "@backstage/plugin-permission-react": "npm:^0.5.3" "@backstage/types": "npm:^1.2.2" - "@backstage/ui": "npm:^0.16.0" + "@backstage/ui": "npm:^0.17.0" "@backstage/version-bridge": "npm:^1.0.12" "@material-ui/core": "npm:^4.12.2" "@material-ui/icons": "npm:^4.9.1" @@ -4789,7 +4789,7 @@ __metadata: zen-observable: "npm:^0.10.0" zod: "npm:^4.0.0" peerDependencies: - "@backstage/frontend-test-utils": ^0.6.1 + "@backstage/frontend-test-utils": ^0.6.2 "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 @@ -4799,7 +4799,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10c0/44dcb31ef75e4b74f1c7da0837673ae113cbc158d42d7e50bf9cd5c6d4fb2be4e389507722084e81cecef17612a91abe45e69ef9f08923001f1860b9decea244 + checksum: 10c0/dee0b80998d0ab98c073e1dd688c6c4398e59f5a247402096a3d9b02c71e0f332f223203c530518ebc9e15347954c963f8e869ab03b7c37a4fda4e2ddbfc4244 languageName: node linkType: hard @@ -4850,52 +4850,6 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog-react@npm:^3.0.0, @backstage/plugin-catalog-react@npm:^3.1.0, @backstage/plugin-catalog-react@npm:^3.2.0": - version: 3.2.0 - resolution: "@backstage/plugin-catalog-react@npm:3.2.0" - dependencies: - "@backstage/catalog-client": "npm:^1.16.1" - "@backstage/catalog-model": "npm:^1.9.0" - "@backstage/core-compat-api": "npm:^0.5.13" - "@backstage/core-components": "npm:^0.18.12" - "@backstage/core-plugin-api": "npm:^1.12.8" - "@backstage/errors": "npm:^1.3.1" - "@backstage/filter-predicates": "npm:^0.1.4" - "@backstage/frontend-plugin-api": "npm:^0.17.3" - "@backstage/integration-react": "npm:^1.2.20" - "@backstage/plugin-permission-common": "npm:^0.9.9" - "@backstage/plugin-permission-react": "npm:^0.5.3" - "@backstage/types": "npm:^1.2.2" - "@backstage/ui": "npm:^0.17.0" - "@backstage/version-bridge": "npm:^1.0.12" - "@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" - "@remixicon/react": "npm:>=4.6.0 <4.9.0" - classnames: "npm:^2.2.6" - lodash: "npm:^4.17.21" - material-ui-popup-state: "npm:^5.3.6" - qs: "npm:^6.15.2" - react-use: "npm:^17.2.4" - yaml: "npm:^2.0.0" - zen-observable: "npm:^0.10.0" - zod: "npm:^4.0.0" - peerDependencies: - "@backstage/frontend-test-utils": ^0.6.2 - "@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: - "@backstage/frontend-test-utils": - optional: true - "@types/react": - optional: true - checksum: 10c0/dee0b80998d0ab98c073e1dd688c6c4398e59f5a247402096a3d9b02c71e0f332f223203c530518ebc9e15347954c963f8e869ab03b7c37a4fda4e2ddbfc4244 - languageName: node - linkType: hard - "@backstage/plugin-catalog-unprocessed-entities-common@npm:^0.0.16": version: 0.0.16 resolution: "@backstage/plugin-catalog-unprocessed-entities-common@npm:0.0.16" @@ -4935,56 +4889,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog@npm:2.0.6": - version: 2.0.6 - resolution: "@backstage/plugin-catalog@npm:2.0.6" - dependencies: - "@backstage/catalog-client": "npm:^1.16.0" - "@backstage/catalog-model": "npm:^1.9.0" - "@backstage/core-compat-api": "npm:^0.5.12" - "@backstage/core-components": "npm:^0.18.11" - "@backstage/core-plugin-api": "npm:^1.12.7" - "@backstage/errors": "npm:^1.3.1" - "@backstage/frontend-plugin-api": "npm:^0.17.2" - "@backstage/integration-react": "npm:^1.2.19" - "@backstage/plugin-catalog-common": "npm:^1.1.10" - "@backstage/plugin-catalog-react": "npm:^3.1.0" - "@backstage/plugin-permission-react": "npm:^0.5.2" - "@backstage/plugin-scaffolder-common": "npm:^2.2.1" - "@backstage/plugin-search-common": "npm:^1.2.24" - "@backstage/plugin-search-react": "npm:^1.11.5" - "@backstage/plugin-techdocs-common": "npm:^0.1.1" - "@backstage/plugin-techdocs-react": "npm:^1.3.12" - "@backstage/types": "npm:^1.2.2" - "@backstage/ui": "npm:^0.16.0" - "@backstage/version-bridge": "npm:^1.0.12" - "@material-ui/core": "npm:^4.12.2" - "@material-ui/icons": "npm:^4.9.1" - "@material-ui/lab": "npm:4.0.0-alpha.61" - "@mui/utils": "npm:^5.14.15" - "@remixicon/react": "npm:^4.6.0" - classnames: "npm:^2.3.1" - csv-stringify: "npm:^5.6.5" - dataloader: "npm:^2.0.0" - lodash: "npm:^4.17.21" - pluralize: "npm:^8.0.0" - react-helmet: "npm:6.1.0" - react-use: "npm:^17.2.4" - zen-observable: "npm:^0.10.0" - zod: "npm:^4.0.0" - 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/29cc7a667b4c79cdb7c18b9e251bdd9925c15bc37ff480147952df4637febac088a166902b53736c67526199db39d3791021e998672b5d908f22b6b076946ab9 - languageName: node - linkType: hard - -"@backstage/plugin-catalog@npm:^2.0.6": +"@backstage/plugin-catalog@npm:2.0.7, @backstage/plugin-catalog@npm:^2.0.6": version: 2.0.7 resolution: "@backstage/plugin-catalog@npm:2.0.7" dependencies: @@ -17119,11 +17024,11 @@ __metadata: "@backstage/plugin-app-react": "npm:0.2.4" "@backstage/plugin-app-visualizer": "npm:0.2.5" "@backstage/plugin-auth-react": "npm:0.1.28" - "@backstage/plugin-catalog": "npm:2.0.6" + "@backstage/plugin-catalog": "npm:2.0.7" "@backstage/plugin-catalog-common": "npm:1.1.10" "@backstage/plugin-catalog-graph": "npm:0.6.5" "@backstage/plugin-catalog-import": "npm:0.13.14" - "@backstage/plugin-catalog-react": "npm:3.1.0" + "@backstage/plugin-catalog-react": "npm:3.2.0" "@backstage/plugin-catalog-unprocessed-entities": "npm:0.2.32" "@backstage/plugin-home": "npm:0.9.4" "@backstage/plugin-permission-react": "npm:0.5.2" @@ -17181,11 +17086,11 @@ __metadata: "@backstage/frontend-test-utils": "npm:0.6.1" "@backstage/integration-react": "npm:1.2.19" "@backstage/plugin-api-docs": "npm:0.14.2" - "@backstage/plugin-catalog": "npm:2.0.6" + "@backstage/plugin-catalog": "npm:2.0.7" "@backstage/plugin-catalog-common": "npm:1.1.10" "@backstage/plugin-catalog-graph": "npm:0.6.5" "@backstage/plugin-catalog-import": "npm:0.13.14" - "@backstage/plugin-catalog-react": "npm:3.1.0" + "@backstage/plugin-catalog-react": "npm:3.2.0" "@backstage/plugin-org": "npm:0.7.5" "@backstage/plugin-permission-react": "npm:0.5.2" "@backstage/plugin-scaffolder": "npm:1.38.0" From 5534d5099110222538f902a3c5c2f30f1c926b46 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Sat, 18 Jul 2026 14:46:10 -0400 Subject: [PATCH 05/10] addressed review comments Signed-off-by: Yi Cai --- app-config.yaml | 59 - packages/app-next/README.md | 261 +++- .../app-next/dynamic-plugins.example.yaml | 114 ++ packages/app-next/package.json | 5 +- packages/app-next/src/App.test.tsx | 15 +- packages/app-next/src/App.tsx | 50 +- .../collectLoadableFeatures.ts | 29 + .../rhdhDynamicFrontendFeaturesLoader.test.ts | 26 + .../rhdhDynamicFrontendFeaturesLoader.ts | 163 +++ .../src/modules/quickstartHelp/index.tsx | 41 - .../modules/signIn/SignInPageComponent.tsx | 14 - packages/app-next/src/modules/signIn/index.ts | 14 - yarn.lock | 1076 +++++------------ 13 files changed, 833 insertions(+), 1034 deletions(-) create mode 100644 packages/app-next/dynamic-plugins.example.yaml create mode 100644 packages/app-next/src/modules/dynamicFeatures/collectLoadableFeatures.ts create mode 100644 packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.test.ts create mode 100644 packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.ts delete mode 100644 packages/app-next/src/modules/quickstartHelp/index.tsx delete mode 100644 packages/app-next/src/modules/signIn/SignInPageComponent.tsx delete mode 100644 packages/app-next/src/modules/signIn/index.ts diff --git a/app-config.yaml b/app-config.yaml index 8ec190833f..57a26f086b 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -3,52 +3,6 @@ developerHub: app: title: Red Hat Developer Hub baseUrl: http://localhost:3000 - # NFS extension settings for plugins statically bundled in app-next - # (homepage, global-header, quickstart). - extensions: - # Homepage — route, visit tracking, and default RHDH layout - - page:home: - config: - path: / - - api:home/visits: true - - app-root-element:home/visit-listener: true - - home-page-layout:home/dynamic-homepage-layout: - config: - customizable: true - widgetLayout: - RhdhTemplateSection: - priority: 300 - breakpoints: - xl: { w: 12, h: 5 } - lg: { w: 12, h: 5 } - md: { w: 12, h: 5 } - sm: { w: 12, h: 5 } - xs: { w: 12, h: 7.5 } - xxs: { w: 12, h: 13.5 } - RhdhEntitySection: - priority: 200 - breakpoints: - xl: { w: 12, h: 7 } - lg: { w: 12, h: 7 } - md: { w: 12, h: 8 } - sm: { w: 12, h: 9 } - xs: { w: 12, h: 11 } - xxs: { w: 12, h: 15 } - RhdhOnboardingSection: - priority: 100 - breakpoints: - xl: { w: 12, h: 6 } - lg: { w: 12, h: 6 } - md: { w: 12, h: 7 } - sm: { w: 12, h: 8 } - xs: { w: 12, h: 9 } - xxs: { w: 12, h: 14 } - # Global header and quickstart drawer - - app-root-wrapper:app/global-header: true - - app-root-wrapper:app/drawer: true - - app-drawer-content:quickstart/quickstart: true - - gh-menu-item:quickstart/quickstart: false - - gh-menu-item:app/quickstart-help: true branding: fullLogoWidth: ${FULL_LOGO_WIDTH} theme: @@ -217,18 +171,5 @@ dynatrace: permission: enabled: ${PERMISSION_ENABLED} -# Auth providers for local development (app-next via `backend start:next`). -# Guest works out of the box; GitHub requires GITHUB_OAUTH_APP_ID and -# GITHUB_OAUTH_APP_SECRET (create a GitHub OAuth App with callback URL -# `/api/auth/github/handler/frame`). -auth: - environment: development - providers: - guest: {} - github: - development: - clientId: ${GITHUB_OAUTH_APP_ID} - clientSecret: ${GITHUB_OAUTH_APP_SECRET} - dynamicPlugins: rootDirectory: dynamic-plugins-root diff --git a/packages/app-next/README.md b/packages/app-next/README.md index 99abfc2991..c6cb7a7c00 100644 --- a/packages/app-next/README.md +++ b/packages/app-next/README.md @@ -2,106 +2,221 @@ ## Overview -This package contains the Red Hat Developer Hub (RHDH) frontend application built using Backstage's [new frontend system](https://backstage.io/docs/frontend-system/architecture/index). It is the NFS (New Frontend System) app shell used for local development and for testing plugins loaded via module federation. +This package is the Red Hat Developer Hub (RHDH) **NFS** (New Frontend System) app shell. It keeps core Backstage plugins that still need to ship with the app, plus a Module Federation feature loader for remotes from `dynamic-plugins-root`. -The shell includes RHDH theme, sign-in, navigation sidebar, home page, global header, quickstart, and the dynamic feature loader. Optional plugins (for example notifications or signals) are **not** bundled here — they are deployed separately to `dynamic-plugins-root` and loaded at runtime. +Most RHDH product UX loads as **dynamic plugins** (sign-in via **app-auth**, global-header, quickstart, …) so those pieces stay swappable — see [`dynamic-plugins.example.yaml`](./dynamic-plugins.example.yaml). + +**Homepage exception (temporary):** published OCI homepage overlays are still OFS-shaped for NFS, so this shell statically mounts RHDH `homePageModule` so `/` works for local NFS verification (including homepage cards such as unread notifications). Prefer loading homepage via MF when an NFS-capable overlay exists, or use the [local export](#local-nfs-export-homepage--theme) path below. ## Prerequisites - Dependencies installed from the repo root: `yarn install` -- A local config overlay such as `app-config.local.yaml` (not committed) that points the backend at this app and your local port -- Backend dynamic plugins copied or exported into `dynamic-plugins-root/` as needed for your scenario +- A local config overlay such as `app-config.local.yaml` (not committed) +- `skopeo` available on your PATH (for pulling OCI plugin overlays) +- Dynamic plugins installed into `dynamic-plugins-root/` for the UX you want to test ## First-time setup -Build the app shell before starting the backend: +### 1. Build the app shell ```bash # from the repo root EXPERIMENTAL_MODULE_FEDERATION=true yarn workspace app-next build ``` -## Running locally +### 2. Install default dynamic plugins -The recommended workflow serves `app-next` through the backend: +Populate `dynamic-plugins-root` from the example plugin set (OCI overlays via `install-dynamic-plugins`). Requires `skopeo`: ```bash # from the repo root -yarn workspace backend start:next +cp packages/app-next/dynamic-plugins.example.yaml dynamic-plugins.yaml +npx -y @red-hat-developer-hub/cli-module-install-dynamic-plugins@0.2.0 \ + install dynamic-plugins-root ``` -`start:next` sets `APP_CONFIG_app_packageName=app-next` and `ENABLE_STANDARD_MODULE_FEDERATION=true` automatically (see `packages/backend/package.json`). +- Uncomment additional entries in [`dynamic-plugins.example.yaml`](./dynamic-plugins.example.yaml) (sourced from [default.packages.yaml](https://github.com/redhat-developer/rhdh-plugin-export-overlays/blob/main/default.packages.yaml)) before copying if you need more plugins. +- Re-run the install when you change the enabled plugin list. +- Leave homepage/theme OCI entries **commented** — the shell already provides NFS homepage statically; OCI tags would overwrite a local homepage export with OFS assets. + +### 3. Local config for homepage + +Put NFS `app.extensions` in `app-config.local.yaml` only (not shared `app-config.yaml`): + +```yaml +app: + baseUrl: http://localhost:7007 + extensions: + - page:home: + config: + path: / + - api:home/visits: true + - app-root-element:home/visit-listener: true + - home-page-layout:home/dynamic-homepage-layout: + config: + customizable: true + - app-root-wrapper:app/global-header: true + - app-root-wrapper:app/drawer: true + - app-drawer-content:quickstart/quickstart: true + +backend: + baseUrl: http://localhost:7007 + listen: + port: 7007 + cors: + origin: http://localhost:7007 + methods: [GET, HEAD, PATCH, POST, PUT, DELETE] + credentials: true -Wait for logs similar to: +auth: + environment: development + providers: + guest: {} -```text -Listening on :7011 -Serving static app content from .../packages/app-next/dist +dynamicPlugins: + rootDirectory: dynamic-plugins-root ``` -Then open the app at your configured `app.baseUrl` (for example `http://localhost:7011`). +**Sign-in:** load **app-auth** (and typically **app-integrations**) via the example YAML. Configure providers under `auth.providers` in your local overlay. + +## Running locally -Rebuild `app-next` after changing files under `packages/app-next/`: +### Frontend iteration (hot reload) + +```bash +yarn workspace app-next start +``` + +### Full stack with Module Federation + +```bash +yarn workspace backend start:next +``` + +`start:next` sets `APP_CONFIG_app_packageName=app-next` and `ENABLE_STANDARD_MODULE_FEDERATION=true` (see `packages/backend/package.json`). The backend serves `packages/app-next/dist` from its own port (default **7007** unless overridden in `app-config.local.yaml`). + +Rebuild the shell after changing files under `packages/app-next/` when using `start:next`: ```bash EXPERIMENTAL_MODULE_FEDERATION=true yarn workspace app-next build ``` -Restart the backend to pick up a new build. +## Verifying the shell + +1. With app-auth installed, sign in (guest when `auth.environment: development` and `auth.providers.guest` are set). +2. Open `/` — RHDH homepage layout/widgets should render (`homePlugin` + static `homePageModule`). +3. With global-header / quickstart installed, confirm those surfaces render. +4. Open `/visualizer/tree` and confirm core extensions (for example `page:catalog`, `page:home`) load. + +## Testing homepage cards (e.g. unread notifications) + +NFS homepage cards are **not** OFS `home.page/cards` mount points. They register as `HomePageWidgetBlueprint` extensions on `page:home`. + +The unread-notifications card lives in a local/patched `@backstage/plugin-notifications` as `notificationsHomeModule` (MF expose `notifications-home-module`). Stock npm / RHDH wrapper OCI builds do **not** include that widget yet. + +### A. Keep NFS homepage in the shell (default) + +No change needed: `App.tsx` already includes `homePlugin` + `homePageModule`. + +### B. Export notifications (+ signals) into `dynamic-plugins-root` + +From a Backstage checkout that contains the NFS home widget (exposes `.`, `alpha`, and `notifications-home-module`): + +```bash +# Frontend — prefer package bundle / export that generates MF assets +cd /path/to/backstage/plugins/notifications +yarn build --role frontend-dynamic-container +# or: npx backstage-cli package bundle --output-destination /dynamic-plugins-root +# Ensure the result lands under: +# /dynamic-plugins-root/backstage-plugin-notifications-dynamic +# (or equivalent) with dist/mf-manifest.json exposing notifications-home-module + +# Also export signals (frontend + backend) if not already present — live updates +# depend on them. Use your usual wrapper/export flow into dynamic-plugins-root. +``` + +Sanity check: + +```bash +python3 -c "import json; m=json.load(open('dynamic-plugins-root/backstage-plugin-notifications-dynamic/dist/mf-manifest.json')); print([e['name'] for e in m['exposes']])" +# expect: ['.', 'alpha', 'notifications-home-module'] +``` -## Local configuration +Backend notifications (and signals backend) must also be available under `dynamic-plugins-root` for the API to work. -Use `app-config.local.yaml` to override defaults from `app-config.yaml`. Typical settings for NFS local development: +### C. Enable the widget in `app-config.local.yaml` ```yaml app: - baseUrl: http://localhost:7011 + extensions: + - home-page-widget:home/unread-notifications: true + # optional layout (widget name = HomePageWidgetBlueprint params.name) + - home-page-layout:home/dynamic-homepage-layout: + config: + customizable: true + widgetLayout: + UnreadNotifications: + priority: 50 + breakpoints: + xl: { w: 6, h: 4 } +``` -backend: - baseUrl: http://localhost:7011 - listen: - port: 7011 - cors: - origin: http://localhost:7011 - methods: [GET, HEAD, PATCH, POST, PUT, DELETE] - credentials: true - csp: - connect-src: - - "'self'" - - 'http:' - - 'https:' - # Required when testing plugins that use WebSockets (for example signals): - # - 'ws:' - # - 'wss:' +Do **not** rely on OFS `dynamicPlugins.frontend.backstage.plugin-notifications.mountPoints` for `app-next` — that path is legacy Scalprum only. -dynamicPlugins: - rootDirectory: dynamic-plugins-root +### D. Rebuild and verify + +```bash +EXPERIMENTAL_MODULE_FEDERATION=true yarn workspace app-next build +yarn workspace backend start:next ``` -Quickstart, homepage, and global-header NFS extensions plus guest/GitHub auth providers are defined in `app-config.yaml`. For GitHub sign-in, set `GITHUB_OAUTH_APP_ID` and `GITHUB_OAUTH_APP_SECRET` in your environment (or in `app-config.local.yaml`) and ensure the OAuth App callback URL matches `/api/auth/github/handler/frame`. +In `/visualizer/tree`, confirm: -Sign-in: +- `home-page-widget:home/unread-notifications` +- `api:notifications/notifications` (or equivalent notifications API) +- `page:home` -- **Guest** — enabled via `auth.providers.guest` in `app-config.yaml`. -- **GitHub** — offered on the sign-in page when `GITHUB_OAUTH_APP_ID` and `GITHUB_OAUTH_APP_SECRET` are configured. +Then open `/` and confirm the unread notifications card on the grid. -## Verifying the shell +## Local NFS export (homepage & theme) -1. Sign in as guest (or with a configured provider). -2. Confirm the home page, sidebar (Home, Catalog, Scaffolder, Search), and global header render. -3. Open the extension visualizer at `/visualizer/tree` and confirm core extensions load (for example `page:home`, `page:catalog`). +Use this when you need to iterate on homepage/theme from [rhdh-plugins](https://github.com/redhat-developer/rhdh-plugins) as MF remotes (closer to the long-term DP-first model). Full NFS plugin migration is tracked separately; this is the local workaround until overlays ship NFS `alpha`. -Loading additional NFS plugins via module federation is documented separately (see repo docs for exporting plugins to `dynamic-plugins-root`). +**Prerequisite — `alpha` must default-export a `FrontendFeature`.** Backstage’s MF remote build only exposes non-`.` package entry points (including `./alpha`) when the default export is a frontend feature. Homepage/theme currently ship NFS pieces as **named** exports only (`homePageModule`, `rhdhThemeModule`), so a plain export produces expose `.` only. -## Standalone frontend development +In your local `rhdh-plugins` tree, add a temporary default (or land this in the NFS migration epic): -You can run the frontend dev server without the full backend workflow: +```ts +// workspaces/homepage/plugins/homepage/src/alpha/index.ts +export default homePageModule; + +// workspaces/theme/plugins/theme/src/alpha/index.ts +export default rhdhThemeModule; +``` + +Then: ```bash -yarn workspace app-next start +# from rhdh-plugins (install/build the workspace once if needed) +cd workspaces/homepage/plugins/homepage +yarn build +npx -y @red-hat-developer-hub/cli plugin export --clean --dev \ + --dynamic-plugins-root "$HOME/redhat/rhdh/dynamic-plugins-root" + +cd ../../../theme/plugins/theme +yarn build +npx -y @red-hat-developer-hub/cli plugin export --clean --dev \ + --dynamic-plugins-root "$HOME/redhat/rhdh/dynamic-plugins-root" +``` + +**Sanity check:** + +```bash +python3 -c "import json; m=json.load(open('dynamic-plugins-root/red-hat-developer-hub-backstage-plugin-homepage/dist/mf-manifest.json')); print([e['name'] for e in m['exposes']])" +# expect: ['.', 'alpha'] ``` -This uses `app-config.yaml` only and does not enable the same module federation backend integration as `start:next`. +**When using the local homepage remote:** remove the static `homePageModule` import from `src/App.tsx` (keep `homePlugin`), rebuild app-next, and restart `start:next`. Keep homepage/theme OCI entries commented so install does not overwrite your export. ## Other commands @@ -113,21 +228,47 @@ This uses `app-config.yaml` only and does not enable the same module federation ## Architecture -Static features registered in `src/App.tsx`: +Static features in `src/App.tsx`: | Module | Purpose | |--------|---------| -| `rhdhThemeModule` | RHDH branding and theme | -| `signInModule` | Sign-in page (guest + GitHub) | -| `navModule` | Sidebar navigation | -| `homePlugin` / `homePageModule` | Home page and RHDH homepage layout | -| `globalHeaderPlugin` | Top navigation bar (loaded after MF remotes) | -| `quickstartPlugin` | Quickstart drawer and content | -| `dynamicFrontendFeaturesLoader()` | Loads NFS plugins from `dynamic-plugins-root` | +| `navModule` | Sidebar navigation layout | +| `appVisualizerPlugin` | Extension visualizer (`/visualizer`) | +| `catalogPlugin` / `homePlugin` / `scaffolderPlugin` / `searchPlugin` / `userSettingsPlugin` | Core Backstage plugins (`home` is required host for RHDH homepage + card widgets) | +| `homePageModule` | **Temporary** RHDH homepage layout/widgets — see below | +| `appDrawerModule` | Drawer host for DP content (e.g. quickstart); no app-react overlay yet | +| `rhdhDynamicFrontendFeaturesLoader()` | Temporary helper — loads NFS remotes from `dynamic-plugins-root` | + +### Temporary: static `homePageModule` + +Published OCI homepage overlays are still **OFS-shaped** (MF expose is only `.`, default is not a `FrontendFeature`). The NFS loader skips them. + +Until an NFS-capable overlay ships (or you use a [local NFS export](#local-nfs-export-homepage--theme)): + +1. Keep `@backstage/plugin-home` (`homePlugin`) in the shell — host for `pluginId: 'home'` widgets. +2. Keep `homePageModule` from `@red-hat-developer-hub/backstage-plugin-homepage/alpha` static so `/` works for team verification without patching `rhdh-plugins`. +3. Leave homepage (and theme) OCI entries commented in [`dynamic-plugins.example.yaml`](./dynamic-plugins.example.yaml). + +**Removal:** when a published NFS overlay works via MF, delete the static `homePageModule` import, enable the OCI entry, and rely on `rhdhDynamicFrontendFeaturesLoader`. + +### Temporary helper: `rhdhDynamicFrontendFeaturesLoader` + +**Location:** [`src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.ts`](./src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.ts) + +**Why it exists:** The stock Backstage [`dynamicFrontendFeaturesLoader`](https://github.com/backstage/backstage/tree/master/packages/frontend-dynamic-feature-loader) only registers each remote module’s **`default`** export. Some RHDH NFS packages still put required shell pieces in **named** exports (for example global-header: default `globalHeaderPlugin` plus named `globalHeaderModule` for the `AppRootWrapper`). Without the helper, those named features never mount. + +The helper keeps the same remotes discovery/MF flow, but also registers every loadable named `FrontendPlugin` / `FrontendModule` export (deduped by reference). That also picks up notifications’ `notifications-home-module` expose when present. + +**Follow-up / removal criteria:** When published OCI overlays default-export the NFS features that matter (or otherwise make a single `default` sufficient for each remote), switch `App.tsx` back to: + +```ts +import { dynamicFrontendFeaturesLoader } from '@backstage/frontend-dynamic-feature-loader'; +``` -Plugin load order matters: `dynamicFrontendFeaturesLoader()` runs before static global header so the static header wins if the same plugin is also present as an MF remote. +Then delete `src/modules/dynamicFeatures/` (loader + `collectLoadableFeatures` helper and its unit test). ## Related documentation - [Backstage new frontend system](https://backstage.io/docs/frontend-system/architecture/index) -- Exporting and testing NFS plugins via module federation — see companion doc in this repo (Part 2) +- [app-defaults: app-auth / app-integrations](https://github.com/redhat-developer/rhdh-plugins/tree/main/workspaces/app-defaults) — intended to load dynamically into RHDH, not statically into this shell +- [rhdh-plugin-export-overlays default.packages.yaml](https://github.com/redhat-developer/rhdh-plugin-export-overlays/blob/main/default.packages.yaml) diff --git a/packages/app-next/dynamic-plugins.example.yaml b/packages/app-next/dynamic-plugins.example.yaml new file mode 100644 index 0000000000..581f74e810 --- /dev/null +++ b/packages/app-next/dynamic-plugins.example.yaml @@ -0,0 +1,114 @@ +# Example dynamic-plugins set for a typical RHDH NFS (app-next) local experience. +# +# Install into dynamic-plugins-root (from the repo root), then start with +# `yarn workspace backend start:next`: +# +# cp packages/app-next/dynamic-plugins.example.yaml dynamic-plugins.yaml +# npx -y @red-hat-developer-hub/cli-module-install-dynamic-plugins@0.2.0 \ +# install dynamic-plugins-root +# +# Or merge the `plugins:` entries into your own dynamic-plugins.yaml / Helm +# `global.dynamic.plugins` values. See also e2e-tests/local-harness/populate.sh. +# +# Sign-in comes from app-auth (not a static module in app-next), so it stays +# swappable. Pair with app-integrations when you need default SCM auth APIs. +# +# The commented entries under "Additional packages.enabled" mirror the enabled +# list in rhdh-plugin-export-overlays/default.packages.yaml — uncomment as needed. +# +# NOTE: Overlay tags below track published OCI builds and may lag the Backstage +# version in this repo. Prefer matching `bs___` tags when +# available; otherwise use the newest published tag for each package. + +plugins: + # --- Minimal NFS shell UX (enabled by default in this example) --- + + # RHDH multi-provider sign-in page + OIDC/Auth0/SAML frontend APIs + - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-app-auth:next__0.0.2!red-hat-developer-hub-backstage-plugin-app-auth + disabled: false + + # Default SCM integrations / scmAuth wiring (github, gitlab, azure, bitbucket) + - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-app-integrations:next__0.0.2!red-hat-developer-hub-backstage-plugin-app-integrations + disabled: false + + # RHDH theme — OCI tags are still OFS-shaped; leave commented until NFS overlay exists. + # Optional local NFS: export from rhdh-plugins (packages/app-next/README.md). + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-theme:next__0.14.5!red-hat-developer-hub-backstage-plugin-theme + # disabled: false + + # Homepage — OCI still OFS-shaped. app-next mounts homePageModule statically so + # NFS / works for card verification. Do not enable this OCI tag (overwrites a + # local homepage export). See README → Testing homepage cards / Local NFS export. + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-homepage:pr_2644__1.15.0!red-hat-developer-hub-backstage-plugin-homepage + # disabled: false + + # Global header (@red-hat-developer-hub/backstage-plugin-global-header) + - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-global-header:next__1.21.6!red-hat-developer-hub-backstage-plugin-global-header + disabled: false + + # Quickstart drawer + help menu item (@red-hat-developer-hub/backstage-plugin-quickstart) + - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-quickstart:pr_2591__1.10.0!red-hat-developer-hub-backstage-plugin-quickstart + disabled: false + + # --- Additional packages.enabled (from default.packages.yaml) --- + # Uncomment entries you need. Source: + # https://github.com/redhat-developer/rhdh-plugin-export-overlays/blob/main/default.packages.yaml + # + # (global-header and quickstart are already enabled above.) + + # @backstage-community/plugin-analytics-provider-segment + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/backstage-community-plugin-analytics-provider-segment:next__1.27.0!backstage-community-plugin-analytics-provider-segment + # disabled: false + + # @backstage-community/plugin-scaffolder-backend-module-regex + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/backstage-community-plugin-scaffolder-backend-module-regex:bs_1.52.0__2.17.0!backstage-community-plugin-scaffolder-backend-module-regex + # disabled: false + + # @backstage/plugin-techdocs + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/backstage-plugin-techdocs:bs_1.52.0__1.17.7!backstage-plugin-techdocs + # disabled: false + + # @backstage/plugin-techdocs-backend + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/backstage-plugin-techdocs-backend:bs_1.52.0__2.2.1!backstage-plugin-techdocs-backend + # disabled: false + + # @backstage/plugin-techdocs-module-addons-contrib + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/backstage-plugin-techdocs-module-addons-contrib:bs_1.52.0__1.1.37!backstage-plugin-techdocs-module-addons-contrib + # disabled: false + + # @red-hat-developer-hub/backstage-plugin-adoption-insights + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-adoption-insights:next__0.8.3!red-hat-developer-hub-backstage-plugin-adoption-insights + # disabled: false + + # @red-hat-developer-hub/backstage-plugin-adoption-insights-backend + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-adoption-insights-backend:next__0.8.3!red-hat-developer-hub-backstage-plugin-adoption-insights-backend + # disabled: false + + # @red-hat-developer-hub/backstage-plugin-analytics-module-adoption-insights + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-analytics-module-adoption-insights:next__0.8.3!red-hat-developer-hub-backstage-plugin-analytics-module-adoption-insights + # disabled: false + + # @red-hat-developer-hub/backstage-plugin-catalog-backend-module-extensions + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-catalog-backend-module-extensions:next__0.17.1!red-hat-developer-hub-backstage-plugin-catalog-backend-module-extensions + # disabled: false + + # @red-hat-developer-hub/backstage-plugin-dynamic-home-page (OFS / Scalprum home; + # prefer NFS homepage above for app-next) + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-dynamic-home-page:next__1.13.1!red-hat-developer-hub-backstage-plugin-dynamic-home-page + # disabled: false + + # @red-hat-developer-hub/backstage-plugin-extensions + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-extensions:next__0.17.1!red-hat-developer-hub-backstage-plugin-extensions + # disabled: false + + # @red-hat-developer-hub/backstage-plugin-extensions-backend + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-extensions-backend:next__0.17.1!red-hat-developer-hub-backstage-plugin-extensions-backend + # disabled: false + + # @red-hat-developer-hub/backstage-plugin-lightspeed + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-lightspeed:next__2.9.0!red-hat-developer-hub-backstage-plugin-lightspeed + # disabled: false + + # @red-hat-developer-hub/backstage-plugin-lightspeed-backend + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-lightspeed-backend:next__2.9.0!red-hat-developer-hub-backstage-plugin-lightspeed-backend + # disabled: false diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 58c40612ba..c474643863 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -52,6 +52,7 @@ "@backstage/frontend-dynamic-feature-loader": "0.1.13", "@backstage/frontend-plugin-api": "0.17.2", "@backstage/integration-react": "1.2.19", + "@backstage/module-federation-common": "0.1.4", "@backstage/plugin-app": "0.5.0", "@backstage/plugin-app-react": "0.2.4", "@backstage/plugin-app-visualizer": "0.2.5", @@ -75,13 +76,11 @@ "@material-ui/core": "4.12.4", "@material-ui/icons": "4.11.3", "@material-ui/lab": "4.0.0-alpha.61", + "@module-federation/enhanced": "2.3.3", "@mui/icons-material": "5.18.0", "@octokit/rest": "19.0.13", "@red-hat-developer-hub/backstage-plugin-app-react": "0.0.5", - "@red-hat-developer-hub/backstage-plugin-global-header": "1.21.5", "@red-hat-developer-hub/backstage-plugin-homepage": "1.15.0", - "@red-hat-developer-hub/backstage-plugin-quickstart": "1.10.0", - "@red-hat-developer-hub/backstage-plugin-theme": "0.14.7", "history": "5.3.0", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/app-next/src/App.test.tsx b/packages/app-next/src/App.test.tsx index a222d7e8ab..596b9ddb4c 100644 --- a/packages/app-next/src/App.test.tsx +++ b/packages/app-next/src/App.test.tsx @@ -1,11 +1,11 @@ import { renderWithEffects } from '@backstage/test-utils'; -jest.mock('@backstage/frontend-dynamic-feature-loader', () => { +jest.mock('./modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader', () => { const { createFrontendFeatureLoader } = jest.requireActual( '@backstage/frontend-plugin-api', ); return { - dynamicFrontendFeaturesLoader: () => + rhdhDynamicFrontendFeaturesLoader: () => createFrontendFeatureLoader({ async loader() { return []; @@ -24,18 +24,7 @@ describe('App', () => { app: { title: 'Test', support: { url: 'http://localhost:7007/support' }, - extensions: [ - { 'page:home': { config: { path: '/' } } }, - { 'api:home/visits': true }, - { 'app-root-element:home/visit-listener': true }, - { 'app-root-wrapper:app/global-header': true }, - { 'app-root-wrapper:app/drawer': true }, - { 'app-drawer-content:quickstart/quickstart': true }, - { 'gh-menu-item:quickstart/quickstart': false }, - { 'gh-menu-item:app/quickstart-help': true }, - ], }, - auth: { environment: 'development' }, backend: { baseUrl: 'http://localhost:7007' }, dynamicPlugins: { rootDirectory: 'dynamic-plugins-root' }, lighthouse: { diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index df34101299..da3f4d152d 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -1,52 +1,40 @@ import { createApp } from '@backstage/frontend-defaults'; import appVisualizerPlugin from '@backstage/plugin-app-visualizer'; import catalogPlugin from '@backstage/plugin-catalog/alpha'; +import homePlugin from '@backstage/plugin-home/alpha'; import scaffolderPlugin from '@backstage/plugin-scaffolder/alpha'; import searchPlugin from '@backstage/plugin-search/alpha'; import userSettingsPlugin from '@backstage/plugin-user-settings/alpha'; -import { dynamicFrontendFeaturesLoader } from '@backstage/frontend-dynamic-feature-loader'; import { appDrawerModule } from '@red-hat-developer-hub/backstage-plugin-app-react/alpha'; -import globalHeaderPlugin, { - globalHeaderModule, - globalHeaderTranslationsModule, -} from '@red-hat-developer-hub/backstage-plugin-global-header/alpha'; -import { rhdhThemeModule } from '@red-hat-developer-hub/backstage-plugin-theme/alpha'; -import { - homePageModule, - homepageTranslationsModule, -} from '@red-hat-developer-hub/backstage-plugin-homepage/alpha'; -import quickstartPlugin, { - quickstartInitModule, - quickstartTranslationsModule, -} from '@red-hat-developer-hub/backstage-plugin-quickstart/alpha'; -import homePlugin from '@backstage/plugin-home/alpha'; +import { homePageModule } from '@red-hat-developer-hub/backstage-plugin-homepage/alpha'; import { navModule } from './modules/nav'; -import { quickstartHelpModule } from './modules/quickstartHelp'; -import { signInModule } from './modules/signIn'; +import { rhdhDynamicFrontendFeaturesLoader } from './modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader'; +// Keep the shell minimal: core Backstage plugins that still need to ship with +// the app (scaffolder-backend is not yet a dynamic plugin), plus the dynamic +// feature loader. Prefer RHDH UX from dynamic-plugins-root — see +// dynamic-plugins.example.yaml (app-auth, global-header, quickstart, …). +// +// Use rhdhDynamicFrontendFeaturesLoader (not the stock loader) so named +// FrontendFeature exports such as globalHeaderModule / notifications-home-module +// are registered too. +// +// Homepage: `@backstage/plugin-home` is the NFS host (pluginId `home`) for +// RHDH layout and third-party cards (e.g. unread notifications). OCI homepage +// overlays are still OFS-shaped for NFS, so keep homePageModule static until an +// NFS overlay exists or a local rhdh-plugins export is used (see README). const app = createApp({ features: [ - rhdhThemeModule, navModule, - signInModule, - homePlugin, - homePageModule, - homepageTranslationsModule, appVisualizerPlugin, catalogPlugin, + homePlugin, + homePageModule, scaffolderPlugin, searchPlugin, userSettingsPlugin, appDrawerModule, - dynamicFrontendFeaturesLoader(), - // Static global-header must load after MF remotes so it wins plugin deduplication. - globalHeaderModule, - globalHeaderPlugin, - globalHeaderTranslationsModule, - quickstartHelpModule, - quickstartPlugin, - quickstartInitModule, - quickstartTranslationsModule, + rhdhDynamicFrontendFeaturesLoader(), ], }); diff --git a/packages/app-next/src/modules/dynamicFeatures/collectLoadableFeatures.ts b/packages/app-next/src/modules/dynamicFeatures/collectLoadableFeatures.ts new file mode 100644 index 0000000000..623c8eaf7a --- /dev/null +++ b/packages/app-next/src/modules/dynamicFeatures/collectLoadableFeatures.ts @@ -0,0 +1,29 @@ +import type { FrontendFeature } from '@backstage/frontend-plugin-api'; + +function isLoadable(obj: unknown): obj is FrontendFeature { + return ( + obj !== null && + typeof obj === 'object' && + '$$type' in obj && + ((obj as { $$type: string }).$$type === '@backstage/FrontendPlugin' || + (obj as { $$type: string }).$$type === '@backstage/FrontendModule') + ); +} + +/** + * Collect default and named `FrontendPlugin` / `FrontendModule` exports from a + * module-federation remote namespace (deduped by reference). + */ +export function collectLoadableFeatures( + moduleNamespace: Record, +): FrontendFeature[] { + const seen = new Set(); + const features: FrontendFeature[] = []; + for (const value of Object.values(moduleNamespace)) { + if (isLoadable(value) && !seen.has(value)) { + seen.add(value); + features.push(value); + } + } + return features; +} diff --git a/packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.test.ts b/packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.test.ts new file mode 100644 index 0000000000..37b93a1b4d --- /dev/null +++ b/packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.test.ts @@ -0,0 +1,26 @@ +import { collectLoadableFeatures } from './collectLoadableFeatures'; + +describe('collectLoadableFeatures', () => { + const plugin = { $$type: '@backstage/FrontendPlugin' as const }; + const moduleFeature = { $$type: '@backstage/FrontendModule' as const }; + + it('collects default and named FrontendFeature exports without duplicates', () => { + const features = collectLoadableFeatures({ + default: plugin, + globalHeaderPlugin: plugin, + globalHeaderModule: moduleFeature, + GlobalHeaderMenuItem: () => null, + }); + + expect(features).toEqual([plugin, moduleFeature]); + }); + + it('returns empty when nothing is loadable', () => { + expect( + collectLoadableFeatures({ + default: { createPlugin: true }, + helper: () => null, + }), + ).toEqual([]); + }); +}); diff --git a/packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.ts b/packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.ts new file mode 100644 index 0000000000..5f35b5ca1a --- /dev/null +++ b/packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.ts @@ -0,0 +1,163 @@ +import { createInstance } from '@module-federation/enhanced/runtime'; +import { + createFrontendFeatureLoader, + type FrontendFeature, + type FrontendFeatureLoader, +} from '@backstage/frontend-plugin-api'; +import { loadModuleFederationHostShared } from '@backstage/module-federation-common'; +import type { DynamicFrontendFeaturesLoaderOptions } from '@backstage/frontend-dynamic-feature-loader'; +import { collectLoadableFeatures } from './collectLoadableFeatures'; + +type FrontendPluginRemote = { + packageName: string; + remoteInfo: { name: string; entry: string }; + exposedModules: string[]; +}; + +/** + * Like `@backstage/frontend-dynamic-feature-loader`, but also registers named + * `FrontendPlugin` / `FrontendModule` exports from each remote module. + * + * The stock loader only keeps `module.default`. That misses shells that ship as + * named exports next to a default plugin — e.g. global-header's + * `globalHeaderModule` (AppRootWrapper) beside default `globalHeaderPlugin`. + */ +export function rhdhDynamicFrontendFeaturesLoader( + options?: DynamicFrontendFeaturesLoaderOptions, +): FrontendFeatureLoader { + return createFrontendFeatureLoader({ + async loader({ config }) { + if (!config.getOptionalConfig('dynamicPlugins')) { + return []; + } + + const error = (message: string, err: unknown) => { + // eslint-disable-next-line no-console + console.error( + `${message}: ${ + err instanceof Error ? err.toString() : JSON.stringify(err) + }`, + ); + }; + + const backendBaseUrl = config.getString('backend.baseUrl'); + const appPackageName = + config.getOptionalString('app.packageName') ?? 'app'; + + let frontendPluginRemotes: FrontendPluginRemote[]; + try { + const response = await fetch( + `${backendBaseUrl}/.backstage/dynamic-features/remotes`, + ); + if (!response.ok) { + throw new Error(`${response.status} - ${response.statusText}`); + } + frontendPluginRemotes = (await response.json()) as FrontendPluginRemote[]; + } catch (err) { + error( + 'Failed fetching module federation configuration of dynamic frontend plugins', + err, + ); + return []; + } + + let instance; + try { + if (options?.moduleFederation?.instance) { + instance = options.moduleFederation.instance; + } else { + const shared = await loadModuleFederationHostShared({ + onError: err => error(err.message, err.cause), + }); + const createOptions: Parameters[0] = { + name: appPackageName + .replaceAll('@', '') + .replaceAll('/', '__') + .replaceAll('-', '_'), + shared, + remotes: [], + }; + if (options?.moduleFederation?.shareStrategy) { + createOptions.shareStrategy = + options.moduleFederation.shareStrategy; + } + instance = createInstance(createOptions); + } + + const userOptions: Parameters[0] = { + name: instance.name, + remotes: frontendPluginRemotes.map(remote => ({ + alias: remote.packageName, + ...remote.remoteInfo, + })), + }; + if (options?.moduleFederation?.plugins) { + userOptions.plugins = options.moduleFederation.plugins; + } + if (options?.moduleFederation?.shareStrategy) { + userOptions.shareStrategy = options.moduleFederation.shareStrategy; + } + if (options?.moduleFederation?.shared) { + userOptions.shared = options.moduleFederation.shared; + } + instance.initOptions(userOptions); + } catch (err) { + error('Failed initializing module federation', err); + return []; + } + + const features = ( + await Promise.all( + frontendPluginRemotes.map(async remote => { + // eslint-disable-next-line no-console + console.debug( + `Loading dynamic plugin '${remote.packageName}' from '${remote.remoteInfo.entry}'`, + ); + const moduleFeatures = await Promise.all( + remote.exposedModules.map(async exposedModuleName => { + const remoteModuleName = + exposedModuleName === '.' + ? remote.remoteInfo.name + : `${remote.remoteInfo.name}/${exposedModuleName}`; + let remoteModule: Record | undefined; + try { + remoteModule = (await instance.loadRemote( + remoteModuleName, + )) as Record | undefined; + } catch (err) { + error( + `Failed loading remote module '${remoteModuleName}' of dynamic plugin '${remote.packageName}'`, + err, + ); + return [] as FrontendFeature[]; + } + if (!remoteModule) { + // eslint-disable-next-line no-console + console.warn( + `Skipping empty dynamic plugin remote module '${remoteModuleName}'.`, + ); + return [] as FrontendFeature[]; + } + // eslint-disable-next-line no-console + console.info( + `Remote module '${remoteModuleName}' of dynamic plugin '${remote.packageName}' loaded from ${remote.remoteInfo.entry}`, + ); + const collected = collectLoadableFeatures(remoteModule); + if (collected.length === 0) { + // eslint-disable-next-line no-console + console.debug( + `Skipping dynamic plugin remote module '${remoteModuleName}' since it doesn't export a new FrontendFeature (default or named).`, + ); + } + return collected; + }), + ); + return moduleFeatures.flat(); + }), + ) + ).flat(); + + return features; + }, + }); +} diff --git a/packages/app-next/src/modules/quickstartHelp/index.tsx b/packages/app-next/src/modules/quickstartHelp/index.tsx deleted file mode 100644 index f753cbab0a..0000000000 --- a/packages/app-next/src/modules/quickstartHelp/index.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { createFrontendModule } from '@backstage/frontend-plugin-api'; -import { useAppDrawer } from '@red-hat-developer-hub/backstage-plugin-app-react/alpha'; -import { - GlobalHeaderMenuItem, - GlobalHeaderMenuItemBlueprint, -} from '@red-hat-developer-hub/backstage-plugin-global-header/alpha'; - -const QUICKSTART_DRAWER_ID = 'quickstart'; - -const QuickstartHelpMenuItem = ({ - handleClose, -}: { - handleClose?: () => void; -}) => { - const { toggleDrawer } = useAppDrawer(); - - return ( - { - toggleDrawer(QUICKSTART_DRAWER_ID); - handleClose?.(); - }} - /> - ); -}; - -const quickstartHelpMenuItem = GlobalHeaderMenuItemBlueprint.make({ - name: 'quickstart-help', - params: { - target: 'help', - component: QuickstartHelpMenuItem, - priority: 50, - }, -}); - -export const quickstartHelpModule = createFrontendModule({ - pluginId: 'app', - extensions: [quickstartHelpMenuItem], -}); diff --git a/packages/app-next/src/modules/signIn/SignInPageComponent.tsx b/packages/app-next/src/modules/signIn/SignInPageComponent.tsx deleted file mode 100644 index cbab3d19ae..0000000000 --- a/packages/app-next/src/modules/signIn/SignInPageComponent.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { SignInPage } from '@backstage/core-components'; -import { githubAuthApiRef } from '@backstage/core-plugin-api'; -import type { SignInPageProps } from '@backstage/plugin-app-react'; - -const githubProvider = { - id: 'github-auth-provider', - title: 'GitHub', - message: 'Sign in using GitHub', - apiRef: githubAuthApiRef, -}; - -export function SignInPageComponent(props: SignInPageProps) { - return ; -} diff --git a/packages/app-next/src/modules/signIn/index.ts b/packages/app-next/src/modules/signIn/index.ts deleted file mode 100644 index 990d9ec2e7..0000000000 --- a/packages/app-next/src/modules/signIn/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { createFrontendModule } from '@backstage/frontend-plugin-api'; -import { SignInPageBlueprint } from '@backstage/plugin-app-react'; - -export const signInModule = createFrontendModule({ - pluginId: 'app', - extensions: [ - SignInPageBlueprint.make({ - params: { - loader: () => - import('./SignInPageComponent').then(m => m.SignInPageComponent), - }, - }), - ], -}); diff --git a/yarn.lock b/yarn.lock index 890513d2a9..ef38116e43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -591,22 +591,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/lib-storage@npm:^3.350.0": - version: 3.1086.0 - resolution: "@aws-sdk/lib-storage@npm:3.1086.0" - dependencies: - "@smithy/core": "npm:^3.29.2" - "@smithy/types": "npm:^4.16.0" - buffer: "npm:5.6.0" - events: "npm:3.3.0" - stream-browserify: "npm:3.0.0" - tslib: "npm:^2.6.2" - peerDependencies: - "@aws-sdk/client-s3": ^3.1086.0 - checksum: 10c0/fa84b5e4a625f08df2be60dd09e73e96d1f1244c673bacc7f8cb750b32ac9162b43fb3b9cd9c54660e0f097c5df7eb19dbf03b511da37dff604c950db59e951f - languageName: node - linkType: hard - "@aws-sdk/middleware-flexible-checksums@npm:^3.974.32": version: 3.974.32 resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.974.32" @@ -2424,7 +2408,7 @@ __metadata: languageName: node linkType: hard -"@backstage-community/plugin-rbac-common@npm:^1.19.0, @backstage-community/plugin-rbac-common@npm:^1.26.1, @backstage-community/plugin-rbac-common@npm:^1.27.0": +"@backstage-community/plugin-rbac-common@npm:^1.26.1, @backstage-community/plugin-rbac-common@npm:^1.27.0": version: 1.29.0 resolution: "@backstage-community/plugin-rbac-common@npm:1.29.0" peerDependencies: @@ -2746,30 +2730,6 @@ __metadata: languageName: node linkType: hard -"@backstage/backend-openapi-utils@npm:^0.7.0": - version: 0.7.0 - resolution: "@backstage/backend-openapi-utils@npm:0.7.0" - dependencies: - "@apidevtools/swagger-parser": "npm:^10.1.0" - "@backstage/backend-plugin-api": "npm:^1.9.3" - "@backstage/errors": "npm:^1.3.1" - "@backstage/types": "npm:^1.2.2" - "@types/express": "npm:^4.17.6" - "@types/express-serve-static-core": "npm:^4.17.5" - ajv: "npm:^8.16.0" - express: "npm:^4.22.0" - express-openapi-validator: "npm:^5.5.8" - express-promise-router: "npm:^4.1.0" - get-port: "npm:^5.1.1" - json-schema-to-ts: "npm:^3.0.0" - lodash: "npm:^4.17.21" - mockttp: "npm:^3.13.0" - openapi-merge: "npm:^1.3.2" - openapi3-ts: "npm:^3.1.2" - checksum: 10c0/e64cbaee1bab945407e8db3776e0cef240e88135fdc2433e6fbc3d959d59e85a6f8d631ca758c2d4dbaff1deba0ae185ca0175b7efca187b545b54c25ac283d2 - languageName: node - linkType: hard - "@backstage/backend-plugin-api@npm:1.9.2": version: 1.9.2 resolution: "@backstage/backend-plugin-api@npm:1.9.2" @@ -4001,7 +3961,7 @@ __metadata: languageName: node linkType: hard -"@backstage/module-federation-common@npm:^0.1.4": +"@backstage/module-federation-common@npm:0.1.4, @backstage/module-federation-common@npm:^0.1.4": version: 0.1.4 resolution: "@backstage/module-federation-common@npm:0.1.4" dependencies: @@ -4733,7 +4693,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog-node@npm:^2.1.0, @backstage/plugin-catalog-node@npm:^2.2.2, @backstage/plugin-catalog-node@npm:^2.2.3": +"@backstage/plugin-catalog-node@npm:^2.1.0, @backstage/plugin-catalog-node@npm:^2.2.2": version: 2.2.3 resolution: "@backstage/plugin-catalog-node@npm:2.2.3" dependencies: @@ -4803,7 +4763,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-catalog-react@npm:^2.1.0, @backstage/plugin-catalog-react@npm:^2.1.2": +"@backstage/plugin-catalog-react@npm:^2.1.2": version: 2.1.4 resolution: "@backstage/plugin-catalog-react@npm:2.1.4" dependencies: @@ -5077,46 +5037,6 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-notifications-common@npm:^0.2.1, @backstage/plugin-notifications-common@npm:^0.2.3": - version: 0.2.3 - resolution: "@backstage/plugin-notifications-common@npm:0.2.3" - dependencies: - "@backstage/config": "npm:^1.3.8" - "@backstage/types": "npm:^1.2.2" - checksum: 10c0/d8a64fca1771d6b8b59d24f0fa06610484e5842c757b1fde4b7cdbd7ee98c6a35cbba0302a5208fcc6e9981b10a64123f8d73b8c0c07f400500f8fa749b28436 - languageName: node - linkType: hard - -"@backstage/plugin-notifications@npm:^0.5.15": - version: 0.5.19 - resolution: "@backstage/plugin-notifications@npm:0.5.19" - dependencies: - "@backstage/core-components": "npm:^0.18.12" - "@backstage/core-plugin-api": "npm:^1.12.8" - "@backstage/errors": "npm:^1.3.1" - "@backstage/frontend-plugin-api": "npm:^0.17.3" - "@backstage/plugin-notifications-common": "npm:^0.2.3" - "@backstage/plugin-signals-react": "npm:^0.0.24" - "@backstage/theme": "npm:^0.7.3" - "@backstage/ui": "npm:^0.17.0" - "@remixicon/react": "npm:>=4.6.0 <4.9.0" - lodash: "npm:^4.17.21" - notistack: "npm:^3.0.1" - react-aria-components: "npm:~1.17.0" - react-relative-time: "npm:^0.0.9" - react-use: "npm:^17.2.4" - 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/ad348655ed3bce82b5c0b01ff1fbca9fd761fce6a17a48b7799e4916314df88e2136c08c84e625a0d925cc5870cf15660a6fcf7c2bcdd416165bd20b44ebb107 - languageName: node - linkType: hard - "@backstage/plugin-org@npm:0.7.5": version: 0.7.5 resolution: "@backstage/plugin-org@npm:0.7.5" @@ -5238,27 +5158,6 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-permission-react@npm:^0.4.41": - version: 0.4.41 - resolution: "@backstage/plugin-permission-react@npm:0.4.41" - dependencies: - "@backstage/config": "npm:^1.3.6" - "@backstage/core-plugin-api": "npm:^1.12.4" - "@backstage/plugin-permission-common": "npm:^0.9.7" - dataloader: "npm:^2.0.0" - swr: "npm:^2.0.0" - 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/d04a28f02cd98a0415f0ccc21b755fb88190bf3b1cf61c6f48086f4823d674ac25152fa14a5b273ae4232617e514334198efab670daae06aaa07b5ff1be7f4a6 - languageName: node - linkType: hard - "@backstage/plugin-permission-react@npm:^0.5.0, @backstage/plugin-permission-react@npm:^0.5.2, @backstage/plugin-permission-react@npm:^0.5.3": version: 0.5.3 resolution: "@backstage/plugin-permission-react@npm:0.5.3" @@ -5536,24 +5435,6 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-search-backend-module-catalog@npm:^0.3.13": - version: 0.3.17 - resolution: "@backstage/plugin-search-backend-module-catalog@npm:0.3.17" - dependencies: - "@backstage/backend-plugin-api": "npm:^1.9.3" - "@backstage/catalog-client": "npm:^1.16.1" - "@backstage/catalog-model": "npm:^1.9.0" - "@backstage/config": "npm:^1.3.8" - "@backstage/errors": "npm:^1.3.1" - "@backstage/plugin-catalog-common": "npm:^1.1.10" - "@backstage/plugin-catalog-node": "npm:^2.2.3" - "@backstage/plugin-permission-common": "npm:^0.9.9" - "@backstage/plugin-search-backend-node": "npm:^1.4.6" - "@backstage/plugin-search-common": "npm:^1.2.24" - checksum: 10c0/3c4770c0d3864bf9acba4154285419fbce66b34b8f6c35fd78f5b25b28975929ccb2fda710681ec05cd5077eea8e85b7cf1910fbe3222a9b483a5186e313a373 - languageName: node - linkType: hard - "@backstage/plugin-search-backend-module-pg@npm:0.5.56": version: 0.5.56 resolution: "@backstage/plugin-search-backend-module-pg@npm:0.5.56" @@ -5568,41 +5449,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-search-backend-module-pg@npm:^0.5.53": - version: 0.5.57 - resolution: "@backstage/plugin-search-backend-module-pg@npm:0.5.57" - dependencies: - "@backstage/backend-plugin-api": "npm:^1.9.3" - "@backstage/config": "npm:^1.3.8" - "@backstage/plugin-search-backend-node": "npm:^1.4.6" - "@backstage/plugin-search-common": "npm:^1.2.24" - knex: "npm:^3.0.0" - lodash: "npm:^4.17.21" - checksum: 10c0/c63a01b062c3d0daaf94da33410a107c9fe590d2615e9ac49e84b975f31ae370a2e39fbcb050c0bd01075e31de9da0026e725a74ace951c4c47ba7cea6c60d3d - languageName: node - linkType: hard - -"@backstage/plugin-search-backend-module-techdocs@npm:^0.4.12": - version: 0.4.16 - resolution: "@backstage/plugin-search-backend-module-techdocs@npm:0.4.16" - dependencies: - "@backstage/backend-plugin-api": "npm:^1.9.3" - "@backstage/catalog-client": "npm:^1.16.1" - "@backstage/catalog-model": "npm:^1.9.0" - "@backstage/config": "npm:^1.3.8" - "@backstage/plugin-catalog-common": "npm:^1.1.10" - "@backstage/plugin-catalog-node": "npm:^2.2.3" - "@backstage/plugin-permission-common": "npm:^0.9.9" - "@backstage/plugin-search-backend-node": "npm:^1.4.6" - "@backstage/plugin-search-common": "npm:^1.2.24" - "@backstage/plugin-techdocs-node": "npm:^1.15.2" - lodash: "npm:^4.17.21" - p-limit: "npm:^3.1.0" - checksum: 10c0/f1d7a59e665b222ba72e60b6017b604f8f226a6263b2662a7dc867d44b0643ab6e79b88c43beffdccc6b570133b617341b61846e6b6861964869ebcb50988a33 - languageName: node - linkType: hard - -"@backstage/plugin-search-backend-node@npm:^1.4.5, @backstage/plugin-search-backend-node@npm:^1.4.6": +"@backstage/plugin-search-backend-node@npm:^1.4.5": version: 1.4.6 resolution: "@backstage/plugin-search-backend-node@npm:1.4.6" dependencies: @@ -5641,29 +5488,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-search-backend@npm:^2.1.0": - version: 2.1.4 - resolution: "@backstage/plugin-search-backend@npm:2.1.4" - dependencies: - "@backstage/backend-openapi-utils": "npm:^0.7.0" - "@backstage/backend-plugin-api": "npm:^1.9.3" - "@backstage/config": "npm:^1.3.8" - "@backstage/errors": "npm:^1.3.1" - "@backstage/plugin-permission-common": "npm:^0.9.9" - "@backstage/plugin-permission-node": "npm:^0.11.2" - "@backstage/plugin-search-backend-node": "npm:^1.4.6" - "@backstage/plugin-search-common": "npm:^1.2.24" - "@backstage/types": "npm:^1.2.2" - dataloader: "npm:^2.0.0" - express: "npm:^4.22.0" - lodash: "npm:^4.17.21" - qs: "npm:^6.15.2" - zod: "npm:^3.25.76 || ^4.0.0" - checksum: 10c0/c5334503c8eb715b46a7bbbccc268f5adeca45704835a431ab803b1f0aab55e0121cdbaa7c344c491f65a4de93e9632f7f0bfdaea1746f7a5f8f9a5689a0a9d3 - languageName: node - linkType: hard - -"@backstage/plugin-search-common@npm:1.2.24, @backstage/plugin-search-common@npm:^1.2.22, @backstage/plugin-search-common@npm:^1.2.24": +"@backstage/plugin-search-common@npm:1.2.24, @backstage/plugin-search-common@npm:^1.2.24": version: 1.2.24 resolution: "@backstage/plugin-search-common@npm:1.2.24" dependencies: @@ -5703,7 +5528,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-search-react@npm:^1.11.0, @backstage/plugin-search-react@npm:^1.11.4, @backstage/plugin-search-react@npm:^1.11.5, @backstage/plugin-search-react@npm:^1.11.6": +"@backstage/plugin-search-react@npm:^1.11.4, @backstage/plugin-search-react@npm:^1.11.5, @backstage/plugin-search-react@npm:^1.11.6": version: 1.11.6 resolution: "@backstage/plugin-search-react@npm:1.11.6" dependencies: @@ -5764,37 +5589,6 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-search@npm:^1.7.0": - version: 1.7.6 - resolution: "@backstage/plugin-search@npm:1.7.6" - dependencies: - "@backstage/core-components": "npm:^0.18.12" - "@backstage/core-plugin-api": "npm:^1.12.8" - "@backstage/errors": "npm:^1.3.1" - "@backstage/frontend-plugin-api": "npm:^0.17.3" - "@backstage/plugin-catalog-react": "npm:^3.2.0" - "@backstage/plugin-search-common": "npm:^1.2.24" - "@backstage/plugin-search-react": "npm:^1.11.6" - "@backstage/types": "npm:^1.2.2" - "@backstage/ui": "npm:^0.17.0" - "@backstage/version-bridge": "npm:^1.0.12" - "@material-ui/core": "npm:^4.12.2" - "@material-ui/icons": "npm:^4.9.1" - qs: "npm:^6.15.2" - react-use: "npm:^17.2.4" - zod: "npm:^4.0.0" - 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/5a904fe4dd8b4c0a0546f64db0e07b82b0fc393e8e03c7dc78d42cb412e9f73d5777328e434696d41f8c96709f35742c5a6ca1c17924a00cacd7ec2febbbca63 - languageName: node - linkType: hard - "@backstage/plugin-signals-node@npm:^0.2.2": version: 0.2.2 resolution: "@backstage/plugin-signals-node@npm:0.2.2" @@ -5806,25 +5600,6 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-signals-react@npm:^0.0.20": - version: 0.0.20 - resolution: "@backstage/plugin-signals-react@npm:0.0.20" - dependencies: - "@backstage/core-plugin-api": "npm:^1.12.4" - "@backstage/types": "npm:^1.2.2" - "@material-ui/core": "npm:^4.12.4" - 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/49b43501979ffb1f9f5c3dc0cc5606249bdde3c8952bfeca0257dc686b49a843022056613b401ff58f551437fc9b5a450aef04494b154a1ca0e29d72a33b0668 - languageName: node - linkType: hard - "@backstage/plugin-signals-react@npm:^0.0.23": version: 0.0.23 resolution: "@backstage/plugin-signals-react@npm:0.0.23" @@ -5870,43 +5645,6 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-techdocs-node@npm:^1.15.2": - version: 1.15.2 - resolution: "@backstage/plugin-techdocs-node@npm:1.15.2" - dependencies: - "@aws-sdk/client-s3": "npm:^3.350.0" - "@aws-sdk/credential-providers": "npm:^3.350.0" - "@aws-sdk/lib-storage": "npm:^3.350.0" - "@aws-sdk/types": "npm:^3.347.0" - "@azure/identity": "npm:^4.0.0" - "@azure/storage-blob": "npm:^12.5.0" - "@backstage/backend-plugin-api": "npm:^1.9.3" - "@backstage/catalog-model": "npm:^1.9.0" - "@backstage/config": "npm:^1.3.8" - "@backstage/errors": "npm:^1.3.1" - "@backstage/integration": "npm:^2.0.3" - "@backstage/integration-aws-node": "npm:^0.2.0" - "@backstage/plugin-search-common": "npm:^1.2.24" - "@backstage/plugin-techdocs-common": "npm:^0.1.1" - "@google-cloud/storage": "npm:^7.0.0" - "@smithy/node-http-handler": "npm:^3.0.0" - "@trendyol-js/openstack-swift-sdk": "npm:^0.0.7" - "@types/express": "npm:^4.17.6" - dockerode: "npm:^4.0.0" - express: "npm:^4.22.0" - fs-extra: "npm:^11.2.0" - git-url-parse: "npm:^15.0.0" - hpagent: "npm:^1.2.0" - js-yaml: "npm:^4.2.0" - json5: "npm:^2.1.3" - mime-types: "npm:^2.1.27" - p-limit: "npm:^3.1.0" - recursive-readdir: "npm:^2.2.2" - winston: "npm:^3.2.1" - checksum: 10c0/e681281d1147e4a2fcd77f03c1cc4e45582b5836f60feca67a7aaa37da4c40ebc7a8518d8e8d8a94d3e787e939464172f14f14f81e2ac71863d25b5406701640 - languageName: node - linkType: hard - "@backstage/plugin-techdocs-react@npm:^1.3.12, @backstage/plugin-techdocs-react@npm:^1.3.13": version: 1.3.13 resolution: "@backstage/plugin-techdocs-react@npm:1.3.13" @@ -9087,6 +8825,17 @@ __metadata: languageName: node linkType: hard +"@module-federation/bridge-react-webpack-plugin@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/bridge-react-webpack-plugin@npm:2.3.3" + dependencies: + "@module-federation/sdk": "npm:2.3.3" + "@types/semver": "npm:7.5.8" + semver: "npm:7.6.3" + checksum: 10c0/a94ff3a5197a831720ab31716b6072cc50cc82c708e10ac362b27e679de1e8dac6b4fa56145764242762d84837989874139697a453379373707e7542751b7615 + languageName: node + linkType: hard + "@module-federation/bridge-react-webpack-plugin@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/bridge-react-webpack-plugin@npm:2.5.1" @@ -9098,6 +8847,20 @@ __metadata: languageName: node linkType: hard +"@module-federation/cli@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/cli@npm:2.3.3" + dependencies: + "@module-federation/dts-plugin": "npm:2.3.3" + "@module-federation/sdk": "npm:2.3.3" + commander: "npm:11.1.0" + jiti: "npm:2.4.2" + bin: + mf: bin/mf.js + checksum: 10c0/035b555537d49de38f2cfb6e5a4bcfbe86f02b2e91df376489f3ffddc24a032e76adcf765fb912949a860447cbcdaf32beb910c4366bae5cbb4d072f146e997a + languageName: node + linkType: hard + "@module-federation/cli@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/cli@npm:2.5.1" @@ -9112,6 +8875,48 @@ __metadata: languageName: node linkType: hard +"@module-federation/data-prefetch@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/data-prefetch@npm:2.3.3" + dependencies: + "@module-federation/runtime": "npm:2.3.3" + "@module-federation/sdk": "npm:2.3.3" + peerDependencies: + react: ">=16.9.0" + react-dom: ">=16.9.0" + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + checksum: 10c0/e01d7a1b8dfa059c1182655e6991609252462cdcbf05dfea0405ab4b3f57da8dda2a329864fafc30ac248dea4b9c48281cac75495a1e16e416fa7d29f63236b1 + languageName: node + linkType: hard + +"@module-federation/dts-plugin@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/dts-plugin@npm:2.3.3" + dependencies: + "@module-federation/error-codes": "npm:2.3.3" + "@module-federation/managers": "npm:2.3.3" + "@module-federation/sdk": "npm:2.3.3" + "@module-federation/third-party-dts-extractor": "npm:2.3.3" + adm-zip: "npm:0.5.10" + ansi-colors: "npm:4.1.3" + isomorphic-ws: "npm:5.0.0" + node-schedule: "npm:2.1.1" + undici: "npm:7.24.7" + ws: "npm:8.18.0" + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ">=1.0.24" + peerDependenciesMeta: + vue-tsc: + optional: true + checksum: 10c0/834c5eb773490238f29fd9239454bc2d79d7484667f157da87916f9d4e37abbefcb3aefa8a6b256492473f0054b500fe0db33b89955ebaa16c247bb282d1c879 + languageName: node + linkType: hard + "@module-federation/dts-plugin@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/dts-plugin@npm:2.5.1" @@ -9136,6 +8941,42 @@ __metadata: languageName: node linkType: hard +"@module-federation/enhanced@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/enhanced@npm:2.3.3" + dependencies: + "@module-federation/bridge-react-webpack-plugin": "npm:2.3.3" + "@module-federation/cli": "npm:2.3.3" + "@module-federation/data-prefetch": "npm:2.3.3" + "@module-federation/dts-plugin": "npm:2.3.3" + "@module-federation/error-codes": "npm:2.3.3" + "@module-federation/inject-external-runtime-core-plugin": "npm:2.3.3" + "@module-federation/managers": "npm:2.3.3" + "@module-federation/manifest": "npm:2.3.3" + "@module-federation/rspack": "npm:2.3.3" + "@module-federation/runtime-tools": "npm:2.3.3" + "@module-federation/sdk": "npm:2.3.3" + "@module-federation/webpack-bundler-runtime": "npm:2.3.3" + schema-utils: "npm:4.3.0" + tapable: "npm:2.3.0" + upath: "npm:2.0.1" + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ">=1.0.24" + webpack: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + vue-tsc: + optional: true + webpack: + optional: true + bin: + mf: bin/mf.js + checksum: 10c0/e354bbf60fc5cc3f786f8fcb515abb37a5ee72b9ce80e254d2d79cca0300fe9b248959c629c0d4f92e056b6c767f442419ab7f779665f92d63f9c8679ee6149a + languageName: node + linkType: hard + "@module-federation/enhanced@npm:^2.3.3": version: 2.5.1 resolution: "@module-federation/enhanced@npm:2.5.1" @@ -9178,6 +9019,13 @@ __metadata: languageName: node linkType: hard +"@module-federation/error-codes@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/error-codes@npm:2.3.3" + checksum: 10c0/392d4ebcb874cc91275c9576a63b1c9a527161d68e2ee4bdf2876a7cad31127b1c6c9bbfdb3f6b120a0e7a07aa11c160ab92155d41e7d38d5f313f8c897842df + languageName: node + linkType: hard + "@module-federation/error-codes@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/error-codes@npm:2.5.1" @@ -9185,6 +9033,15 @@ __metadata: languageName: node linkType: hard +"@module-federation/inject-external-runtime-core-plugin@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/inject-external-runtime-core-plugin@npm:2.3.3" + peerDependencies: + "@module-federation/runtime-tools": 2.3.3 + checksum: 10c0/ea7841ad55e6f273590ea6a28e51e0527e0fba946a37d87ac676971cef354ee00a73efc078c831154f12b9940996f880afeb3b3a45cf1db84777927720ee1824 + languageName: node + linkType: hard + "@module-federation/inject-external-runtime-core-plugin@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/inject-external-runtime-core-plugin@npm:2.5.1" @@ -9194,6 +9051,16 @@ __metadata: languageName: node linkType: hard +"@module-federation/managers@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/managers@npm:2.3.3" + dependencies: + "@module-federation/sdk": "npm:2.3.3" + find-pkg: "npm:2.0.0" + checksum: 10c0/f9d64fb5fac73936120791b29b111b2b040e6f12fbd5af44a1f293087d6845fbe972973b2e57b9518885c8bfdac58535bec6db9804fdc8c77cc0e6aebb9e1edf + languageName: node + linkType: hard + "@module-federation/managers@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/managers@npm:2.5.1" @@ -9204,6 +9071,18 @@ __metadata: languageName: node linkType: hard +"@module-federation/manifest@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/manifest@npm:2.3.3" + dependencies: + "@module-federation/dts-plugin": "npm:2.3.3" + "@module-federation/managers": "npm:2.3.3" + "@module-federation/sdk": "npm:2.3.3" + find-pkg: "npm:2.0.0" + checksum: 10c0/7e714e332382e6ef343dc9173938ef8026ba0c7c1330ed1e0f296513953620abde4934b936bdd30ba01da67b963bfe5f27f1c89ebde86d78ae891a072d1f2c05 + languageName: node + linkType: hard + "@module-federation/manifest@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/manifest@npm:2.5.1" @@ -9216,6 +9095,30 @@ __metadata: languageName: node linkType: hard +"@module-federation/rspack@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/rspack@npm:2.3.3" + dependencies: + "@module-federation/bridge-react-webpack-plugin": "npm:2.3.3" + "@module-federation/dts-plugin": "npm:2.3.3" + "@module-federation/inject-external-runtime-core-plugin": "npm:2.3.3" + "@module-federation/managers": "npm:2.3.3" + "@module-federation/manifest": "npm:2.3.3" + "@module-federation/runtime-tools": "npm:2.3.3" + "@module-federation/sdk": "npm:2.3.3" + peerDependencies: + "@rspack/core": ^0.7.0 || ^1.0.0 || ^2.0.0-0 + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ">=1.0.24" + peerDependenciesMeta: + typescript: + optional: true + vue-tsc: + optional: true + checksum: 10c0/5c3a25b486859d71e60b6cad32d72f95157f7e24aee5cb992868cb7927c0194fe5b77979fac10ffd17c65e5972a49c067c89266724d742b0b674f80cee17c89d + languageName: node + linkType: hard + "@module-federation/rspack@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/rspack@npm:2.5.1" @@ -9250,6 +9153,16 @@ __metadata: languageName: node linkType: hard +"@module-federation/runtime-core@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/runtime-core@npm:2.3.3" + dependencies: + "@module-federation/error-codes": "npm:2.3.3" + "@module-federation/sdk": "npm:2.3.3" + checksum: 10c0/77951f77af135844d5176c8242367cb304bc54c5379a63e675d72ee048ca2db3705a501aa123dbd139fdc3d3434e4c393ff7d09a37ad8db4c954610c3bd815ad + languageName: node + linkType: hard + "@module-federation/runtime-core@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/runtime-core@npm:2.5.1" @@ -9270,6 +9183,16 @@ __metadata: languageName: node linkType: hard +"@module-federation/runtime-tools@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/runtime-tools@npm:2.3.3" + dependencies: + "@module-federation/runtime": "npm:2.3.3" + "@module-federation/webpack-bundler-runtime": "npm:2.3.3" + checksum: 10c0/e9653cf8d40a1387570a6d0ca2db4803e7cf55f967ffdd262a4061afe690a3262197b1fe7a612d78e043dd4d0c7e31c61363d3f3da9611b233fecb4167905cf4 + languageName: node + linkType: hard + "@module-federation/runtime-tools@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/runtime-tools@npm:2.5.1" @@ -9291,6 +9214,17 @@ __metadata: languageName: node linkType: hard +"@module-federation/runtime@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/runtime@npm:2.3.3" + dependencies: + "@module-federation/error-codes": "npm:2.3.3" + "@module-federation/runtime-core": "npm:2.3.3" + "@module-federation/sdk": "npm:2.3.3" + checksum: 10c0/c1848c937c4d96891f05797ddbf257cd249b75eb7e2257682910e6b55c89090ec4cc70d1b111672702ac4ccd948cf0782635e1ca85209a88c7ead7f99a34ef1a + languageName: node + linkType: hard + "@module-federation/runtime@npm:2.5.1, @module-federation/runtime@npm:^2.3.3": version: 2.5.1 resolution: "@module-federation/runtime@npm:2.5.1" @@ -9309,6 +9243,18 @@ __metadata: languageName: node linkType: hard +"@module-federation/sdk@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/sdk@npm:2.3.3" + peerDependencies: + node-fetch: ^3.3.2 + peerDependenciesMeta: + node-fetch: + optional: true + checksum: 10c0/f1811971bad7a8732bc784c9a7c6af3b369871ddcb90dfbe14fc2271479ea3403541c44da2c46aa10b51dd4589cea4b92c7e904694f7210576c9346e12f9e883 + languageName: node + linkType: hard + "@module-federation/sdk@npm:2.5.1, @module-federation/sdk@npm:^2.3.3": version: 2.5.1 resolution: "@module-federation/sdk@npm:2.5.1" @@ -9321,6 +9267,16 @@ __metadata: languageName: node linkType: hard +"@module-federation/third-party-dts-extractor@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/third-party-dts-extractor@npm:2.3.3" + dependencies: + find-pkg: "npm:2.0.0" + resolve: "npm:1.22.8" + checksum: 10c0/bc07e010d5f413ab3b5fd8bcd1c67cbc2d303e585ec1ac0e84842bfdf80495e69c195484864f199cfbd498300be2c464565d8d9c87228d59d21143728b9d0c5e + languageName: node + linkType: hard + "@module-federation/third-party-dts-extractor@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/third-party-dts-extractor@npm:2.5.1" @@ -9341,6 +9297,17 @@ __metadata: languageName: node linkType: hard +"@module-federation/webpack-bundler-runtime@npm:2.3.3": + version: 2.3.3 + resolution: "@module-federation/webpack-bundler-runtime@npm:2.3.3" + dependencies: + "@module-federation/error-codes": "npm:2.3.3" + "@module-federation/runtime": "npm:2.3.3" + "@module-federation/sdk": "npm:2.3.3" + checksum: 10c0/26c4c2a0f480ad08c6047f848a5bdc422db0c490fb772183f5858a1dc3f893097258e0a1c737a94665ba2b9c219073e5daadec1908d92c6d7a5dfa240a7c3245 + languageName: node + linkType: hard + "@module-federation/webpack-bundler-runtime@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/webpack-bundler-runtime@npm:2.5.1" @@ -11312,18 +11279,6 @@ __metadata: languageName: node linkType: hard -"@patternfly/react-icons@npm:^6.5.0": - version: 6.6.0 - resolution: "@patternfly/react-icons@npm:6.6.0" - dependencies: - tslib: "npm:^2.8.1" - peerDependencies: - react: ^17 || ^18 || ^19 - react-dom: ^17 || ^18 || ^19 - checksum: 10c0/55ce255ce1acedc0405c3ceb22c4ac1843b2e19d9c2953bfe3cdd76561b402490bf233ad51b8aa3904616173131da78ab7792c46c9a5d0d859bded3c8dccbc73 - languageName: node - linkType: hard - "@peculiar/asn1-cms@npm:^2.6.0, @peculiar/asn1-cms@npm:^2.8.0": version: 2.8.0 resolution: "@peculiar/asn1-cms@npm:2.8.0" @@ -12234,7 +12189,7 @@ __metadata: languageName: node linkType: hard -"@red-hat-developer-hub/backstage-plugin-app-react@npm:0.0.5, @red-hat-developer-hub/backstage-plugin-app-react@npm:^0.0.5": +"@red-hat-developer-hub/backstage-plugin-app-react@npm:0.0.5": version: 0.0.5 resolution: "@red-hat-developer-hub/backstage-plugin-app-react@npm:0.0.5" dependencies: @@ -12249,75 +12204,6 @@ __metadata: languageName: node linkType: hard -"@red-hat-developer-hub/backstage-plugin-global-header@npm:1.21.5": - version: 1.21.5 - resolution: "@red-hat-developer-hub/backstage-plugin-global-header@npm:1.21.5" - dependencies: - "@backstage/catalog-model": "npm:^1.7.7" - "@backstage/core-components": "npm:^0.18.8" - "@backstage/core-plugin-api": "npm:^1.12.4" - "@backstage/frontend-plugin-api": "npm:^0.15.1" - "@backstage/plugin-app-react": "npm:^0.2.1" - "@backstage/plugin-catalog-react": "npm:^2.1.0" - "@backstage/plugin-notifications": "npm:^0.5.15" - "@backstage/plugin-notifications-common": "npm:^0.2.1" - "@backstage/plugin-search": "npm:^1.7.0" - "@backstage/plugin-search-backend": "npm:^2.1.0" - "@backstage/plugin-search-backend-module-catalog": "npm:^0.3.13" - "@backstage/plugin-search-backend-module-pg": "npm:^0.5.53" - "@backstage/plugin-search-backend-module-techdocs": "npm:^0.4.12" - "@backstage/plugin-search-common": "npm:^1.2.22" - "@backstage/plugin-search-react": "npm:^1.11.0" - "@backstage/plugin-signals-react": "npm:^0.0.20" - "@backstage/plugin-user-settings": "npm:^0.9.1" - "@backstage/theme": "npm:^0.7.2" - "@mui/icons-material": "npm:5.18.0" - "@mui/material": "npm:5.18.0" - "@mui/styled-engine": "npm:5.18.0" - "@scalprum/react-core": "npm:0.11.1" - react-use: "npm:^17.5.0" - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - checksum: 10c0/951e18545eb6c1f9d24153fdf18950f89bc53d5b22a01da4c5cb59efed9acff218932e6171795d31a5a4fe6ae851b6eae0792d88926ef0970283a6d7d837b4c1 - languageName: node - linkType: hard - -"@red-hat-developer-hub/backstage-plugin-global-header@npm:^1.21.0": - version: 1.21.6 - resolution: "@red-hat-developer-hub/backstage-plugin-global-header@npm:1.21.6" - dependencies: - "@backstage/catalog-model": "npm:^1.7.7" - "@backstage/core-components": "npm:^0.18.8" - "@backstage/core-plugin-api": "npm:^1.12.4" - "@backstage/frontend-plugin-api": "npm:^0.15.1" - "@backstage/plugin-app-react": "npm:^0.2.1" - "@backstage/plugin-catalog-react": "npm:^2.1.0" - "@backstage/plugin-notifications": "npm:^0.5.15" - "@backstage/plugin-notifications-common": "npm:^0.2.1" - "@backstage/plugin-search": "npm:^1.7.0" - "@backstage/plugin-search-backend": "npm:^2.1.0" - "@backstage/plugin-search-backend-module-catalog": "npm:^0.3.13" - "@backstage/plugin-search-backend-module-pg": "npm:^0.5.53" - "@backstage/plugin-search-backend-module-techdocs": "npm:^0.4.12" - "@backstage/plugin-search-common": "npm:^1.2.22" - "@backstage/plugin-search-react": "npm:^1.11.0" - "@backstage/plugin-signals-react": "npm:^0.0.20" - "@backstage/plugin-user-settings": "npm:^0.9.1" - "@backstage/theme": "npm:^0.7.2" - "@mui/icons-material": "npm:5.18.0" - "@mui/material": "npm:5.18.0" - "@mui/styled-engine": "npm:5.18.0" - "@mui/styles": "npm:5.18.0" - "@scalprum/react-core": "npm:0.11.1" - react-use: "npm:^17.5.0" - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - checksum: 10c0/41f8461140389b3ba5ac3a7373e6dffa77831d98ef94bdb39545a1f85c5e9138a628c840fa84e2bb74419211fc69d32bc664fb084463ff68cb85f62eeef5def7 - languageName: node - linkType: hard - "@red-hat-developer-hub/backstage-plugin-homepage-common@npm:^0.2.1": version: 0.2.1 resolution: "@red-hat-developer-hub/backstage-plugin-homepage-common@npm:0.2.1" @@ -12358,33 +12244,6 @@ __metadata: languageName: node linkType: hard -"@red-hat-developer-hub/backstage-plugin-quickstart@npm:1.10.0": - version: 1.10.0 - resolution: "@red-hat-developer-hub/backstage-plugin-quickstart@npm:1.10.0" - dependencies: - "@backstage-community/plugin-rbac-common": "npm:^1.19.0" - "@backstage/core-components": "npm:^0.18.8" - "@backstage/core-plugin-api": "npm:^1.12.4" - "@backstage/frontend-plugin-api": "npm:^0.15.1" - "@backstage/plugin-app-react": "npm:^0.2.1" - "@backstage/plugin-permission-react": "npm:^0.4.41" - "@backstage/theme": "npm:^0.7.2" - "@mui/icons-material": "npm:5.18.0" - "@mui/material": "npm:5.18.0" - "@mui/styles": "npm:5.18.0" - "@patternfly/react-icons": "npm:^6.5.0" - "@red-hat-developer-hub/backstage-plugin-app-react": "npm:^0.0.5" - "@red-hat-developer-hub/backstage-plugin-global-header": "npm:^1.21.0" - "@red-hat-developer-hub/backstage-plugin-theme": "npm:^0.14.0" - react-use: "npm:^17.6.0" - 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 - checksum: 10c0/f78535c159a78d75e494d4bb60d85da5a500b9bb814ef401e5095c12998e253a5550abfaf1528f7474fda521fbaac1ddc9b3f1c3d6e2dc08ccdd81fa5e209e45 - languageName: node - linkType: hard - "@red-hat-developer-hub/backstage-plugin-theme@npm:0.14.7": version: 0.14.7 resolution: "@red-hat-developer-hub/backstage-plugin-theme@npm:0.14.7" @@ -12403,24 +12262,6 @@ __metadata: languageName: node linkType: hard -"@red-hat-developer-hub/backstage-plugin-theme@npm:^0.14.0": - version: 0.14.8 - resolution: "@red-hat-developer-hub/backstage-plugin-theme@npm:0.14.8" - dependencies: - "@backstage/frontend-plugin-api": "npm:^0.15.1" - "@backstage/plugin-app-react": "npm:^0.2.1" - "@mui/icons-material": "npm:^5.17.1" - peerDependencies: - "@backstage/core-plugin-api": ^1.12.4 - "@backstage/theme": ^0.7.2 - "@mui/icons-material": ^5.17.1 - "@mui/material": ^5.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/9dc6f44a9eca0f0a033609ef1887837908737bf4e3eba2ff614202c9ad1c4886ef6a52e30c5c25015607205104846786dceabbf37f760835037e7016711bac4e - languageName: node - linkType: hard - "@red-hat-developer-hub/backstage-plugin-translations-backend@npm:0.3.1": version: 0.3.1 resolution: "@red-hat-developer-hub/backstage-plugin-translations-backend@npm:0.3.1" @@ -13160,17 +13001,7 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^3.1.9": - version: 3.1.9 - resolution: "@smithy/abort-controller@npm:3.1.9" - dependencies: - "@smithy/types": "npm:^3.7.2" - tslib: "npm:^2.6.2" - checksum: 10c0/d8e27940a087a16922d3c292049b50847fe8a84e632701e5aa33c175ddd84c1ef2566ac3f6550bcc06689da64bf79bdbabaf4e442ba92b18c252e62ca6a8880e - languageName: node - linkType: hard - -"@smithy/core@npm:^3.24.6, @smithy/core@npm:^3.25.1, @smithy/core@npm:^3.29.2": +"@smithy/core@npm:^3.24.6, @smithy/core@npm:^3.25.1": version: 3.29.3 resolution: "@smithy/core@npm:3.29.3" dependencies: @@ -13211,19 +13042,6 @@ __metadata: languageName: node linkType: hard -"@smithy/node-http-handler@npm:^3.0.0": - version: 3.3.3 - resolution: "@smithy/node-http-handler@npm:3.3.3" - dependencies: - "@smithy/abort-controller": "npm:^3.1.9" - "@smithy/protocol-http": "npm:^4.1.8" - "@smithy/querystring-builder": "npm:^3.0.11" - "@smithy/types": "npm:^3.7.2" - tslib: "npm:^2.6.2" - checksum: 10c0/b95ac887388f5698583855a430ca6e727bff4fc32bc4143debbdde70061685174fde132c0475f9a5128cf7522d553e108e859b41b01b3e58843f0f9cf48acd3e - languageName: node - linkType: hard - "@smithy/node-http-handler@npm:^4.7.6": version: 4.8.1 resolution: "@smithy/node-http-handler@npm:4.8.1" @@ -13235,27 +13053,6 @@ __metadata: languageName: node linkType: hard -"@smithy/protocol-http@npm:^4.1.8": - version: 4.1.8 - resolution: "@smithy/protocol-http@npm:4.1.8" - dependencies: - "@smithy/types": "npm:^3.7.2" - tslib: "npm:^2.6.2" - checksum: 10c0/490425e7329962ede034cf04911c80a2653011dc2b15b9b76a1553545bec84aeef1b70c9f0ab6c2adfc3502afec6f4cf38499dba211e9f81370d470f6e35ca0f - languageName: node - linkType: hard - -"@smithy/querystring-builder@npm:^3.0.11": - version: 3.0.11 - resolution: "@smithy/querystring-builder@npm:3.0.11" - dependencies: - "@smithy/types": "npm:^3.7.2" - "@smithy/util-uri-escape": "npm:^3.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/77daf191c606178cc76f46739b4085660ed3036993a9c2274cb6b70a9ba29e000c33c3c093263a6a119e0a55f063d02a29806e1c90384e18f50a8c2bc0a1d7f0 - languageName: node - linkType: hard - "@smithy/signature-v4@npm:^5.4.6": version: 5.5.1 resolution: "@smithy/signature-v4@npm:5.5.1" @@ -13276,16 +13073,7 @@ __metadata: languageName: node linkType: hard -"@smithy/types@npm:^3.7.2": - version: 3.7.2 - resolution: "@smithy/types@npm:3.7.2" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/4bf4674c922c092f9c92b482b074163ceea199e82466ccd4414c4cd9651f67757456414f969e9997371250e112778b636115727b5af53324334300f328069293 - languageName: node - linkType: hard - -"@smithy/types@npm:^4.14.3, @smithy/types@npm:^4.15.0, @smithy/types@npm:^4.16.0, @smithy/types@npm:^4.16.1": +"@smithy/types@npm:^4.14.3, @smithy/types@npm:^4.15.0, @smithy/types@npm:^4.16.1": version: 4.16.1 resolution: "@smithy/types@npm:4.16.1" dependencies: @@ -13304,15 +13092,6 @@ __metadata: languageName: node linkType: hard -"@smithy/util-uri-escape@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/util-uri-escape@npm:3.0.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/b8d831348412cfafd9300069e74a12e0075b5e786d7ef6a210ba4ab576001c2525653eec68b71dfe6d7aef71c52f547404c4f0345c0fb476a67277f9d44b1156 - languageName: node - linkType: hard - "@smithy/util-utf8@npm:^2.0.0": version: 2.3.0 resolution: "@smithy/util-utf8@npm:2.3.0" @@ -14775,18 +14554,6 @@ __metadata: languageName: node linkType: hard -"@trendyol-js/openstack-swift-sdk@npm:^0.0.7": - version: 0.0.7 - resolution: "@trendyol-js/openstack-swift-sdk@npm:0.0.7" - dependencies: - agentkeepalive: "npm:^4.1.4" - axios: "npm:^1.0.0" - axios-cached-dns-resolve: "npm:0.5.2" - file-type: "npm:^16.5.4" - checksum: 10c0/321ceb734756b7534239ecbeadcd28d141773a8b2caaf7fae0e233d5e0065dca73c78a93d517a8ccb03d87774daa46e2231b42a6e522efb210bd6ec98e8b71b6 - languageName: node - linkType: hard - "@ts-morph/common@npm:~0.25.0": version: 0.25.0 resolution: "@ts-morph/common@npm:0.25.0" @@ -16749,15 +16516,6 @@ __metadata: languageName: node linkType: hard -"agentkeepalive@npm:^4.1.4": - version: 4.6.0 - resolution: "agentkeepalive@npm:4.6.0" - dependencies: - humanize-ms: "npm:^1.2.1" - checksum: 10c0/235c182432f75046835b05f239708107138a40103deee23b6a08caee5136873709155753b394ec212e49e60e94a378189562cb01347765515cff61b692c69187 - languageName: node - linkType: hard - "aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" @@ -17020,6 +16778,7 @@ __metadata: "@backstage/frontend-dynamic-feature-loader": "npm:0.1.13" "@backstage/frontend-plugin-api": "npm:0.17.2" "@backstage/integration-react": "npm:1.2.19" + "@backstage/module-federation-common": "npm:0.1.4" "@backstage/plugin-app": "npm:0.5.0" "@backstage/plugin-app-react": "npm:0.2.4" "@backstage/plugin-app-visualizer": "npm:0.2.5" @@ -17044,13 +16803,11 @@ __metadata: "@material-ui/core": "npm:4.12.4" "@material-ui/icons": "npm:4.11.3" "@material-ui/lab": "npm:4.0.0-alpha.61" + "@module-federation/enhanced": "npm:2.3.3" "@mui/icons-material": "npm:5.18.0" "@octokit/rest": "npm:19.0.13" "@red-hat-developer-hub/backstage-plugin-app-react": "npm:0.0.5" - "@red-hat-developer-hub/backstage-plugin-global-header": "npm:1.21.5" "@red-hat-developer-hub/backstage-plugin-homepage": "npm:1.15.0" - "@red-hat-developer-hub/backstage-plugin-quickstart": "npm:1.10.0" - "@red-hat-developer-hub/backstage-plugin-theme": "npm:0.14.7" "@testing-library/dom": "npm:9.3.4" "@testing-library/jest-dom": "npm:6.9.1" "@testing-library/react": "npm:14.3.1" @@ -17193,18 +16950,6 @@ __metadata: languageName: node linkType: hard -"args@npm:^5.0.0": - version: 5.0.3 - resolution: "args@npm:5.0.3" - dependencies: - camelcase: "npm:5.0.0" - chalk: "npm:2.4.2" - leven: "npm:2.1.0" - mri: "npm:1.1.4" - checksum: 10c0/213871ae97d6f5990dc4637f53e48feef8566b2fd6d5cc9cb46ef78dc1db835b2f90fd536c1414441eaa0b5cb8f2a5ab94b973400b5fea096ee20b9893d3b573 - languageName: node - linkType: hard - "aria-hidden@npm:^1.2.3, aria-hidden@npm:^1.2.4": version: 1.2.6 resolution: "aria-hidden@npm:1.2.6" @@ -17521,13 +17266,6 @@ __metadata: languageName: node linkType: hard -"atomic-sleep@npm:^1.0.0": - version: 1.0.0 - resolution: "atomic-sleep@npm:1.0.0" - checksum: 10c0/e329a6665512736a9bbb073e1761b4ec102f7926cce35037753146a9db9c8104f5044c1662e4a863576ce544fb8be27cd2be6bc8c1a40147d03f31eb1cfb6e8a - languageName: node - linkType: hard - "autolinker@npm:^3.11.0": version: 3.16.2 resolution: "autolinker@npm:3.16.2" @@ -17574,21 +17312,7 @@ __metadata: languageName: node linkType: hard -"axios-cached-dns-resolve@npm:0.5.2": - version: 0.5.2 - resolution: "axios-cached-dns-resolve@npm:0.5.2" - dependencies: - babel-polyfill: "npm:^6.26.0" - json-stringify-safe: "npm:^5.0.1" - lodash: "npm:^4.17.15" - lru-cache: "npm:^5.1.1" - pino: "npm:^5.12.2" - pino-pretty: "npm:^2.6.0" - checksum: 10c0/c68d66b22a578f92b27eae3f37c25f719ee02f34d33ce67bfeeaed2a030e9106119600101ff00e8472b4f6c09c33c64c65b935b138b748f3594e5381c39c81a2 - languageName: node - linkType: hard - -"axios@npm:^1.0.0, axios@npm:^1.16.0, axios@npm:^1.7.3, axios@npm:^1.7.4": +"axios@npm:^1.16.0, axios@npm:^1.7.3, axios@npm:^1.7.4": version: 1.18.1 resolution: "axios@npm:1.18.1" dependencies: @@ -17705,17 +17429,6 @@ __metadata: languageName: node linkType: hard -"babel-polyfill@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-polyfill@npm:6.26.0" - dependencies: - babel-runtime: "npm:^6.26.0" - core-js: "npm:^2.5.0" - regenerator-runtime: "npm:^0.10.5" - checksum: 10c0/9fd1a5766744c29f15f77d3b2b38c73ce55e125b4f4379526ef6dc4b9480950218050b41d34bf19559980b85a8bcd848b416636fc07c0c3b4fe8851b961a3959 - languageName: node - linkType: hard - "babel-preset-current-node-syntax@npm:^1.2.0": version: 1.2.0 resolution: "babel-preset-current-node-syntax@npm:1.2.0" @@ -17753,16 +17466,6 @@ __metadata: languageName: node linkType: hard -"babel-runtime@npm:^6.26.0": - version: 6.26.0 - resolution: "babel-runtime@npm:6.26.0" - dependencies: - core-js: "npm:^2.4.0" - regenerator-runtime: "npm:^0.11.0" - checksum: 10c0/caa752004936b1463765ed3199c52f6a55d0613b9bed108743d6f13ca532b821d4ea9decc4be1b583193164462b1e3e7eefdfa36b15c72e7daac58dd72c1772f - languageName: node - linkType: hard - "backend@workspace:packages/backend": version: 0.0.0-use.local resolution: "backend@workspace:packages/backend" @@ -18411,16 +18114,6 @@ __metadata: languageName: node linkType: hard -"buffer@npm:5.6.0": - version: 5.6.0 - resolution: "buffer@npm:5.6.0" - dependencies: - base64-js: "npm:^1.0.2" - ieee754: "npm:^1.1.4" - checksum: 10c0/07037a0278b07fbc779920f1ba1b473933ffb4a2e2f7b387c55daf6ac64a05b58c27da9e85730a4046e8f97a49f8acd9f7bf89605c0a4dfda88ebfb7e08bfe4a - languageName: node - linkType: hard - "buffer@npm:^4.3.0": version: 4.9.2 resolution: "buffer@npm:4.9.2" @@ -18588,13 +18281,6 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:5.0.0": - version: 5.0.0 - resolution: "camelcase@npm:5.0.0" - checksum: 10c0/515f1ce911d65949708d9e179f1a40af71eb7de668230a0c85961a35590f7da39af79cfb48d834883dbcc7995bdb7dd6bae8027b101e37a10d95337ec8732800 - languageName: node - linkType: hard - "camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -18657,7 +18343,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:2.4.2, chalk@npm:^2.3.2, chalk@npm:^2.4.2": +"chalk@npm:2.4.2, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -18994,7 +18680,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.0.2, clsx@npm:^1.0.4, clsx@npm:^1.1.0, clsx@npm:^1.1.1, clsx@npm:^1.2.1": +"clsx@npm:^1.0.2, clsx@npm:^1.0.4, clsx@npm:^1.1.1, clsx@npm:^1.2.1": version: 1.2.1 resolution: "clsx@npm:1.2.1" checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 @@ -19605,13 +19291,6 @@ __metadata: languageName: node linkType: hard -"core-js@npm:^2.4.0, core-js@npm:^2.5.0": - version: 2.6.12 - resolution: "core-js@npm:2.6.12" - checksum: 10c0/00128efe427789120a06b819adc94cc72b96955acb331cb71d09287baf9bd37bebd191d91f1ee4939c893a050307ead4faea08876f09115112612b6a05684b63 - languageName: node - linkType: hard - "core-js@npm:^3.6.5": version: 3.49.0 resolution: "core-js@npm:3.49.0" @@ -20074,7 +19753,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.10, csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3, csstype@npm:^3.2.2": +"csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3, csstype@npm:^3.2.2": version: 3.2.3 resolution: "csstype@npm:3.2.3" checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce @@ -20304,13 +19983,6 @@ __metadata: languageName: node linkType: hard -"dateformat@npm:^3.0.3": - version: 3.0.3 - resolution: "dateformat@npm:3.0.3" - checksum: 10c0/2effb8bef52ff912f87a05e4adbeacff46353e91313ad1ea9ed31412db26849f5a0fcc7e3ce36dbfb84fc6c881a986d5694f84838ad0da7000d5150693e78678 - languageName: node - linkType: hard - "dayjs@npm:^1.11.20": version: 1.11.21 resolution: "dayjs@npm:1.11.21" @@ -20795,7 +20467,7 @@ __metadata: languageName: node linkType: hard -"dockerode@npm:^4.0.0, dockerode@npm:^4.0.10": +"dockerode@npm:^4.0.10": version: 4.0.12 resolution: "dockerode@npm:4.0.12" dependencies: @@ -22224,7 +21896,7 @@ __metadata: languageName: node linkType: hard -"events@npm:3.3.0, events@npm:^3.0.0, events@npm:^3.2.0, events@npm:^3.3.0": +"events@npm:^3.0.0, events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 @@ -22572,13 +22244,6 @@ __metadata: languageName: node linkType: hard -"fast-json-parse@npm:^1.0.3": - version: 1.0.3 - resolution: "fast-json-parse@npm:1.0.3" - checksum: 10c0/2c58c7a0f7f1725c9da1272839f9bee3ccc13b77672b18ab4ac470c707999bca39828cd7e79b87c73017f21c3ddff37992d03fa2fd2da124d9bd06c1d02c9b7e - languageName: node - linkType: hard - "fast-json-patch@npm:^3.0.0-1, fast-json-patch@npm:^3.1.1": version: 3.1.1 resolution: "fast-json-patch@npm:3.1.1" @@ -22607,14 +22272,7 @@ __metadata: languageName: node linkType: hard -"fast-redact@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-redact@npm:2.1.0" - checksum: 10c0/2194374ab2c6eab5d69a680cd71aea3ee774be2e39e33ab0816c4935e8287f8c3755d481be6bd56def26c3288e2842b49cdc3a347abf311e91cafe74183fbbca - languageName: node - linkType: hard - -"fast-safe-stringify@npm:^2.0.6, fast-safe-stringify@npm:^2.0.7, fast-safe-stringify@npm:^2.1.1": +"fast-safe-stringify@npm:^2.1.1": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" checksum: 10c0/d90ec1c963394919828872f21edaa3ad6f1dddd288d2bd4e977027afff09f5db40f94e39536d4646f7e01761d704d72d51dce5af1b93717f3489ef808f5f4e4d @@ -22810,17 +22468,6 @@ __metadata: languageName: node linkType: hard -"file-type@npm:^16.5.4": - version: 16.5.4 - resolution: "file-type@npm:16.5.4" - dependencies: - readable-web-to-node-stream: "npm:^3.0.0" - strtok3: "npm:^6.2.4" - token-types: "npm:^4.1.1" - checksum: 10c0/a6c9ab8bc05bc9c212bec239fb0d5bf59ddc9b3912f00c4ef44622e67ae4e553a1cc8372e9e595e14859035188eb305d05d488fa3c5c2a2ad90bb7745b3004ef - languageName: node - linkType: hard - "file-type@npm:^21.1.1": version: 21.3.4 resolution: "file-type@npm:21.3.4" @@ -22974,13 +22621,6 @@ __metadata: languageName: node linkType: hard -"flatstr@npm:^1.0.12": - version: 1.0.12 - resolution: "flatstr@npm:1.0.12" - checksum: 10c0/f99cf801fd3606e8b4aa96b93ec09caab42bc304526ff55a80db03db0ef73c9a014e983a6d72009c4f1bc50e2483d137041fae18a325dc0d851d045c4d6929a9 - languageName: node - linkType: hard - "flatted@npm:^3.2.7, flatted@npm:^3.2.9, flatted@npm:^3.4.2": version: 3.4.2 resolution: "flatted@npm:3.4.2" @@ -23905,15 +23545,6 @@ __metadata: languageName: node linkType: hard -"goober@npm:^2.0.33": - version: 2.1.19 - resolution: "goober@npm:2.1.19" - peerDependencies: - csstype: ^3.0.10 - checksum: 10c0/f6a01f2e8abfef571ac539f96e650dcde964e7c0bef6c9055a8c8e110624ccd7b51ab90706a806ca570a56141ea689d355fb1cec3ee9209499c249638883990d - languageName: node - linkType: hard - "google-auth-library@npm:^9.0.0, google-auth-library@npm:^9.3.0, google-auth-library@npm:^9.6.3": version: 9.15.1 resolution: "google-auth-library@npm:9.15.1" @@ -24475,13 +24106,6 @@ __metadata: languageName: node linkType: hard -"hpagent@npm:^1.2.0": - version: 1.2.0 - resolution: "hpagent@npm:1.2.0" - checksum: 10c0/505ef42e5e067dba701ea21e7df9fa73f6f5080e59d53680829827d34cd7040f1ecf7c3c8391abe9df4eb4682ef4a4321608836b5b70a61b88c1b3a03d77510b - languageName: node - linkType: hard - "html-encoding-sniffer@npm:^6.0.0": version: 6.0.0 resolution: "html-encoding-sniffer@npm:6.0.0" @@ -24754,15 +24378,6 @@ __metadata: languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: "npm:^2.0.0" - checksum: 10c0/f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a - languageName: node - linkType: hard - "husky@npm:8.0.3": version: 8.0.3 resolution: "husky@npm:8.0.3" @@ -26507,13 +26122,6 @@ __metadata: languageName: node linkType: hard -"jmespath@npm:^0.15.0": - version: 0.15.0 - resolution: "jmespath@npm:0.15.0" - checksum: 10c0/95fe1cabb4a12fc2b443a7aa9e85dca52a87437038276765fc54bfbb651a03f5f739266c0b3520531e7cf67986f716308edad8fadb8fbc26bf82a146f881d2e3 - languageName: node - linkType: hard - "jose@npm:5.10.0, jose@npm:^5.0.0": version: 5.10.0 resolution: "jose@npm:5.10.0" @@ -26882,7 +26490,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.0, json5@npm:^2.2.3": +"json5@npm:^2.1.2, json5@npm:^2.2.0, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -27332,13 +26940,6 @@ __metadata: languageName: node linkType: hard -"leven@npm:2.1.0": - version: 2.1.0 - resolution: "leven@npm:2.1.0" - checksum: 10c0/e685243900aad7e854212001c9b7fe6d0806081e184d5077a561a91d07425852e8b7d1edf76b948f4be520b64e0015960be3a5f3e9acb0bec75a0e4134b422df - languageName: node - linkType: hard - "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -29176,13 +28777,6 @@ __metadata: languageName: node linkType: hard -"mri@npm:1.1.4": - version: 1.1.4 - resolution: "mri@npm:1.1.4" - checksum: 10c0/eb577c2ef60385aa287afdac777e536996f4fd3144250c201097e7ec121568139d482c92cb9a512f90e428d6dc3e9ba8e9de89bc204424cb96f187a4bdc465c1 - languageName: node - linkType: hard - "mri@npm:^1.1.0": version: 1.2.0 resolution: "mri@npm:1.2.0" @@ -29204,7 +28798,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -29787,19 +29381,6 @@ __metadata: languageName: node linkType: hard -"notistack@npm:^3.0.1": - version: 3.0.2 - resolution: "notistack@npm:3.0.2" - dependencies: - clsx: "npm:^1.1.0" - goober: "npm:^2.0.33" - peerDependencies: - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/82a0270ee1b9e70bc1dfad4d7e1d2bbb6dc08ac887b920986dcfa58cc2aa975bd48b71f7cf3afc2e11badd142ba9ade5f708c858ee2080b9d4cd950b80c43811 - languageName: node - linkType: hard - "npm-bundled@npm:^2.0.0": version: 2.0.1 resolution: "npm-bundled@npm:2.0.1" @@ -30939,13 +30520,6 @@ __metadata: languageName: node linkType: hard -"peek-readable@npm:^4.1.0": - version: 4.1.0 - resolution: "peek-readable@npm:4.1.0" - checksum: 10c0/f9b81ce3eed185cc9ebbf7dff0b6e130dd6da7b05f1802bbf726a78e4d84990b0a65f8e701959c50eb1124cc2ad352205147954bf39793faba29bb00ce742a44 - languageName: node - linkType: hard - "pend@npm:~1.2.0": version: 1.2.0 resolution: "pend@npm:1.2.0" @@ -31106,48 +30680,6 @@ __metadata: languageName: node linkType: hard -"pino-pretty@npm:^2.6.0": - version: 2.6.1 - resolution: "pino-pretty@npm:2.6.1" - dependencies: - args: "npm:^5.0.0" - chalk: "npm:^2.3.2" - dateformat: "npm:^3.0.3" - fast-json-parse: "npm:^1.0.3" - fast-safe-stringify: "npm:^2.0.6" - jmespath: "npm:^0.15.0" - pump: "npm:^3.0.0" - readable-stream: "npm:^3.0.6" - split2: "npm:^3.0.0" - bin: - pino-pretty: ./bin.js - checksum: 10c0/84ac2d32128028ceab84689d54ebdebe68ba4f89f094e04758af8f4915b2972f096a475a93d5da327971697d9e78a47034a038ffa3de568cc094370ce0c32387 - languageName: node - linkType: hard - -"pino-std-serializers@npm:^2.4.2": - version: 2.5.0 - resolution: "pino-std-serializers@npm:2.5.0" - checksum: 10c0/0d2f7aaa388258574dc45f3fe02de158e2da21f956d51aac2ee20cf0385c90bda464346d6a79bcfbe6dccf4140e23ccdd116ca41e804f6a7e95d5558d96fa7ee - languageName: node - linkType: hard - -"pino@npm:^5.12.2": - version: 5.17.0 - resolution: "pino@npm:5.17.0" - dependencies: - fast-redact: "npm:^2.0.0" - fast-safe-stringify: "npm:^2.0.7" - flatstr: "npm:^1.0.12" - pino-std-serializers: "npm:^2.4.2" - quick-format-unescaped: "npm:^3.0.3" - sonic-boom: "npm:^0.7.5" - bin: - pino: bin.js - checksum: 10c0/c83f28f14a3e0b7e45e59f924efe58f7f0c522a9c23ba574cbdf2e931c2b5b22b0d6e2d6fb7c78ac3331532ea328c4cfe78941801c5b39799de4c77a7c856ca9 - languageName: node - linkType: hard - "pipenet@npm:^1.3.0": version: 1.4.2 resolution: "pipenet@npm:1.4.2" @@ -32130,13 +31662,6 @@ __metadata: languageName: node linkType: hard -"quick-format-unescaped@npm:^3.0.3": - version: 3.0.3 - resolution: "quick-format-unescaped@npm:3.0.3" - checksum: 10c0/7c14031e71e1d82c86205f735a1912f66173a4370f6a2de908cce0ead880f66d581c6ac7dcd9a8ee38889550ffd03abce26ffb015a9dbb7c3598d75a6a251b82 - languageName: node - linkType: hard - "quick-lru@npm:^5.1.1": version: 5.1.1 resolution: "quick-lru@npm:5.1.1" @@ -32756,15 +32281,6 @@ __metadata: languageName: node linkType: hard -"react-relative-time@npm:^0.0.9": - version: 0.0.9 - resolution: "react-relative-time@npm:0.0.9" - peerDependencies: - react: ">=0.13.0" - checksum: 10c0/8489deccdae251812698d1bdce3239076e8237131565739a8c11f994183f585b6aa5a2a3564b6dae57e6ecd07eae8edc7992104e3720ca84776269c8d51a6055 - languageName: node - linkType: hard - "react-remove-scroll-bar@npm:^2.3.7": version: 2.3.8 resolution: "react-remove-scroll-bar@npm:2.3.8" @@ -32973,7 +32489,7 @@ __metadata: languageName: node linkType: hard -"react-use@npm:17.6.1, react-use@npm:^17.2.4, react-use@npm:^17.3.2, react-use@npm:^17.5.0, react-use@npm:^17.6.0": +"react-use@npm:17.6.1, react-use@npm:^17.2.4, react-use@npm:^17.3.2": version: 17.6.1 resolution: "react-use@npm:17.6.1" dependencies: @@ -33086,7 +32602,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^4.0.0, readable-stream@npm:^4.7.0": +"readable-stream@npm:^4.0.0": version: 4.7.0 resolution: "readable-stream@npm:4.7.0" dependencies: @@ -33099,15 +32615,6 @@ __metadata: languageName: node linkType: hard -"readable-web-to-node-stream@npm:^3.0.0": - version: 3.0.4 - resolution: "readable-web-to-node-stream@npm:3.0.4" - dependencies: - readable-stream: "npm:^4.7.0" - checksum: 10c0/2dc417d5d0b0c0191fcf57f87df3b2853db21d1da5554ec32b1e1c5a515e5a1243fc077a23f74046d711c2d736628f64b31054a8379b95bb016212430b5110c5 - languageName: node - linkType: hard - "readdir-glob@npm:^1.1.2": version: 1.1.3 resolution: "readdir-glob@npm:1.1.3" @@ -33264,20 +32771,6 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.10.5": - version: 0.10.5 - resolution: "regenerator-runtime@npm:0.10.5" - checksum: 10c0/2d21167780acfd6b4a93eb75d68345499bc4c887f465101e6facf6197f25963efadcab761dc77b45f252eccd3a5ebcf562a7edde54e437cec932fb92b2c30f65 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.11.0": - version: 0.11.1 - resolution: "regenerator-runtime@npm:0.11.1" - checksum: 10c0/69cfa839efcf2d627fe358bf302ab8b24e5f182cb69f13e66f0612d3640d7838aad1e55662135e3ef2c1cc4322315b757626094fab13a48f9a64ab4bdeb8795b - languageName: node - linkType: hard - "regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" @@ -34801,16 +34294,6 @@ __metadata: languageName: node linkType: hard -"sonic-boom@npm:^0.7.5": - version: 0.7.7 - resolution: "sonic-boom@npm:0.7.7" - dependencies: - atomic-sleep: "npm:^1.0.0" - flatstr: "npm:^1.0.12" - checksum: 10c0/68c463a7bce3ec00cb4af4ceb1e77d44fb209d504479b665b65c6b13b272e3e099e3139623e94fa2fdc2b3f6582e7fd37c09aae17e2063f7e3d0da0f4153934b - languageName: node - linkType: hard - "sorted-array-functions@npm:^1.3.0": version: 1.3.0 resolution: "sorted-array-functions@npm:1.3.0" @@ -35117,16 +34600,6 @@ __metadata: languageName: node linkType: hard -"stream-browserify@npm:3.0.0, stream-browserify@npm:^3.0.0": - version: 3.0.0 - resolution: "stream-browserify@npm:3.0.0" - dependencies: - inherits: "npm:~2.0.4" - readable-stream: "npm:^3.5.0" - checksum: 10c0/ec3b975a4e0aa4b3dc5e70ffae3fc8fd29ac725353a14e72f213dff477b00330140ad014b163a8cbb9922dfe90803f81a5ea2b269e1bbfd8bd71511b88f889ad - languageName: node - linkType: hard - "stream-browserify@npm:^2.0.1": version: 2.0.2 resolution: "stream-browserify@npm:2.0.2" @@ -35137,6 +34610,16 @@ __metadata: languageName: node linkType: hard +"stream-browserify@npm:^3.0.0": + version: 3.0.0 + resolution: "stream-browserify@npm:3.0.0" + dependencies: + inherits: "npm:~2.0.4" + readable-stream: "npm:^3.5.0" + checksum: 10c0/ec3b975a4e0aa4b3dc5e70ffae3fc8fd29ac725353a14e72f213dff477b00330140ad014b163a8cbb9922dfe90803f81a5ea2b269e1bbfd8bd71511b88f889ad + languageName: node + linkType: hard + "stream-events@npm:^1.0.5": version: 1.0.5 resolution: "stream-events@npm:1.0.5" @@ -35496,16 +34979,6 @@ __metadata: languageName: node linkType: hard -"strtok3@npm:^6.2.4": - version: 6.3.0 - resolution: "strtok3@npm:6.3.0" - dependencies: - "@tokenizer/token": "npm:^0.3.0" - peek-readable: "npm:^4.1.0" - checksum: 10c0/8f1483a2a6758404502f2fc431586fcf37d747b10b125596ab5ec92319c247dd1195f82ba0bc2eaa582db3d807b5cca4b67ff61411756fec6622d051f8e255c2 - languageName: node - linkType: hard - "stubs@npm:^3.0.0": version: 3.0.0 resolution: "stubs@npm:3.0.0" @@ -36298,16 +35771,6 @@ __metadata: languageName: node linkType: hard -"token-types@npm:^4.1.1": - version: 4.2.1 - resolution: "token-types@npm:4.2.1" - dependencies: - "@tokenizer/token": "npm:^0.3.0" - ieee754: "npm:^1.2.1" - checksum: 10c0/e9a4a139deba9515770cd7ac36a8f53f953b9d035d309e88a66d706760dba0df420753f2b8bdee6b9f3cbff8d66b24e69571e8dea27baa7b378229ab1bcca399 - languageName: node - linkType: hard - "token-types@npm:^6.1.1": version: 6.1.2 resolution: "token-types@npm:6.1.2" @@ -38534,6 +37997,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 + languageName: node + linkType: hard + "wsl-utils@npm:^0.1.0": version: 0.1.0 resolution: "wsl-utils@npm:0.1.0" From d6ca00b189dc58c83c501827da5a433519c8861f Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Sun, 19 Jul 2026 22:26:54 -0400 Subject: [PATCH 06/10] fix(ci): unbreak app-next tsc and DynamicRoot tests Align @module-federation/enhanced with Backstage and mock fetchOverrideTranslations so CI no longer hangs on localhost. Co-authored-by: Cursor --- packages/app-next/package.json | 2 +- .../rhdhDynamicFrontendFeaturesLoader.ts | 33 +-- .../DynamicRoot/DynamicRoot.test.tsx | 5 + yarn.lock | 248 +----------------- 4 files changed, 25 insertions(+), 263 deletions(-) diff --git a/packages/app-next/package.json b/packages/app-next/package.json index c474643863..3732caac2e 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -76,7 +76,7 @@ "@material-ui/core": "4.12.4", "@material-ui/icons": "4.11.3", "@material-ui/lab": "4.0.0-alpha.61", - "@module-federation/enhanced": "2.3.3", + "@module-federation/enhanced": "2.5.1", "@mui/icons-material": "5.18.0", "@octokit/rest": "19.0.13", "@red-hat-developer-hub/backstage-plugin-app-react": "0.0.5", diff --git a/packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.ts b/packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.ts index 5f35b5ca1a..a2e3cfef1b 100644 --- a/packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.ts +++ b/packages/app-next/src/modules/dynamicFeatures/rhdhDynamicFrontendFeaturesLoader.ts @@ -69,37 +69,38 @@ export function rhdhDynamicFrontendFeaturesLoader( const shared = await loadModuleFederationHostShared({ onError: err => error(err.message, err.cause), }); - const createOptions: Parameters[0] = { + // Keep options untyped: duplicate @module-federation/runtime-core + // copies under enhanced vs host resolve to incompatible UserOptions. + const createOptions = { name: appPackageName .replaceAll('@', '') .replaceAll('/', '__') .replaceAll('-', '_'), shared, - remotes: [], + remotes: [] as [], + ...(options?.moduleFederation?.shareStrategy + ? { shareStrategy: options.moduleFederation.shareStrategy } + : {}), }; - if (options?.moduleFederation?.shareStrategy) { - createOptions.shareStrategy = - options.moduleFederation.shareStrategy; - } instance = createInstance(createOptions); } - const userOptions: Parameters[0] = { + const userOptions = { name: instance.name, remotes: frontendPluginRemotes.map(remote => ({ alias: remote.packageName, ...remote.remoteInfo, })), + ...(options?.moduleFederation?.plugins + ? { plugins: options.moduleFederation.plugins } + : {}), + ...(options?.moduleFederation?.shareStrategy + ? { shareStrategy: options.moduleFederation.shareStrategy } + : {}), + ...(options?.moduleFederation?.shared + ? { shared: options.moduleFederation.shared } + : {}), }; - if (options?.moduleFederation?.plugins) { - userOptions.plugins = options.moduleFederation.plugins; - } - if (options?.moduleFederation?.shareStrategy) { - userOptions.shareStrategy = options.moduleFederation.shareStrategy; - } - if (options?.moduleFederation?.shared) { - userOptions.shared = options.moduleFederation.shared; - } instance.initOptions(userOptions); } catch (err) { error('Failed initializing module federation', err); diff --git a/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx b/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx index 700e8e689b..220cb0a73d 100644 --- a/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx +++ b/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx @@ -118,6 +118,11 @@ jest.mock('@backstage/app-defaults', () => ({ __esModule: true, })); +// Avoid real network calls to backend.baseUrl (can hang on localhost in CI). +jest.mock('../../utils/translations/fetchOverrideTranslations', () => ({ + fetchOverrideTranslations: jest.fn().mockResolvedValue({}), +})); + const mockInitializeRemotePlugins = jest.fn() as jest.MockedFunction< typeof initializeRemotePlugins >; diff --git a/yarn.lock b/yarn.lock index ef38116e43..5a53676757 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8825,17 +8825,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/bridge-react-webpack-plugin@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/bridge-react-webpack-plugin@npm:2.3.3" - dependencies: - "@module-federation/sdk": "npm:2.3.3" - "@types/semver": "npm:7.5.8" - semver: "npm:7.6.3" - checksum: 10c0/a94ff3a5197a831720ab31716b6072cc50cc82c708e10ac362b27e679de1e8dac6b4fa56145764242762d84837989874139697a453379373707e7542751b7615 - languageName: node - linkType: hard - "@module-federation/bridge-react-webpack-plugin@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/bridge-react-webpack-plugin@npm:2.5.1" @@ -8847,20 +8836,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/cli@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/cli@npm:2.3.3" - dependencies: - "@module-federation/dts-plugin": "npm:2.3.3" - "@module-federation/sdk": "npm:2.3.3" - commander: "npm:11.1.0" - jiti: "npm:2.4.2" - bin: - mf: bin/mf.js - checksum: 10c0/035b555537d49de38f2cfb6e5a4bcfbe86f02b2e91df376489f3ffddc24a032e76adcf765fb912949a860447cbcdaf32beb910c4366bae5cbb4d072f146e997a - languageName: node - linkType: hard - "@module-federation/cli@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/cli@npm:2.5.1" @@ -8875,48 +8850,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/data-prefetch@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/data-prefetch@npm:2.3.3" - dependencies: - "@module-federation/runtime": "npm:2.3.3" - "@module-federation/sdk": "npm:2.3.3" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: 10c0/e01d7a1b8dfa059c1182655e6991609252462cdcbf05dfea0405ab4b3f57da8dda2a329864fafc30ac248dea4b9c48281cac75495a1e16e416fa7d29f63236b1 - languageName: node - linkType: hard - -"@module-federation/dts-plugin@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/dts-plugin@npm:2.3.3" - dependencies: - "@module-federation/error-codes": "npm:2.3.3" - "@module-federation/managers": "npm:2.3.3" - "@module-federation/sdk": "npm:2.3.3" - "@module-federation/third-party-dts-extractor": "npm:2.3.3" - adm-zip: "npm:0.5.10" - ansi-colors: "npm:4.1.3" - isomorphic-ws: "npm:5.0.0" - node-schedule: "npm:2.1.1" - undici: "npm:7.24.7" - ws: "npm:8.18.0" - peerDependencies: - typescript: ^4.9.0 || ^5.0.0 - vue-tsc: ">=1.0.24" - peerDependenciesMeta: - vue-tsc: - optional: true - checksum: 10c0/834c5eb773490238f29fd9239454bc2d79d7484667f157da87916f9d4e37abbefcb3aefa8a6b256492473f0054b500fe0db33b89955ebaa16c247bb282d1c879 - languageName: node - linkType: hard - "@module-federation/dts-plugin@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/dts-plugin@npm:2.5.1" @@ -8941,43 +8874,7 @@ __metadata: languageName: node linkType: hard -"@module-federation/enhanced@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/enhanced@npm:2.3.3" - dependencies: - "@module-federation/bridge-react-webpack-plugin": "npm:2.3.3" - "@module-federation/cli": "npm:2.3.3" - "@module-federation/data-prefetch": "npm:2.3.3" - "@module-federation/dts-plugin": "npm:2.3.3" - "@module-federation/error-codes": "npm:2.3.3" - "@module-federation/inject-external-runtime-core-plugin": "npm:2.3.3" - "@module-federation/managers": "npm:2.3.3" - "@module-federation/manifest": "npm:2.3.3" - "@module-federation/rspack": "npm:2.3.3" - "@module-federation/runtime-tools": "npm:2.3.3" - "@module-federation/sdk": "npm:2.3.3" - "@module-federation/webpack-bundler-runtime": "npm:2.3.3" - schema-utils: "npm:4.3.0" - tapable: "npm:2.3.0" - upath: "npm:2.0.1" - peerDependencies: - typescript: ^4.9.0 || ^5.0.0 - vue-tsc: ">=1.0.24" - webpack: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - vue-tsc: - optional: true - webpack: - optional: true - bin: - mf: bin/mf.js - checksum: 10c0/e354bbf60fc5cc3f786f8fcb515abb37a5ee72b9ce80e254d2d79cca0300fe9b248959c629c0d4f92e056b6c767f442419ab7f779665f92d63f9c8679ee6149a - languageName: node - linkType: hard - -"@module-federation/enhanced@npm:^2.3.3": +"@module-federation/enhanced@npm:2.5.1, @module-federation/enhanced@npm:^2.3.3": version: 2.5.1 resolution: "@module-federation/enhanced@npm:2.5.1" dependencies: @@ -9019,13 +8916,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/error-codes@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/error-codes@npm:2.3.3" - checksum: 10c0/392d4ebcb874cc91275c9576a63b1c9a527161d68e2ee4bdf2876a7cad31127b1c6c9bbfdb3f6b120a0e7a07aa11c160ab92155d41e7d38d5f313f8c897842df - languageName: node - linkType: hard - "@module-federation/error-codes@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/error-codes@npm:2.5.1" @@ -9033,15 +8923,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/inject-external-runtime-core-plugin@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/inject-external-runtime-core-plugin@npm:2.3.3" - peerDependencies: - "@module-federation/runtime-tools": 2.3.3 - checksum: 10c0/ea7841ad55e6f273590ea6a28e51e0527e0fba946a37d87ac676971cef354ee00a73efc078c831154f12b9940996f880afeb3b3a45cf1db84777927720ee1824 - languageName: node - linkType: hard - "@module-federation/inject-external-runtime-core-plugin@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/inject-external-runtime-core-plugin@npm:2.5.1" @@ -9051,16 +8932,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/managers@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/managers@npm:2.3.3" - dependencies: - "@module-federation/sdk": "npm:2.3.3" - find-pkg: "npm:2.0.0" - checksum: 10c0/f9d64fb5fac73936120791b29b111b2b040e6f12fbd5af44a1f293087d6845fbe972973b2e57b9518885c8bfdac58535bec6db9804fdc8c77cc0e6aebb9e1edf - languageName: node - linkType: hard - "@module-federation/managers@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/managers@npm:2.5.1" @@ -9071,18 +8942,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/manifest@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/manifest@npm:2.3.3" - dependencies: - "@module-federation/dts-plugin": "npm:2.3.3" - "@module-federation/managers": "npm:2.3.3" - "@module-federation/sdk": "npm:2.3.3" - find-pkg: "npm:2.0.0" - checksum: 10c0/7e714e332382e6ef343dc9173938ef8026ba0c7c1330ed1e0f296513953620abde4934b936bdd30ba01da67b963bfe5f27f1c89ebde86d78ae891a072d1f2c05 - languageName: node - linkType: hard - "@module-federation/manifest@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/manifest@npm:2.5.1" @@ -9095,30 +8954,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/rspack@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/rspack@npm:2.3.3" - dependencies: - "@module-federation/bridge-react-webpack-plugin": "npm:2.3.3" - "@module-federation/dts-plugin": "npm:2.3.3" - "@module-federation/inject-external-runtime-core-plugin": "npm:2.3.3" - "@module-federation/managers": "npm:2.3.3" - "@module-federation/manifest": "npm:2.3.3" - "@module-federation/runtime-tools": "npm:2.3.3" - "@module-federation/sdk": "npm:2.3.3" - peerDependencies: - "@rspack/core": ^0.7.0 || ^1.0.0 || ^2.0.0-0 - typescript: ^4.9.0 || ^5.0.0 - vue-tsc: ">=1.0.24" - peerDependenciesMeta: - typescript: - optional: true - vue-tsc: - optional: true - checksum: 10c0/5c3a25b486859d71e60b6cad32d72f95157f7e24aee5cb992868cb7927c0194fe5b77979fac10ffd17c65e5972a49c067c89266724d742b0b674f80cee17c89d - languageName: node - linkType: hard - "@module-federation/rspack@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/rspack@npm:2.5.1" @@ -9153,16 +8988,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime-core@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/runtime-core@npm:2.3.3" - dependencies: - "@module-federation/error-codes": "npm:2.3.3" - "@module-federation/sdk": "npm:2.3.3" - checksum: 10c0/77951f77af135844d5176c8242367cb304bc54c5379a63e675d72ee048ca2db3705a501aa123dbd139fdc3d3434e4c393ff7d09a37ad8db4c954610c3bd815ad - languageName: node - linkType: hard - "@module-federation/runtime-core@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/runtime-core@npm:2.5.1" @@ -9183,16 +9008,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime-tools@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/runtime-tools@npm:2.3.3" - dependencies: - "@module-federation/runtime": "npm:2.3.3" - "@module-federation/webpack-bundler-runtime": "npm:2.3.3" - checksum: 10c0/e9653cf8d40a1387570a6d0ca2db4803e7cf55f967ffdd262a4061afe690a3262197b1fe7a612d78e043dd4d0c7e31c61363d3f3da9611b233fecb4167905cf4 - languageName: node - linkType: hard - "@module-federation/runtime-tools@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/runtime-tools@npm:2.5.1" @@ -9214,17 +9029,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/runtime@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/runtime@npm:2.3.3" - dependencies: - "@module-federation/error-codes": "npm:2.3.3" - "@module-federation/runtime-core": "npm:2.3.3" - "@module-federation/sdk": "npm:2.3.3" - checksum: 10c0/c1848c937c4d96891f05797ddbf257cd249b75eb7e2257682910e6b55c89090ec4cc70d1b111672702ac4ccd948cf0782635e1ca85209a88c7ead7f99a34ef1a - languageName: node - linkType: hard - "@module-federation/runtime@npm:2.5.1, @module-federation/runtime@npm:^2.3.3": version: 2.5.1 resolution: "@module-federation/runtime@npm:2.5.1" @@ -9243,18 +9047,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/sdk@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/sdk@npm:2.3.3" - peerDependencies: - node-fetch: ^3.3.2 - peerDependenciesMeta: - node-fetch: - optional: true - checksum: 10c0/f1811971bad7a8732bc784c9a7c6af3b369871ddcb90dfbe14fc2271479ea3403541c44da2c46aa10b51dd4589cea4b92c7e904694f7210576c9346e12f9e883 - languageName: node - linkType: hard - "@module-federation/sdk@npm:2.5.1, @module-federation/sdk@npm:^2.3.3": version: 2.5.1 resolution: "@module-federation/sdk@npm:2.5.1" @@ -9267,16 +9059,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/third-party-dts-extractor@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/third-party-dts-extractor@npm:2.3.3" - dependencies: - find-pkg: "npm:2.0.0" - resolve: "npm:1.22.8" - checksum: 10c0/bc07e010d5f413ab3b5fd8bcd1c67cbc2d303e585ec1ac0e84842bfdf80495e69c195484864f199cfbd498300be2c464565d8d9c87228d59d21143728b9d0c5e - languageName: node - linkType: hard - "@module-federation/third-party-dts-extractor@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/third-party-dts-extractor@npm:2.5.1" @@ -9297,17 +9079,6 @@ __metadata: languageName: node linkType: hard -"@module-federation/webpack-bundler-runtime@npm:2.3.3": - version: 2.3.3 - resolution: "@module-federation/webpack-bundler-runtime@npm:2.3.3" - dependencies: - "@module-federation/error-codes": "npm:2.3.3" - "@module-federation/runtime": "npm:2.3.3" - "@module-federation/sdk": "npm:2.3.3" - checksum: 10c0/26c4c2a0f480ad08c6047f848a5bdc422db0c490fb772183f5858a1dc3f893097258e0a1c737a94665ba2b9c219073e5daadec1908d92c6d7a5dfa240a7c3245 - languageName: node - linkType: hard - "@module-federation/webpack-bundler-runtime@npm:2.5.1": version: 2.5.1 resolution: "@module-federation/webpack-bundler-runtime@npm:2.5.1" @@ -16803,7 +16574,7 @@ __metadata: "@material-ui/core": "npm:4.12.4" "@material-ui/icons": "npm:4.11.3" "@material-ui/lab": "npm:4.0.0-alpha.61" - "@module-federation/enhanced": "npm:2.3.3" + "@module-federation/enhanced": "npm:2.5.1" "@mui/icons-material": "npm:5.18.0" "@octokit/rest": "npm:19.0.13" "@red-hat-developer-hub/backstage-plugin-app-react": "npm:0.0.5" @@ -37997,21 +37768,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.18.0": - version: 8.18.0 - resolution: "ws@npm:8.18.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 - languageName: node - linkType: hard - "wsl-utils@npm:^0.1.0": version: 0.1.0 resolution: "wsl-utils@npm:0.1.0" From 2e2d7c5730801279ad08defb2fec16b4a4f0c919 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Mon, 20 Jul 2026 09:28:14 -0400 Subject: [PATCH 07/10] fix(ci): hermetic DynamicRoot translation and fetch mocks Export the translations mock as ESM and stub global fetch so init cannot hang on localhost in CI. Co-authored-by: Cursor --- .../src/components/DynamicRoot/DynamicRoot.test.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx b/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx index 220cb0a73d..978b90931a 100644 --- a/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx +++ b/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx @@ -120,6 +120,7 @@ jest.mock('@backstage/app-defaults', () => ({ // Avoid real network calls to backend.baseUrl (can hang on localhost in CI). jest.mock('../../utils/translations/fetchOverrideTranslations', () => ({ + __esModule: true, fetchOverrideTranslations: jest.fn().mockResolvedValue({}), })); @@ -166,6 +167,14 @@ const getDynamicApis = (createAppSpy: jest.SpyInstance) => describe('DynamicRoot', () => { beforeEach(() => { removeScalprum(); + // Belt-and-suspenders: DynamicRoot (and deps) must not hit a real backend. + jest.spyOn(global, 'fetch').mockImplementation(async () => + Promise.resolve({ + ok: false, + status: 404, + json: async () => ({}), + } as Response), + ); mockInitializeRemotePlugins.mockImplementation( (_, __, requiredModules: { scope: string; module: string }[]) => Promise.resolve({ @@ -226,6 +235,7 @@ describe('DynamicRoot', () => { afterEach(() => { consoleSpy.mockReset(); + jest.mocked(global.fetch).mockRestore(); }); it('should add plugins found in default module', async () => { From a33e46c050e8c18a00783eeff0088df6aa34ae05 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Mon, 20 Jul 2026 10:34:06 -0400 Subject: [PATCH 08/10] fix(ci): stop DynamicRoot tests hanging in async act() Use sync DynamicRoot import and testing-library render instead of renderWithEffects so background app promises cannot block the suite, and assert createApp via a shared module mock. Co-authored-by: Cursor --- .../DynamicRoot/DynamicRoot.test.tsx | 391 +++++++----------- 1 file changed, 152 insertions(+), 239 deletions(-) diff --git a/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx b/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx index 978b90931a..459665119d 100644 --- a/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx +++ b/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx @@ -1,4 +1,4 @@ -import { Fragment, lazy, Suspense, useContext } from 'react'; +import { Fragment, useContext } from 'react'; import * as useAsync from 'react-use/lib/useAsync'; import * as appDefaults from '@backstage/app-defaults'; @@ -13,15 +13,13 @@ import { createRouteRef, useApp, } from '@backstage/core-plugin-api'; -import { renderWithEffects } from '@backstage/test-utils'; import DynamicRootContext from '@red-hat-developer-hub/plugin-utils'; import { removeScalprum } from '@scalprum/core'; -import { waitFor, within } from '@testing-library/dom'; +import { render, waitFor, within } from '@testing-library/react'; import initializeRemotePlugins from '../../utils/dynamicUI/initializeRemotePlugins'; - -const DynamicRoot = lazy(() => import('./DynamicRoot')); +import DynamicRoot from './DynamicRoot'; const InnerPage = () => { const app = useApp(); @@ -76,21 +74,19 @@ const MockApp = ({ }: { dynamicPlugins: any; // allow tests to supply specific values for specific use cases }) => ( - - - Promise.resolve({ - default: () => { - return ; - }, - }) - } - dynamicPlugins={dynamicPlugins} - scalprumConfig={{}} - baseUrl="http://localhost:7007" - /> - + + Promise.resolve({ + default: () => { + return ; + }, + }) + } + dynamicPlugins={dynamicPlugins} + scalprumConfig={{}} + baseUrl="http://localhost:7007" + /> ); jest.mock('@scalprum/core', () => ({ @@ -113,10 +109,16 @@ jest.mock('react-use/lib/useAsync', () => ({ __esModule: true, })); -jest.mock('@backstage/app-defaults', () => ({ - ...jest.requireActual('@backstage/app-defaults'), - __esModule: true, -})); +jest.mock('@backstage/app-defaults', () => { + const actual = jest.requireActual('@backstage/app-defaults'); + return { + ...actual, + __esModule: true, + createApp: jest.fn((...args: unknown[]) => + actual.createApp(...(args as Parameters)), + ), + }; +}); // Avoid real network calls to backend.baseUrl (can hang on localhost in CI). jest.mock('../../utils/translations/fetchOverrideTranslations', () => ({ @@ -124,13 +126,13 @@ jest.mock('../../utils/translations/fetchOverrideTranslations', () => ({ fetchOverrideTranslations: jest.fn().mockResolvedValue({}), })); -const mockInitializeRemotePlugins = jest.fn() as jest.MockedFunction< - typeof initializeRemotePlugins ->; jest.mock('../../utils/dynamicUI/initializeRemotePlugins', () => ({ - default: mockInitializeRemotePlugins, + default: jest.fn(), __esModule: true, })); +const mockInitializeRemotePlugins = jest.requireMock( + '../../utils/dynamicUI/initializeRemotePlugins', +).default as jest.MockedFunction; const loadTestConfig = async (dynamicPlugins: any) => { process.env = { @@ -159,7 +161,7 @@ const consoleSpy = jest.spyOn(console, 'warn'); // createApp; this returns only the dynamic/custom APIs so assertions stay // focused on what the plugin config contributed. const FRAMEWORK_API_IDS = ['core.translation']; -const getDynamicApis = (createAppSpy: jest.SpyInstance) => +const getDynamicApis = (createAppSpy: jest.Mock) => [...(createAppSpy.mock.calls[0][0]?.apis ?? [])].filter( apiFactory => !FRAMEWORK_API_IDS.includes(apiFactory.api.id), ); @@ -167,6 +169,7 @@ const getDynamicApis = (createAppSpy: jest.SpyInstance) => describe('DynamicRoot', () => { beforeEach(() => { removeScalprum(); + (appDefaults.createApp as jest.Mock).mockClear(); // Belt-and-suspenders: DynamicRoot (and deps) must not hit a real backend. jest.spyOn(global, 'fetch').mockImplementation(async () => Promise.resolve({ @@ -239,32 +242,26 @@ describe('DynamicRoot', () => { }); it('should add plugins found in default module', async () => { - const createAppSpy = jest.spyOn(appDefaults, 'createApp'); + const createAppSpy = appDefaults.createApp as jest.Mock; const dynamicPlugins = { frontend: { 'foo.bar': {}, }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); - try { - await waitFor(async () => { - expect(rendered.baseElement).toBeInTheDocument(); - expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); - expect(createAppSpy).toHaveBeenCalled(); - expect( - createAppSpy.mock.calls[0][0]?.plugins?.map(p => p.getId()), - ).toEqual(['fooPlugin', 'fooPluginTarget']); - }); - } finally { - createAppSpy.mockRestore(); - } + const rendered = render(); + await waitFor(async () => { + expect(rendered.baseElement).toBeInTheDocument(); + expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); + expect(createAppSpy).toHaveBeenCalled(); + expect( + createAppSpy.mock.calls[0][0]?.plugins?.map(p => p.getId()), + ).toEqual(['fooPlugin', 'fooPluginTarget']); + }); }); it('should add plugins found in specified module', async () => { - const createAppSpy = jest.spyOn(appDefaults, 'createApp'); + const createAppSpy = appDefaults.createApp as jest.Mock; const dynamicPlugins = { frontend: { 'foo.bar': { @@ -273,21 +270,15 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); - try { - await waitFor(async () => { - expect(rendered.baseElement).toBeInTheDocument(); - expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); - expect(createAppSpy).toHaveBeenCalled(); - expect( - createAppSpy.mock.calls[0][0]?.plugins?.map(p => p.getId()), - ).toEqual(['barPlugin']); - }); - } finally { - createAppSpy.mockRestore(); - } + const rendered = render(); + await waitFor(async () => { + expect(rendered.baseElement).toBeInTheDocument(); + expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); + expect(createAppSpy).toHaveBeenCalled(); + expect( + createAppSpy.mock.calls[0][0]?.plugins?.map(p => p.getId()), + ).toEqual(['barPlugin']); + }); }); it('should render with one dynamicRoute', async () => { @@ -297,9 +288,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -318,9 +307,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -339,9 +326,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -363,9 +348,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -387,9 +370,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -416,9 +397,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -443,9 +422,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -471,9 +448,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -500,9 +475,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -529,9 +502,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -557,9 +528,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -585,9 +554,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -611,9 +578,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -632,9 +597,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -658,9 +621,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -682,9 +643,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -711,9 +670,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -732,9 +689,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -751,9 +706,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -773,9 +726,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -789,7 +740,7 @@ describe('DynamicRoot', () => { }); it('should bind routes on routeBindings target', async () => { - const createAppSpy = jest.spyOn(appDefaults, 'createApp'); + const createAppSpy = appDefaults.createApp as jest.Mock; const dynamicPlugins = { frontend: { 'foo.bar': { @@ -809,37 +760,31 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); - try { - await waitFor(async () => { - expect(rendered.baseElement).toBeInTheDocument(); - expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); - expect(createAppSpy).toHaveBeenCalled(); - const bindResult: Record = {}; - const bindFunc: AppRouteBinder = (externalRoutes, targetRoutes) => { - bindResult.externalRoutes = externalRoutes; - bindResult.targetRoutes = targetRoutes; - }; - createAppSpy.mock.calls[0][0]?.bindRoutes?.({ bind: bindFunc }); - expect(bindResult).toEqual({ - externalRoutes: { - barTarget: createExternalRouteRef({ id: 'bar', optional: true }), - }, - targetRoutes: { barTarget: createRouteRef({ id: 'bar' }) }, - }); - expect( - createAppSpy.mock.calls[0][0]?.plugins?.map(p => p.getId()), - ).toEqual(['fooPlugin', 'fooPluginTarget']); + const rendered = render(); + await waitFor(async () => { + expect(rendered.baseElement).toBeInTheDocument(); + expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); + expect(createAppSpy).toHaveBeenCalled(); + const bindResult: Record = {}; + const bindFunc: AppRouteBinder = (externalRoutes, targetRoutes) => { + bindResult.externalRoutes = externalRoutes; + bindResult.targetRoutes = targetRoutes; + }; + createAppSpy.mock.calls[0][0]?.bindRoutes?.({ bind: bindFunc }); + expect(bindResult).toEqual({ + externalRoutes: { + barTarget: createExternalRouteRef({ id: 'bar', optional: true }), + }, + targetRoutes: { barTarget: createRouteRef({ id: 'bar' }) }, }); - } finally { - createAppSpy.mockRestore(); - } + expect( + createAppSpy.mock.calls[0][0]?.plugins?.map(p => p.getId()), + ).toEqual(['fooPlugin', 'fooPluginTarget']); + }); }); it('should bind routes on routeBindings target with a custom name', async () => { - const createAppSpy = jest.spyOn(appDefaults, 'createApp'); + const createAppSpy = appDefaults.createApp as jest.Mock; const dynamicPlugins = { frontend: { 'foo.bar': { @@ -862,30 +807,24 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); - try { - await waitFor(async () => { - expect(rendered.baseElement).toBeInTheDocument(); - expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); - expect(createAppSpy).toHaveBeenCalled(); - const bindResult: Record = {}; - const bindFunc: AppRouteBinder = (externalRoutes, targetRoutes) => { - bindResult.externalRoutes = externalRoutes; - bindResult.targetRoutes = targetRoutes; - }; - createAppSpy.mock.calls[0][0]?.bindRoutes?.({ bind: bindFunc }); - expect(bindResult).toEqual({ - externalRoutes: { - barTarget: createExternalRouteRef({ id: 'bar', optional: true }), - }, - targetRoutes: { barTarget: createRouteRef({ id: 'bar' }) }, - }); + const rendered = render(); + await waitFor(async () => { + expect(rendered.baseElement).toBeInTheDocument(); + expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); + expect(createAppSpy).toHaveBeenCalled(); + const bindResult: Record = {}; + const bindFunc: AppRouteBinder = (externalRoutes, targetRoutes) => { + bindResult.externalRoutes = externalRoutes; + bindResult.targetRoutes = targetRoutes; + }; + createAppSpy.mock.calls[0][0]?.bindRoutes?.({ bind: bindFunc }); + expect(bindResult).toEqual({ + externalRoutes: { + barTarget: createExternalRouteRef({ id: 'bar', optional: true }), + }, + targetRoutes: { barTarget: createRouteRef({ id: 'bar' }) }, }); - } finally { - createAppSpy.mockRestore(); - } + }); }); it('should not bind routes on routeBindings target with nonexistent importName', async () => { @@ -910,9 +849,7 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); + const rendered = render(); await waitFor(async () => { expect(rendered.baseElement).toBeInTheDocument(); expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); @@ -923,7 +860,7 @@ describe('DynamicRoot', () => { }); it('should add custom ApiFactory', async () => { - const createAppSpy = jest.spyOn(appDefaults, 'createApp'); + const createAppSpy = appDefaults.createApp as jest.Mock; const dynamicPlugins = { frontend: { 'foo.bar': { @@ -932,26 +869,20 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); - try { - await waitFor(async () => { - expect(rendered.baseElement).toBeInTheDocument(); - expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); - expect(createAppSpy).toHaveBeenCalled(); + const rendered = render(); + await waitFor(async () => { + expect(rendered.baseElement).toBeInTheDocument(); + expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); + expect(createAppSpy).toHaveBeenCalled(); - const resolvedApis = getDynamicApis(createAppSpy); - expect(resolvedApis.length).toEqual(1); - expect(resolvedApis[0].api.id).toEqual('plugin.foo.service'); - }); - } finally { - createAppSpy.mockRestore(); - } + const resolvedApis = getDynamicApis(createAppSpy); + expect(resolvedApis.length).toEqual(1); + expect(resolvedApis[0].api.id).toEqual('plugin.foo.service'); + }); }); it('should not add custom ApiFactory with nonexistent importName', async () => { - const createAppSpy = jest.spyOn(appDefaults, 'createApp'); + const createAppSpy = appDefaults.createApp as jest.Mock; const dynamicPlugins = { frontend: { 'foo.bar': { @@ -960,25 +891,19 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); - try { - await waitFor(async () => { - expect(rendered.baseElement).toBeInTheDocument(); - expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); - expect(createAppSpy).toHaveBeenCalled(); + const rendered = render(); + await waitFor(async () => { + expect(rendered.baseElement).toBeInTheDocument(); + expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); + expect(createAppSpy).toHaveBeenCalled(); - const resolvedApis = getDynamicApis(createAppSpy); - expect(resolvedApis.length).toEqual(0); - }); - } finally { - createAppSpy.mockRestore(); - } + const resolvedApis = getDynamicApis(createAppSpy); + expect(resolvedApis.length).toEqual(0); + }); }); it('should not add custom ApiFactory with nonexistent module', async () => { - const createAppSpy = jest.spyOn(appDefaults, 'createApp'); + const createAppSpy = appDefaults.createApp as jest.Mock; const dynamicPlugins = { frontend: { 'foo.bar': { @@ -987,25 +912,19 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); - try { - await waitFor(async () => { - expect(rendered.baseElement).toBeInTheDocument(); - expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); - expect(createAppSpy).toHaveBeenCalled(); + const rendered = render(); + await waitFor(async () => { + expect(rendered.baseElement).toBeInTheDocument(); + expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); + expect(createAppSpy).toHaveBeenCalled(); - const resolvedApis = getDynamicApis(createAppSpy); - expect(resolvedApis.length).toEqual(0); - }); - } finally { - createAppSpy.mockRestore(); - } + const resolvedApis = getDynamicApis(createAppSpy); + expect(resolvedApis.length).toEqual(0); + }); }); it('should add custom AnalyticsApi extension', async () => { - const createAppSpy = jest.spyOn(appDefaults, 'createApp'); + const createAppSpy = appDefaults.createApp as jest.Mock; const dynamicPlugins = { frontend: { 'foo.bar': { @@ -1014,23 +933,17 @@ describe('DynamicRoot', () => { }, }; await loadTestConfig(dynamicPlugins); - const rendered = await renderWithEffects( - , - ); - try { - await waitFor(async () => { - expect(rendered.baseElement).toBeInTheDocument(); - expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); - expect(createAppSpy).toHaveBeenCalled(); + const rendered = render(); + await waitFor(async () => { + expect(rendered.baseElement).toBeInTheDocument(); + expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); + expect(createAppSpy).toHaveBeenCalled(); - const resolvedApis = getDynamicApis(createAppSpy); - expect(resolvedApis.length).toEqual(1); - // Analytics extensions are wrapped into a MultipleAnalyticsApi - // registered under analyticsApiRef, not the plugin's own api id. - expect(resolvedApis[0].api.id).toEqual(analyticsApiRef.id); - }); - } finally { - createAppSpy.mockRestore(); - } + const resolvedApis = getDynamicApis(createAppSpy); + expect(resolvedApis.length).toEqual(1); + // Analytics extensions are wrapped into a MultipleAnalyticsApi + // registered under analyticsApiRef, not the plugin's own api id. + expect(resolvedApis[0].api.id).toEqual(analyticsApiRef.id); + }); }); }); From 0969e28458e5e930eca654a1519edf1676004558 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Mon, 20 Jul 2026 11:12:51 -0400 Subject: [PATCH 09/10] fix(ci): type createApp plugin map callbacks in DynamicRoot tests Restore explicit parameter types so packages/app tsc passes under noImplicitAny after switching to a jest.Mock createApp spy. Co-authored-by: Cursor --- .../src/components/DynamicRoot/DynamicRoot.test.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx b/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx index 459665119d..74177d44ee 100644 --- a/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx +++ b/packages/app/src/components/DynamicRoot/DynamicRoot.test.tsx @@ -255,7 +255,9 @@ describe('DynamicRoot', () => { expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); expect(createAppSpy).toHaveBeenCalled(); expect( - createAppSpy.mock.calls[0][0]?.plugins?.map(p => p.getId()), + createAppSpy.mock.calls[0][0]?.plugins?.map( + (p: { getId: () => string }) => p.getId(), + ), ).toEqual(['fooPlugin', 'fooPluginTarget']); }); }); @@ -276,7 +278,9 @@ describe('DynamicRoot', () => { expect(rendered.getByTestId('isLoadingFinished')).toBeInTheDocument(); expect(createAppSpy).toHaveBeenCalled(); expect( - createAppSpy.mock.calls[0][0]?.plugins?.map(p => p.getId()), + createAppSpy.mock.calls[0][0]?.plugins?.map( + (p: { getId: () => string }) => p.getId(), + ), ).toEqual(['barPlugin']); }); }); @@ -778,7 +782,9 @@ describe('DynamicRoot', () => { targetRoutes: { barTarget: createRouteRef({ id: 'bar' }) }, }); expect( - createAppSpy.mock.calls[0][0]?.plugins?.map(p => p.getId()), + createAppSpy.mock.calls[0][0]?.plugins?.map( + (p: { getId: () => string }) => p.getId(), + ), ).toEqual(['fooPlugin', 'fooPluginTarget']); }); }); From 40edf41a691aea20ebd95b5e916849938b72bf72 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Fri, 24 Jul 2026 14:16:52 -0400 Subject: [PATCH 10/10] chore(app-next): bump homepage to 1.16.0 for NFS local testing Keep static homePageModule until RHIDP-14519 promotes NFS to stable; document local MF export path using rhdh-plugins main default alpha export. Co-authored-by: Cursor --- packages/app-next/README.md | 22 +++++++++---------- .../app-next/dynamic-plugins.example.yaml | 10 +++++---- packages/app-next/package.json | 2 +- packages/app-next/src/App.tsx | 6 ++--- yarn.lock | 21 +++++++++--------- 5 files changed, 31 insertions(+), 30 deletions(-) diff --git a/packages/app-next/README.md b/packages/app-next/README.md index c6cb7a7c00..85c9615cce 100644 --- a/packages/app-next/README.md +++ b/packages/app-next/README.md @@ -6,7 +6,7 @@ This package is the Red Hat Developer Hub (RHDH) **NFS** (New Frontend System) a Most RHDH product UX loads as **dynamic plugins** (sign-in via **app-auth**, global-header, quickstart, …) so those pieces stay swappable — see [`dynamic-plugins.example.yaml`](./dynamic-plugins.example.yaml). -**Homepage exception (temporary):** published OCI homepage overlays are still OFS-shaped for NFS, so this shell statically mounts RHDH `homePageModule` so `/` works for local NFS verification (including homepage cards such as unread notifications). Prefer loading homepage via MF when an NFS-capable overlay exists, or use the [local export](#local-nfs-export-homepage--theme) path below. +**Homepage exception (temporary):** published OCI homepage overlays are still OFS-shaped for NFS, so this shell statically mounts RHDH `homePageModule` (`@red-hat-developer-hub/backstage-plugin-homepage@1.16.0`) so `/` works for local NFS verification (including homepage cards such as unread notifications). Full DP-first homepage is tracked in [RHIDP-14519](https://redhat.atlassian.net/browse/RHIDP-14519) (promote NFS from `/alpha` to stable). Until then, use the [local export](#local-nfs-export-homepage--theme) path to exercise homepage via Module Federation. ## Prerequisites @@ -180,21 +180,18 @@ Then open `/` and confirm the unread notifications card on the grid. ## Local NFS export (homepage & theme) -Use this when you need to iterate on homepage/theme from [rhdh-plugins](https://github.com/redhat-developer/rhdh-plugins) as MF remotes (closer to the long-term DP-first model). Full NFS plugin migration is tracked separately; this is the local workaround until overlays ship NFS `alpha`. +Use this when you need to iterate on homepage/theme from [rhdh-plugins](https://github.com/redhat-developer/rhdh-plugins) as MF remotes (closer to the long-term DP-first model tracked in [RHIDP-14519](https://redhat.atlassian.net/browse/RHIDP-14519)). -**Prerequisite — `alpha` must default-export a `FrontendFeature`.** Backstage’s MF remote build only exposes non-`.` package entry points (including `./alpha`) when the default export is a frontend feature. Homepage/theme currently ship NFS pieces as **named** exports only (`homePageModule`, `rhdhThemeModule`), so a plain export produces expose `.` only. +**Homepage (`./alpha`):** `rhdh-plugins` `main` already `export default homePageModule` (see [rhdh-plugins#3794](https://github.com/redhat-developer/rhdh-plugins/pull/3794)), so a local export emits MF expose `alpha`. Published npm **1.16.0** does **not** include that default yet — use `main` (or upcoming **1.16.1+**) for local NFS MF tests. -In your local `rhdh-plugins` tree, add a temporary default (or land this in the NFS migration epic): +**Theme:** still needs a temporary default on `./alpha` until theme ships the same pattern: ```ts -// workspaces/homepage/plugins/homepage/src/alpha/index.ts -export default homePageModule; - // workspaces/theme/plugins/theme/src/alpha/index.ts export default rhdhThemeModule; ``` -Then: +Export: ```bash # from rhdh-plugins (install/build the workspace once if needed) @@ -213,7 +210,7 @@ npx -y @red-hat-developer-hub/cli plugin export --clean --dev \ ```bash python3 -c "import json; m=json.load(open('dynamic-plugins-root/red-hat-developer-hub-backstage-plugin-homepage/dist/mf-manifest.json')); print([e['name'] for e in m['exposes']])" -# expect: ['.', 'alpha'] +# expect: ['.', 'alpha'] (alpha requires default export of homePageModule) ``` **When using the local homepage remote:** remove the static `homePageModule` import from `src/App.tsx` (keep `homePlugin`), rebuild app-next, and restart `start:next`. Keep homepage/theme OCI entries commented so install does not overwrite your export. @@ -241,15 +238,15 @@ Static features in `src/App.tsx`: ### Temporary: static `homePageModule` -Published OCI homepage overlays are still **OFS-shaped** (MF expose is only `.`, default is not a `FrontendFeature`). The NFS loader skips them. +Published OCI homepage overlays are still **OFS-shaped** (MF expose is only `.`; NFS lives under `/alpha` until [RHIDP-14519](https://redhat.atlassian.net/browse/RHIDP-14519)). The NFS loader skips OFS `.` remotes. Until an NFS-capable overlay ships (or you use a [local NFS export](#local-nfs-export-homepage--theme)): 1. Keep `@backstage/plugin-home` (`homePlugin`) in the shell — host for `pluginId: 'home'` widgets. -2. Keep `homePageModule` from `@red-hat-developer-hub/backstage-plugin-homepage/alpha` static so `/` works for team verification without patching `rhdh-plugins`. +2. Keep `homePageModule` from `@red-hat-developer-hub/backstage-plugin-homepage/alpha` (**1.16.0**) static so `/` works for team verification without a local export. 3. Leave homepage (and theme) OCI entries commented in [`dynamic-plugins.example.yaml`](./dynamic-plugins.example.yaml). -**Removal:** when a published NFS overlay works via MF, delete the static `homePageModule` import, enable the OCI entry, and rely on `rhdhDynamicFrontendFeaturesLoader`. +**Removal (after RHIDP-14519 + NFS OCI):** delete the static `homePageModule` import, enable the OCI entry, and rely on `rhdhDynamicFrontendFeaturesLoader`. ### Temporary helper: `rhdhDynamicFrontendFeaturesLoader` @@ -270,5 +267,6 @@ Then delete `src/modules/dynamicFeatures/` (loader + `collectLoadableFeatures` h ## Related documentation - [Backstage new frontend system](https://backstage.io/docs/frontend-system/architecture/index) +- [RHIDP-14519](https://redhat.atlassian.net/browse/RHIDP-14519) — promote homepage NFS from `/alpha` to stable - [app-defaults: app-auth / app-integrations](https://github.com/redhat-developer/rhdh-plugins/tree/main/workspaces/app-defaults) — intended to load dynamically into RHDH, not statically into this shell - [rhdh-plugin-export-overlays default.packages.yaml](https://github.com/redhat-developer/rhdh-plugin-export-overlays/blob/main/default.packages.yaml) diff --git a/packages/app-next/dynamic-plugins.example.yaml b/packages/app-next/dynamic-plugins.example.yaml index 581f74e810..91d4d00ebc 100644 --- a/packages/app-next/dynamic-plugins.example.yaml +++ b/packages/app-next/dynamic-plugins.example.yaml @@ -36,10 +36,12 @@ plugins: # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-theme:next__0.14.5!red-hat-developer-hub-backstage-plugin-theme # disabled: false - # Homepage — OCI still OFS-shaped. app-next mounts homePageModule statically so - # NFS / works for card verification. Do not enable this OCI tag (overwrites a - # local homepage export). See README → Testing homepage cards / Local NFS export. - # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-homepage:pr_2644__1.15.0!red-hat-developer-hub-backstage-plugin-homepage + # Homepage — published OCI tags are still OFS-shaped for NFS (expose `.` only). + # app-next mounts homePageModule@1.16.0 statically so / works. Do not enable + # OCI here until RHIDP-14519 + an NFS overlay (mf-manifest exposes `alpha` or + # stable `.`). Local export: README → Local NFS export. Prefer pr_/bs_ tags + # with homepage >= 1.16.1 once published. + # - package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-homepage:bs_1.52.0__1.15.0!red-hat-developer-hub-backstage-plugin-homepage # disabled: false # Global header (@red-hat-developer-hub/backstage-plugin-global-header) diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 3732caac2e..3a5eda6619 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -80,7 +80,7 @@ "@mui/icons-material": "5.18.0", "@octokit/rest": "19.0.13", "@red-hat-developer-hub/backstage-plugin-app-react": "0.0.5", - "@red-hat-developer-hub/backstage-plugin-homepage": "1.15.0", + "@red-hat-developer-hub/backstage-plugin-homepage": "1.16.0", "history": "5.3.0", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index da3f4d152d..37baf6a829 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -20,9 +20,9 @@ import { rhdhDynamicFrontendFeaturesLoader } from './modules/dynamicFeatures/rhd // are registered too. // // Homepage: `@backstage/plugin-home` is the NFS host (pluginId `home`) for -// RHDH layout and third-party cards (e.g. unread notifications). OCI homepage -// overlays are still OFS-shaped for NFS, so keep homePageModule static until an -// NFS overlay exists or a local rhdh-plugins export is used (see README). +// RHDH layout and third-party cards (e.g. unread notifications). Keep +// homePageModule static until RHIDP-14519 promotes NFS to stable `.` and an +// NFS-capable OCI overlay exists (or use a local rhdh-plugins export — README). const app = createApp({ features: [ navModule, diff --git a/yarn.lock b/yarn.lock index 5a53676757..2d4f2b7102 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11975,18 +11975,18 @@ __metadata: languageName: node linkType: hard -"@red-hat-developer-hub/backstage-plugin-homepage-common@npm:^0.2.1": - version: 0.2.1 - resolution: "@red-hat-developer-hub/backstage-plugin-homepage-common@npm:0.2.1" +"@red-hat-developer-hub/backstage-plugin-homepage-common@npm:^0.3.0": + version: 0.3.0 + resolution: "@red-hat-developer-hub/backstage-plugin-homepage-common@npm:0.3.0" dependencies: "@backstage/plugin-permission-common": "npm:^0.9.9" - checksum: 10c0/1a2aec14e52e8d021c57b93bf25ee9931ecc816991831655e275e365aec7b52d36fbd6e358212526b75ec59dc917e6fb5e4a237e92ba84b0859caafb791cf49c + checksum: 10c0/c3413a6b7d8fa1c3da879a5c05aec4d714034ccacd915d551a914a1e16aad8de76ca1e18a5dd84b4ef74c541efb04fbf5eddbca34090157787490154c846f6a6 languageName: node linkType: hard -"@red-hat-developer-hub/backstage-plugin-homepage@npm:1.15.0": - version: 1.15.0 - resolution: "@red-hat-developer-hub/backstage-plugin-homepage@npm:1.15.0" +"@red-hat-developer-hub/backstage-plugin-homepage@npm:1.16.0": + version: 1.16.0 + resolution: "@red-hat-developer-hub/backstage-plugin-homepage@npm:1.16.0" dependencies: "@backstage/catalog-client": "npm:^1.15.1" "@backstage/catalog-model": "npm:^1.9.0" @@ -12004,14 +12004,15 @@ __metadata: "@mui/icons-material": "npm:5.18.0" "@mui/material": "npm:5.18.0" "@mui/styles": "npm:5.18.0" - "@red-hat-developer-hub/backstage-plugin-homepage-common": "npm:^0.2.1" + "@red-hat-developer-hub/backstage-plugin-homepage-common": "npm:^0.3.0" "@scalprum/react-core": "npm:0.11.3" react-grid-layout: "npm:1.5.3" react-use: "npm:17.6.1" peerDependencies: react: 16.13.1 || ^17.0.0 || ^18.2.0 + react-dom: "*" react-router-dom: 6.30.4 - checksum: 10c0/4dd37495b05c4c5c955e69953ae3a5507aba2bb019fa543dc018dc05548114da629803ab457e889e59287e2d8318e8b5b84b23f3257afae3185da4f3da39cb43 + checksum: 10c0/1a68c580849beb6d2cdb3c4998f807eaaf7dcefcd94a85dad7cbe754cc0dee79eaf0d67bb17bd2e528ed3b5fbb68f38cff12525fdb2a6944495c7b2787aee2d9 languageName: node linkType: hard @@ -16578,7 +16579,7 @@ __metadata: "@mui/icons-material": "npm:5.18.0" "@octokit/rest": "npm:19.0.13" "@red-hat-developer-hub/backstage-plugin-app-react": "npm:0.0.5" - "@red-hat-developer-hub/backstage-plugin-homepage": "npm:1.15.0" + "@red-hat-developer-hub/backstage-plugin-homepage": "npm:1.16.0" "@testing-library/dom": "npm:9.3.4" "@testing-library/jest-dom": "npm:6.9.1" "@testing-library/react": "npm:14.3.1"