diff --git a/.rhdh/docker/Dockerfile b/.rhdh/docker/Dockerfile index 077ea9e100..903e4c4d88 100644 --- a/.rhdh/docker/Dockerfile +++ b/.rhdh/docker/Dockerfile @@ -74,6 +74,7 @@ COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/roadiehq-backstage-plugin- COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-marketplace/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-marketplace/package.json COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-marketplace-backend-dynamic/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-marketplace-backend-dynamic/package.json COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json +COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/package.json COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-dynamic-home-page/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-dynamic-home-page/package.json COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-catalog-backend-module-marketplace-dynamic/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-catalog-backend-module-marketplace-dynamic/package.json COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-bulk-import/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-bulk-import/package.json diff --git a/app-config.dynamic-plugins.yaml b/app-config.dynamic-plugins.yaml index 555ac814fb..a5bf7354ca 100644 --- a/app-config.dynamic-plugins.yaml +++ b/app-config.dynamic-plugins.yaml @@ -258,6 +258,17 @@ dynamicPlugins: config: layout: position: above-main-content + red-hat-developer-hub.backstage-plugin-global-floating-action-button: + mountPoints: + - mountPoint: application/listener + importName: DynamicGlobalFloatingActionButton + - mountPoint: global.floatingactionbutton/component + importName: NullComponent + config: + icon: github + label: Git + toolTip: Github + to: https://github.com/redhat-developer/rhdh red-hat-developer-hub.backstage-plugin-dynamic-home-page: dynamicRoutes: - path: / diff --git a/docker/Dockerfile b/docker/Dockerfile index f1651eb9ea..d7d3fdb63d 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -75,6 +75,7 @@ COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/roadiehq-backstage-plugin- COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-marketplace/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-marketplace/package.json COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-marketplace-backend-dynamic/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-marketplace-backend-dynamic/package.json COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json +COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/package.json COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-dynamic-home-page/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-dynamic-home-page/package.json COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-catalog-backend-module-marketplace-dynamic/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-catalog-backend-module-marketplace-dynamic/package.json COPY $EXTERNAL_SOURCE_NESTED/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-bulk-import/package.json ./dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-bulk-import/package.json diff --git a/docs/dynamic-plugins/frontend-plugin-wiring.md b/docs/dynamic-plugins/frontend-plugin-wiring.md index 90e587a97d..e0ac379f28 100644 --- a/docs/dynamic-plugins/frontend-plugin-wiring.md +++ b/docs/dynamic-plugins/frontend-plugin-wiring.md @@ -400,6 +400,42 @@ Each global header entry requires the following attributes: Users can configure multiple global headers at different positions by adding entries to the `mountPoints` field. +### Adding application listeners + +The users can add application listeners using the `application/listener` mount point. Below is an example that uses the aforesaid mount point: + +```yaml +# app-config.yaml +dynamicPlugins: + frontend: + <package_name>: # plugin_package_name same as `scalprum.name` key in plugin's `package.json` + mountPoints: + - mountPoint: application/listener + importName: <exported listener component> +``` + +Users can configure multiple application listeners by adding entries to the `mountPoints` field. + +### Adding application providers + +The users can add application providers using the `application/provider` mount point. Below is an example that uses the aforesaid mount point to configure a context provider: + +```yaml +# app-config.yaml +dynamicPlugins: + frontend: + <package_name>: # plugin_package_name same as `scalprum.name` key in plugin's `package.json` + dynamicRoutes: + - path: /<route> + importName: Component # Component you want to load on the route + mountPoints: + - mountPoint: application/provider + importName: <exported provider component> +``` + +Users can configure multiple application providers by adding entries to the `mountPoints` field. + + ## Customizing and Adding Entity tabs Out of the box the frontend system provides an opinionated set of tabs for catalog entity views. This set of tabs can be further customized and extended as needed via the `entityTabs` configuration: diff --git a/dynamic-plugins.default.yaml b/dynamic-plugins.default.yaml index d78902cdbd..7386b27d1b 100644 --- a/dynamic-plugins.default.yaml +++ b/dynamic-plugins.default.yaml @@ -536,6 +536,24 @@ plugins: layout: position: above-main-content + # Group: Global floating action button + - package: ./dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-global-floating-action-button + disabled: true + pluginConfig: + dynamicPlugins: + frontend: + red-hat-developer-hub.backstage-plugin-global-floating-action-button: + mountPoints: + - mountPoint: application/listener + importName: DynamicGlobalFloatingActionButton + - mountPoint: global.floatingactionbutton/component + importName: NullComponent + config: + icon: github + label: 'Git' + toolTip: 'Github' + to: https://github.com/redhat-developer/rhdh + # Homepage - package: ./dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-dynamic-home-page disabled: false diff --git a/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/.eslintignore b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/.eslintignore new file mode 100644 index 0000000000..55289f4a23 --- /dev/null +++ b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/.eslintignore @@ -0,0 +1,2 @@ +dist-dynamic +dist-scalprum diff --git a/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/.eslintrc.js b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/.eslintrc.js new file mode 100644 index 0000000000..958d722cb2 --- /dev/null +++ b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require("@backstage/cli/config/eslint-factory")(__dirname); diff --git a/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/package.json b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/package.json new file mode 100644 index 0000000000..42e73d2075 --- /dev/null +++ b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/package.json @@ -0,0 +1,61 @@ +{ + "name": "red-hat-developer-hub-backstage-plugin-global-floating-action-button", + "version": "0.0.6", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "frontend-plugin", + "supported-versions": "1.35.0", + "pluginId": "red-hat-developer-hub-backstage-plugin-global-floating-action-button", + "pluginPackages": [ + "red-hat-developer-hub-backstage-plugin-global-floating-action-button" + ] + }, + "sideEffects": false, + "scripts": { + "tsc": "tsc", + "build": "backstage-cli package build", + "lint:check": "backstage-cli package lint", + "test": "backstage-cli package test --passWithNoTests --coverage", + "clean": "backstage-cli package clean", + "export-dynamic": "janus-cli package export-dynamic-plugin --in-place", + "export-dynamic:clean": "run export-dynamic --clean" + }, + "dependencies": { + "@mui/material": "5.16.14", + "@red-hat-developer-hub/backstage-plugin-global-floating-action-button": "0.0.6" + }, + "devDependencies": { + "@backstage/cli": "0.29.5", + "@janus-idp/cli": "3.0.0", + "typescript": "5.7.3" + }, + "scalprum": { + "name": "red-hat-developer-hub.backstage-plugin-global-floating-action-button", + "exposedModules": { + "PluginRoot": "./src/index.ts" + } + }, + "files": [ + "dist", + "dist-scalprum" + ], + "keywords": [ + "backstage", + "plugin" + ], + "repository": { + "type": "git", + "url": "https://github.com/redhat-developer/rhdh", + "directory": "dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button" + }, + "author": "Red Hat", + "homepage": "https://red.ht/rhdh", + "bugs": "https://issues.redhat.com/browse/RHIDP" +} diff --git a/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/src/index.ts b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/src/index.ts new file mode 100644 index 0000000000..666086b6a3 --- /dev/null +++ b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/src/index.ts @@ -0,0 +1,9 @@ +import { unstable_ClassNameGenerator as ClassNameGenerator } from "@mui/material/className"; + +ClassNameGenerator.configure((componentName) => { + return componentName.startsWith("v5-") + ? componentName + : `v5-${componentName}`; +}); + +export * from "@red-hat-developer-hub/backstage-plugin-global-floating-action-button"; diff --git a/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/tsconfig.json b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/tsconfig.json new file mode 100644 index 0000000000..040da5f1bb --- /dev/null +++ b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@backstage/cli/config/tsconfig.json", + "include": ["src", "dev", "migrations"], + "exclude": ["node_modules"], + "compilerOptions": { + "outDir": "../../../dist-types/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button", + "rootDir": "." + } +} diff --git a/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/turbo.json b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/turbo.json new file mode 100644 index 0000000000..4fd8ddbc9c --- /dev/null +++ b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/turbo.json @@ -0,0 +1,10 @@ +{ + "extends": ["//"], + "tasks": { + "tsc": { + "outputs": [ + "../../../dist-types/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button/**" + ] + } + } +} diff --git a/packages/app/src/components/AppBase/AppBase.tsx b/packages/app/src/components/AppBase/AppBase.tsx index 62ea3365b0..3e0c525793 100644 --- a/packages/app/src/components/AppBase/AppBase.tsx +++ b/packages/app/src/components/AppBase/AppBase.tsx @@ -24,6 +24,8 @@ import { entityPage } from '../catalog/EntityPage'; import DynamicRootContext from '../DynamicRoot/DynamicRootContext'; import { LearningPaths } from '../learningPaths/LearningPathsPage'; import { Root } from '../Root'; +import { ApplicationListener } from '../Root/ApplicationListener'; +import { ApplicationProvider } from '../Root/ApplicationProvider'; import ConfigUpdater from '../Root/ConfigUpdater'; import { SearchPage } from '../search/SearchPage'; import { settingsPage } from '../UserSettings/SettingsPages'; @@ -74,66 +76,69 @@ const AppBase = () => { <OAuthRequestDialog /> <AppRouter> <ConfigUpdater /> + <ApplicationListener /> <Root> - <FlatRoutes> - <Route - path="/catalog" - element={ - <CatalogIndexPage pagination columns={myCustomColumnsFunc} /> - } - /> - <Route - path="/catalog/:namespace/:kind/:name" - element={<CatalogEntityPage />} - > - {entityPage(entityTabOverrides)} - </Route> - <Route - path="/create" - element={ - <ScaffolderPage - headerOptions={{ title: 'Software Templates' }} - /> - } - > - <ScaffolderFieldExtensions> - {scaffolderFieldExtensions.map( - ({ scope, module, importName, Component }) => ( - <Component key={`${scope}-${module}-${importName}`} /> - ), - )} - </ScaffolderFieldExtensions> - scaffolderFieldExtensions - </Route> - <Route path="/api-docs" element={<ApiExplorerPage />} /> - <Route - path="/catalog-import" - element={ - <RequirePermission permission={catalogEntityCreatePermission}> - <CatalogImportPage /> - </RequirePermission> - } - /> - <Route path="/search" element={<BackstageSearchPage />}> - <SearchPage /> - </Route> - <Route path="/settings" element={<UserSettingsPage />}> - {settingsPage} - </Route> - <Route path="/catalog-graph" element={<CatalogGraphPage />} /> - <Route path="/learning-paths" element={<LearningPaths />} /> - {dynamicRoutes.map( - ({ Component, staticJSXContent, path, config: { props } }) => ( - <Route - key={path} - path={path} - element={<Component {...props} />} - > - {staticJSXContent} - </Route> - ), - )} - </FlatRoutes> + <ApplicationProvider> + <FlatRoutes> + <Route + path="/catalog" + element={ + <CatalogIndexPage pagination columns={myCustomColumnsFunc} /> + } + /> + <Route + path="/catalog/:namespace/:kind/:name" + element={<CatalogEntityPage />} + > + {entityPage(entityTabOverrides)} + </Route> + <Route + path="/create" + element={ + <ScaffolderPage + headerOptions={{ title: 'Software Templates' }} + /> + } + > + <ScaffolderFieldExtensions> + {scaffolderFieldExtensions.map( + ({ scope, module, importName, Component }) => ( + <Component key={`${scope}-${module}-${importName}`} /> + ), + )} + </ScaffolderFieldExtensions> + scaffolderFieldExtensions + </Route> + <Route path="/api-docs" element={<ApiExplorerPage />} /> + <Route + path="/catalog-import" + element={ + <RequirePermission permission={catalogEntityCreatePermission}> + <CatalogImportPage /> + </RequirePermission> + } + /> + <Route path="/search" element={<BackstageSearchPage />}> + <SearchPage /> + </Route> + <Route path="/settings" element={<UserSettingsPage />}> + {settingsPage} + </Route> + <Route path="/catalog-graph" element={<CatalogGraphPage />} /> + <Route path="/learning-paths" element={<LearningPaths />} /> + {dynamicRoutes.map( + ({ Component, staticJSXContent, path, config: { props } }) => ( + <Route + key={path} + path={path} + element={<Component {...props} />} + > + {staticJSXContent} + </Route> + ), + )} + </FlatRoutes> + </ApplicationProvider> </Root> </AppRouter> </AppProvider> diff --git a/packages/app/src/components/Root/ApplicationListener.tsx b/packages/app/src/components/Root/ApplicationListener.tsx new file mode 100644 index 0000000000..94199a2f09 --- /dev/null +++ b/packages/app/src/components/Root/ApplicationListener.tsx @@ -0,0 +1,20 @@ +import { useContext } from 'react'; + +import { ErrorBoundary } from '@backstage/core-components'; + +import DynamicRootContext from '../DynamicRoot/DynamicRootContext'; + +export const ApplicationListener = () => { + const { mountPoints } = useContext(DynamicRootContext); + const listeners = mountPoints['application/listener'] ?? []; + return listeners.map(({ Component }, index) => { + return ( + <ErrorBoundary + // eslint-disable-next-line react/no-array-index-key + key={index} + > + <Component /> + </ErrorBoundary> + ); + }); +}; diff --git a/packages/app/src/components/Root/ApplicationProvider.tsx b/packages/app/src/components/Root/ApplicationProvider.tsx new file mode 100644 index 0000000000..5bb5d604f9 --- /dev/null +++ b/packages/app/src/components/Root/ApplicationProvider.tsx @@ -0,0 +1,28 @@ +import { useContext, useMemo } from 'react'; + +import { ErrorBoundary } from '@backstage/core-components'; + +import DynamicRootContext from '../DynamicRoot/DynamicRootContext'; + +export const ApplicationProvider = ({ + children, +}: React.PropsWithChildren<{}>) => { + const { mountPoints } = useContext(DynamicRootContext); + const providers = useMemo( + () => mountPoints['application/provider'] ?? [], + [mountPoints], + ); + if (providers.length === 0) { + return children; + } + return providers.reduceRight((acc, { Component }, index) => { + return ( + <ErrorBoundary + // eslint-disable-next-line react/no-array-index-key + key={index} + > + <Component>{acc}</Component> + </ErrorBoundary> + ); + }, children); +}; diff --git a/plugins/dynamic-plugins-info/src/components/InternalPluginsMap.ts b/plugins/dynamic-plugins-info/src/components/InternalPluginsMap.ts index 01cf030d04..aedac496cc 100644 --- a/plugins/dynamic-plugins-info/src/components/InternalPluginsMap.ts +++ b/plugins/dynamic-plugins-info/src/components/InternalPluginsMap.ts @@ -65,6 +65,8 @@ export const InternalPluginsMap: Record<string, string> = { './dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-bulk-import', 'red-hat-developer-hub-backstage-plugin-global-header': './dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-global-header', + 'red-hat-developer-hub-backstage-plugin-global-floating-action-button': + './dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-global-floating-action-button', 'red-hat-developer-hub-backstage-plugin-dynamic-home-page': './dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-dynamic-home-page', 'red-hat-developer-hub-backstage-plugin-marketplace': diff --git a/yarn.lock b/yarn.lock index f6146957cf..fbf7847a62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12490,7 +12490,7 @@ __metadata: languageName: node linkType: hard -"@mui/icons-material@npm:5.16.14, @mui/icons-material@npm:^5.15.19, @mui/icons-material@npm:^5.16.4, @mui/icons-material@npm:^5.16.7": +"@mui/icons-material@npm:5.16.14, @mui/icons-material@npm:^5.15.17, @mui/icons-material@npm:^5.15.19, @mui/icons-material@npm:^5.16.4, @mui/icons-material@npm:^5.16.7": version: 5.16.14 resolution: "@mui/icons-material@npm:5.16.14" dependencies: @@ -12666,7 +12666,7 @@ __metadata: languageName: node linkType: hard -"@mui/private-theming@npm:^5.16.14, @mui/private-theming@npm:^5.16.6": +"@mui/private-theming@npm:^5.16.13, @mui/private-theming@npm:^5.16.14, @mui/private-theming@npm:^5.16.6": version: 5.16.14 resolution: "@mui/private-theming@npm:5.16.14" dependencies: @@ -12742,7 +12742,38 @@ __metadata: languageName: node linkType: hard -"@mui/styles@npm:5.16.7, @mui/styles@npm:^5.16.7": +"@mui/styles@npm:5.16.13, @mui/styles@npm:^5.16.7": + version: 5.16.13 + resolution: "@mui/styles@npm:5.16.13" + dependencies: + "@babel/runtime": ^7.23.9 + "@emotion/hash": ^0.9.1 + "@mui/private-theming": ^5.16.13 + "@mui/types": ^7.2.15 + "@mui/utils": ^5.16.13 + clsx: ^2.1.0 + csstype: ^3.1.3 + hoist-non-react-statics: ^3.3.2 + jss: ^10.10.0 + jss-plugin-camel-case: ^10.10.0 + jss-plugin-default-unit: ^10.10.0 + jss-plugin-global: ^10.10.0 + jss-plugin-nested: ^10.10.0 + jss-plugin-props-sort: ^10.10.0 + jss-plugin-rule-value-function: ^10.10.0 + jss-plugin-vendor-prefixer: ^10.10.0 + prop-types: ^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: 2464d3567264c152a7e8f030554a423c6ab509c85d33d193c298935b439cc62c7fa82b80cd99a477fbcdd463aa8de6e57b99b67445081d56137b5d5c094df192 + languageName: node + linkType: hard + +"@mui/styles@npm:5.16.7": version: 5.16.7 resolution: "@mui/styles@npm:5.16.7" dependencies: @@ -16348,6 +16379,26 @@ __metadata: languageName: node linkType: hard +"@red-hat-developer-hub/backstage-plugin-global-floating-action-button@npm:0.0.6": + version: 0.0.6 + resolution: "@red-hat-developer-hub/backstage-plugin-global-floating-action-button@npm:0.0.6" + dependencies: + "@backstage/core-components": ^0.16.3 + "@backstage/core-plugin-api": ^1.10.3 + "@backstage/theme": ^0.6.3 + "@mui/icons-material": ^5.15.17 + "@mui/material": ^5.15.17 + "@mui/styles": 5.16.13 + "@scalprum/react-core": 0.9.3 + classnames: ^2.5.1 + react-use: ^17.2.4 + peerDependencies: + react: 16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + checksum: 2c9f0046497b5f2f67f557078408bea951a897d0914aeb9a55b199c9a55dee094c0796438d23c4d092feb6b00ddf92dbd6494e5ff1b8a5285e7c31b928e40944 + languageName: node + linkType: hard + "@red-hat-developer-hub/backstage-plugin-global-header@npm:0.0.2": version: 0.0.2 resolution: "@red-hat-developer-hub/backstage-plugin-global-header@npm:0.0.2" @@ -20399,7 +20450,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:20.17.16": +"@types/node@npm:20.17.16, @types/node@npm:^20.1.1": version: 20.17.16 resolution: "@types/node@npm:20.17.16" dependencies: @@ -20431,15 +20482,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.1.1": - version: 20.17.14 - resolution: "@types/node@npm:20.17.14" - dependencies: - undici-types: ~6.19.2 - checksum: a5a775f57271e5a73c9e1afc4f6ea0d24cb9b4856e3d7d1788ff9ba0cc3e3a90e7883383f183f193a36eed0c758809df626a9ad653458a06d4fc82644d89b6e0 - languageName: node - linkType: hard - "@types/oauth@npm:*": version: 0.9.4 resolution: "@types/oauth@npm:0.9.4" @@ -40410,6 +40452,18 @@ __metadata: languageName: unknown linkType: soft +"red-hat-developer-hub-backstage-plugin-global-floating-action-button@workspace:dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button": + version: 0.0.0-use.local + resolution: "red-hat-developer-hub-backstage-plugin-global-floating-action-button@workspace:dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-floating-action-button" + dependencies: + "@backstage/cli": 0.29.5 + "@janus-idp/cli": 3.0.0 + "@mui/material": 5.16.14 + "@red-hat-developer-hub/backstage-plugin-global-floating-action-button": 0.0.6 + typescript: 5.7.3 + languageName: unknown + linkType: soft + "red-hat-developer-hub-backstage-plugin-global-header@workspace:dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header": version: 0.0.0-use.local resolution: "red-hat-developer-hub-backstage-plugin-global-header@workspace:dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header"