diff --git a/.changeset/afraid-horses-argue.md b/.changeset/afraid-horses-argue.md new file mode 100644 index 0000000000..fa4b46df5d --- /dev/null +++ b/.changeset/afraid-horses-argue.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Updated kubernetes config schema to match available options diff --git a/.changeset/blue-walls-drop.md b/.changeset/blue-walls-drop.md new file mode 100644 index 0000000000..a8e9ea1d33 --- /dev/null +++ b/.changeset/blue-walls-drop.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': minor +--- + +Plugins that instantiate the `KubernetesProxy` must now provide a parameter of the type `KubernetesProxyOptions` which includes providing a `KubernetesAuthTranslator`. The `KubernetesBuilder` now builds its own `KubernetesAuthTranslatorMap` that it provides to the `KubernetesProxy`. The `DispatchingKubernetesAuthTranslator` expects a `KubernetesTranslatorMap` to be provided as a parameter. The `KubernetesBuilder` now has a method called `setAuthTranslatorMap` which allows integrators to bring their own `KubernetesAuthTranslator's` to the `KubernetesPlugin`. diff --git a/.changeset/calm-geese-obey.md b/.changeset/calm-geese-obey.md new file mode 100644 index 0000000000..b45295f8ff --- /dev/null +++ b/.changeset/calm-geese-obey.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-kubernetes': minor +--- + +refactor kubernetes error detection to make way for proposed solutions + +**BREAKING**: `DetectedError` now appears once per Kubernetes resource per error instead of for all resources which have that error, `namespace` and `name` fields are now in `sourceRef` object `message` is now a `string` instead of a `string[]`. `ErrorDetectableKind` has been removed. diff --git a/.changeset/calm-otters-destroy.md b/.changeset/calm-otters-destroy.md new file mode 100644 index 0000000000..cf3792cf4c --- /dev/null +++ b/.changeset/calm-otters-destroy.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/plugin-catalog-backend': patch +--- + +Use the `LocationSpec` type from the `catalog-common` package in place of the deprecated `LocationSpec` from the `catalog-node` package. diff --git a/.changeset/clean-items-draw.md b/.changeset/clean-items-draw.md new file mode 100644 index 0000000000..0dafb41265 --- /dev/null +++ b/.changeset/clean-items-draw.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-circleci': patch +--- + +Add hover over CircleCI avatar icon to show user name in builds table diff --git a/.changeset/clean-teachers-thank.md b/.changeset/clean-teachers-thank.md new file mode 100644 index 0000000000..043a718d79 --- /dev/null +++ b/.changeset/clean-teachers-thank.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-module-addons-contrib': patch +--- + +Bump `photoswipe` dependency to `^5.3.7`. diff --git a/.changeset/clever-lizards-whisper.md b/.changeset/clever-lizards-whisper.md new file mode 100644 index 0000000000..4f2820c347 --- /dev/null +++ b/.changeset/clever-lizards-whisper.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +When building a backend package with dependencies any `--config ` options will now be forwarded to any dependent app package builds, unless the build script in the app package already contains a `--config` option. diff --git a/.changeset/curly-steaks-mate.md b/.changeset/curly-steaks-mate.md new file mode 100644 index 0000000000..93e53c4959 --- /dev/null +++ b/.changeset/curly-steaks-mate.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-app-api': patch +'@backstage/backend-common': patch +--- + +Allow an additionalConfig to be provided to loadBackendConfig that fetches config values during runtime. diff --git a/.changeset/eight-trainers-smoke.md b/.changeset/eight-trainers-smoke.md new file mode 100644 index 0000000000..4c3cd33fbb --- /dev/null +++ b/.changeset/eight-trainers-smoke.md @@ -0,0 +1,5 @@ +--- +'@backstage/catalog-client': patch +--- + +Fixed bug in `queryEntities` of `CatalogClient` where the `sortField` is supposed to be changed to `orderField`. diff --git a/.changeset/famous-beds-break.md b/.changeset/famous-beds-break.md new file mode 100644 index 0000000000..a3d2e929a8 --- /dev/null +++ b/.changeset/famous-beds-break.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-permission-node': patch +--- + +Introduced alpha export of the `policyExtensionPoint` for use in the new backend system. diff --git a/.changeset/famous-beds-repair.md b/.changeset/famous-beds-repair.md new file mode 100644 index 0000000000..f08506b130 --- /dev/null +++ b/.changeset/famous-beds-repair.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-permission-backend': patch +--- + +Introduced alpha export of the `permissionPlugin` for use in the new backend system, along with a `permissionModuleAllowAllPolicy` that can be used to allow all requests. diff --git a/.changeset/fast-gorillas-approve.md b/.changeset/fast-gorillas-approve.md new file mode 100644 index 0000000000..e162a2cbb0 --- /dev/null +++ b/.changeset/fast-gorillas-approve.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Upgrade `react-virtualized-auto-sizer´ to version `^1.0.11` diff --git a/.changeset/flat-ways-compete.md b/.changeset/flat-ways-compete.md new file mode 100644 index 0000000000..75521ce4f6 --- /dev/null +++ b/.changeset/flat-ways-compete.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-rollbar-backend': patch +--- + +Replace `camelcase-keys` dependency with one with better compatibility. diff --git a/.changeset/forty-days-tell.md b/.changeset/forty-days-tell.md new file mode 100644 index 0000000000..98aed740b8 --- /dev/null +++ b/.changeset/forty-days-tell.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Fixed bug in catalog filters where you could not click on the text to select a value. diff --git a/.changeset/funny-pots-hide.md b/.changeset/funny-pots-hide.md index 32388a93a5..37b661a150 100644 --- a/.changeset/funny-pots-hide.md +++ b/.changeset/funny-pots-hide.md @@ -2,4 +2,4 @@ '@backstage/plugin-search-backend': minor --- -Exports search plugin that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](../docs/features/search/how-to-guides.md#how-to-migrate-to-use-search-together-with-the-new-backend-system). +Exports search plugin that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). diff --git a/.changeset/giant-hairs-serve.md b/.changeset/giant-hairs-serve.md index 0f77a6fe34..7c035a1e02 100644 --- a/.changeset/giant-hairs-serve.md +++ b/.changeset/giant-hairs-serve.md @@ -3,4 +3,4 @@ '@backstage/plugin-search-backend-module-pg': patch --- -Search backend modules migrated to the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](../docs/features/search/how-to-guides.md#how-to-migrate-to-use-search-together-with-the-new-backend-system). +Search backend modules migrated to the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). diff --git a/.changeset/good-papayas-lay.md b/.changeset/good-papayas-lay.md new file mode 100644 index 0000000000..258397a14f --- /dev/null +++ b/.changeset/good-papayas-lay.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-scaffolder-node': patch +--- + +Improve type-check for scaffolder output parameters diff --git a/.changeset/itchy-ads-sit.md b/.changeset/itchy-ads-sit.md new file mode 100644 index 0000000000..d8201d1015 --- /dev/null +++ b/.changeset/itchy-ads-sit.md @@ -0,0 +1,12 @@ +--- +'@backstage/create-app': patch +--- + +Upgraded the TypeScript version to 5.0 + +To apply this change in your own project, switch the TypeScript version in your root `package.json`: + +```diff +- "typescript": "~4.6.4", ++ "typescript": "~5.0.0", +``` diff --git a/.changeset/itchy-kiwis-unite.md b/.changeset/itchy-kiwis-unite.md new file mode 100644 index 0000000000..0e3bcae282 --- /dev/null +++ b/.changeset/itchy-kiwis-unite.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-explore': patch +--- + +Extracted generic `CatalogKindExploreContent` component so that it is easy to show any component kinds in their own tab in the explore page. diff --git a/.changeset/mean-rice-beg.md b/.changeset/mean-rice-beg.md new file mode 100644 index 0000000000..19cef51292 --- /dev/null +++ b/.changeset/mean-rice-beg.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-vault': patch +--- + +Use `fetchApi` instead of raw `fetch` in order to pass auth header if necessary. diff --git a/.changeset/mighty-tips-flow.md b/.changeset/mighty-tips-flow.md new file mode 100644 index 0000000000..514d514588 --- /dev/null +++ b/.changeset/mighty-tips-flow.md @@ -0,0 +1,16 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +The `microsoft` (i.e. Azure) auth provider now supports negotiating tokens for +Azure resources besides Microsoft Graph (e.g. AKS, Virtual Machines, Machine +Learning Services, etc.). When the `/frame/handler` endpoint is called with an +authorization code for a non-Microsoft Graph scope, the user profile will not be +fetched. Similarly no user profile or photo data will be fetched by the backend +if the `/refresh` endpoint is called with the `scope` query parameter strictly +containing scopes for resources besides Microsoft Graph. + +Furthermore, the `offline_access` scope will be requested by default, even when +it is not mentioned in the argument to `getAccessToken`. This means that any +Azure access token can be automatically refreshed, even if the user has not +signed in via Azure. diff --git a/.changeset/modern-snakes-check.md b/.changeset/modern-snakes-check.md new file mode 100644 index 0000000000..29510ad712 --- /dev/null +++ b/.changeset/modern-snakes-check.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +bug: Invert `templateFilter` predicate to align with `Array.filter` diff --git a/.changeset/neat-pears-argue.md b/.changeset/neat-pears-argue.md new file mode 100644 index 0000000000..b3105148fb --- /dev/null +++ b/.changeset/neat-pears-argue.md @@ -0,0 +1,10 @@ +--- +'@backstage/plugin-git-release-manager': patch +'@backstage/plugin-cicd-statistics': patch +'@backstage/plugin-code-coverage': patch +'@backstage/plugin-cost-insights': patch +'@backstage/plugin-xcmetrics': patch +'@backstage/plugin-bitrise': patch +--- + +Bumped `recharts` dependency to `^2.5.0`. diff --git a/.changeset/odd-plums-bake.md b/.changeset/odd-plums-bake.md new file mode 100644 index 0000000000..427ab776b5 --- /dev/null +++ b/.changeset/odd-plums-bake.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-adr-common': patch +'@backstage/plugin-adr': patch +--- + +use path attribute to fetch files instead of name and update the UI to navigate over subdirectories diff --git a/.changeset/olive-cycles-join.md b/.changeset/olive-cycles-join.md new file mode 100644 index 0000000000..e902c181c2 --- /dev/null +++ b/.changeset/olive-cycles-join.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Change anchor links color in Techdocs content + +With the color (mkdocs supplied) used for anchor links the background and foreground colors do not have a sufficient contrast ratio. Using the link color from theme palette. diff --git a/.changeset/perfect-deers-add.md b/.changeset/perfect-deers-add.md new file mode 100644 index 0000000000..c932351a19 --- /dev/null +++ b/.changeset/perfect-deers-add.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-playlist': patch +--- + +Added config properties to change dynamically the group noun for all the components in the UI diff --git a/.changeset/poor-cars-fold.md b/.changeset/poor-cars-fold.md new file mode 100644 index 0000000000..8268a616d8 --- /dev/null +++ b/.changeset/poor-cars-fold.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +fix localKubectlProxy auth provider fetching diff --git a/.changeset/popular-radios-visit.md b/.changeset/popular-radios-visit.md new file mode 100644 index 0000000000..94d292d10a --- /dev/null +++ b/.changeset/popular-radios-visit.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-backend-module-jsonfc': patch +--- + +When multiple fact retrievers are used for a check, allow for cases where only one returns a given fact diff --git a/.changeset/pre.json b/.changeset/pre.json index 042939035f..bf70830cad 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -212,21 +212,49 @@ "@backstage/plugin-vault": "0.1.10", "@backstage/plugin-vault-backend": "0.2.10", "@backstage/plugin-xcmetrics": "0.2.36", - "@backstage/plugin-scaffolder-backend-module-gitlab": "0.0.0" + "@backstage/plugin-scaffolder-backend-module-gitlab": "0.0.0", + "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.0.0", + "@backstage/plugin-search-backend-module-catalog": "0.0.0", + "@backstage/plugin-search-backend-module-explore": "0.0.0", + "@backstage/plugin-search-backend-module-techdocs": "0.0.0" }, "changesets": [ + "all-my-auth-wanna-ride-today", + "blue-walls-drop", "bright-pumpkins-bake", + "calm-otters-destroy", + "chatty-coats-thank", + "clean-dolls-search", + "clean-items-draw", + "clean-teachers-thank", + "clever-lizards-whisper", "create-app-1679405836", "curly-boats-trade", "curly-jobs-kneel", + "curly-steaks-mate", + "curvy-rocks-guess", + "eight-trainers-smoke", "eleven-bats-tease", + "eleven-coats-refuse", "fair-roses-stare", + "famous-beds-break", + "famous-beds-repair", + "fast-gorillas-approve", "fast-snakes-buy", + "flat-ways-compete", + "forty-days-tell", + "forty-gorillas-help", "fresh-schools-fly", + "funny-pots-hide", + "funny-rivers-grin", "fuzzy-actors-turn", + "fuzzy-wombats-search", + "giant-hairs-serve", + "good-papayas-lay", "heavy-colts-wash", "hungry-lies-cry", "hungry-monkeys-reply", + "itchy-ads-sit", "khaki-cars-drum", "khaki-doors-compare", "khaki-guests-turn", @@ -235,28 +263,57 @@ "long-gorillas-remain", "many-eggs-press", "mighty-lamps-cross", + "modern-snakes-check", "nasty-nails-appear", "neat-donkeys-work", + "neat-pears-argue", + "new-pigs-jam", + "odd-grapes-double", "old-cougars-sit", + "olive-cycles-join", + "olive-months-talk", "orange-rabbits-jam", + "perfect-deers-add", + "poor-cars-fold", + "popular-parents-crash", + "popular-radios-visit", + "pretty-carpets-cross", "rare-seals-decide", + "renovate-179fa0e", "renovate-a9116b7", "renovate-c574b04", "rotten-carrots-cheer", "seven-gifts-fetch", "short-panthers-float", + "silly-adults-accept", + "six-jobs-hear", "soft-roses-cover", + "sour-buttons-collect", "sour-dragons-cheat", + "stale-cobras-beg", + "stale-paws-sparkle", "strong-crews-repeat", + "stupid-laws-play", "swift-meals-live", + "tall-chairs-explain", + "tall-oranges-own", "ten-hounds-bathe", "ten-mayflies-beam", + "tender-parrots-fry", "thick-forks-prove", "thin-spoons-prove", "thirty-crabs-tell", + "tiny-apes-scream", + "tough-cameras-beam", "twelve-parrots-camp", + "twelve-vans-sell", + "unlucky-snakes-smile", + "warm-buses-switch", + "weak-oranges-give", "weak-turtles-arrive", + "wet-lamps-happen", "wise-garlics-camp", - "witty-berries-love" + "witty-berries-love", + "witty-points-visit" ] } diff --git a/.changeset/silent-nails-bake.md b/.changeset/silent-nails-bake.md new file mode 100644 index 0000000000..1161686b34 --- /dev/null +++ b/.changeset/silent-nails-bake.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Add common identify resolvers for `oidc` auth provider. diff --git a/.changeset/six-jobs-hear.md b/.changeset/six-jobs-hear.md new file mode 100644 index 0000000000..3e9d10f0e9 --- /dev/null +++ b/.changeset/six-jobs-hear.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Fixed bug in the `DefaultCatalogProcessingEngine` where entities that contained multiple different types of relations for the same source entity would not properly trigger stitching for that source entity. diff --git a/.changeset/sixty-insects-visit.md b/.changeset/sixty-insects-visit.md new file mode 100644 index 0000000000..adbe27e0ac --- /dev/null +++ b/.changeset/sixty-insects-visit.md @@ -0,0 +1,9 @@ +--- +'@backstage/core-app-api': minor +--- + +The `AuthConnector` interface now supports specifying a set of scopes when +refreshing a session. The `DefaultAuthConnector` implementation passes the +`scope` query parameter to the auth-backend plugin appropriately. The +`RefreshingAuthSessionManager` passes any scopes in its `GetSessionRequest` +appropriately. diff --git a/.changeset/slow-ravens-destroy.md b/.changeset/slow-ravens-destroy.md new file mode 100644 index 0000000000..a75793f86f --- /dev/null +++ b/.changeset/slow-ravens-destroy.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Allow for a commit message to differ from the PR title when publishing a GitHub pull request. diff --git a/.changeset/sour-buttons-collect.md b/.changeset/sour-buttons-collect.md new file mode 100644 index 0000000000..0f83b88ec3 --- /dev/null +++ b/.changeset/sour-buttons-collect.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Ensure that the `package prepack` command and backend bundling uses posix paths in `package.json` on all OSes. diff --git a/.changeset/sour-laws-walk.md b/.changeset/sour-laws-walk.md new file mode 100644 index 0000000000..073e3dc6a8 --- /dev/null +++ b/.changeset/sour-laws-walk.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Export Azure Easy Auth provider so it can actually be used. diff --git a/.changeset/stale-cobras-beg.md b/.changeset/stale-cobras-beg.md new file mode 100644 index 0000000000..c68c5226d9 --- /dev/null +++ b/.changeset/stale-cobras-beg.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': minor +--- + +Add support for the new plugin system to the Kubernetes plugin diff --git a/.changeset/stale-files-sniff.md b/.changeset/stale-files-sniff.md new file mode 100644 index 0000000000..b6f35645c4 --- /dev/null +++ b/.changeset/stale-files-sniff.md @@ -0,0 +1,5 @@ +--- +'@backstage/catalog-model': minor +--- + +Modified the regex for DNS label validation to support IDN domains diff --git a/.changeset/stale-paws-sparkle.md b/.changeset/stale-paws-sparkle.md new file mode 100644 index 0000000000..ec4284d44f --- /dev/null +++ b/.changeset/stale-paws-sparkle.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Split the `BackstageSidebar` style `drawer` class, such that the `width` property is in a separate `drawerWidth` class instead. This makes it such that you can style the `drawer` class in your theme again. diff --git a/.changeset/stupid-laws-play.md b/.changeset/stupid-laws-play.md new file mode 100644 index 0000000000..837fd08f40 --- /dev/null +++ b/.changeset/stupid-laws-play.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +`scaffolder/next`: bump `rjsf` dependencies to `5.5.0` diff --git a/.changeset/tall-meals-dress.md b/.changeset/tall-meals-dress.md new file mode 100644 index 0000000000..3d39c369fe --- /dev/null +++ b/.changeset/tall-meals-dress.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-events-backend': patch +--- + +Export `DefaultEventBroker` to allow decoupling of the catalog and events backends in the `example-backend`. + +Please look at `plugins/events-backend/README.md` for the currently advised way to set up the event backend and catalog providers. diff --git a/.changeset/tall-oranges-own.md b/.changeset/tall-oranges-own.md new file mode 100644 index 0000000000..61aa442c7f --- /dev/null +++ b/.changeset/tall-oranges-own.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-bazaar': patch +--- + +Added the `fullWidth` and `fullHeight` optional properties to the `BazaarPage`, +to replicate the styling options available on the `BazaarOverviewCard`. diff --git a/.changeset/tender-parrots-fry.md b/.changeset/tender-parrots-fry.md new file mode 100644 index 0000000000..847bd18761 --- /dev/null +++ b/.changeset/tender-parrots-fry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': minor +--- + +The Installed Actions page now shows details for nested objects and arrays diff --git a/.changeset/tender-terms-return.md b/.changeset/tender-terms-return.md new file mode 100644 index 0000000000..9e8ab6beb7 --- /dev/null +++ b/.changeset/tender-terms-return.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Fix a bug in sub-path navigation due to double addition of a sub-path if one was set up in `app.baseUrl`. diff --git a/.changeset/tough-cameras-beam.md b/.changeset/tough-cameras-beam.md new file mode 100644 index 0000000000..e1bcc87dc4 --- /dev/null +++ b/.changeset/tough-cameras-beam.md @@ -0,0 +1,10 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Provide some more default filters out of the box and refactoring how the filters are applied to the `SecureTemplater`. + +- `parseEntityRef` will take an string entity triplet and return a parsed object. +- `pick` will allow you to reference a specific property in the piped object. + +So you can now combine things like this: `${{ parameters.entity | parseEntityRef | pick('name') }}` to get the name of a specific entity, or `${{ parameters.repoUrl | parseRepoUrl | pick('owner') }}` to get the owner of a repo. diff --git a/.changeset/unlucky-snakes-smile.md b/.changeset/unlucky-snakes-smile.md new file mode 100644 index 0000000000..ec0f9bf947 --- /dev/null +++ b/.changeset/unlucky-snakes-smile.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search': minor +--- + +Search modal auto closes on location change diff --git a/.changeset/warm-buses-switch.md b/.changeset/warm-buses-switch.md index 5564f33d67..8db4672187 100644 --- a/.changeset/warm-buses-switch.md +++ b/.changeset/warm-buses-switch.md @@ -2,4 +2,4 @@ '@backstage/plugin-search-backend-node': minor --- -Exports services and extension points that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](../docs/features/search/how-to-guides.md#how-to-migrate-to-use-search-together-with-the-new-backend-system). +Exports services and extension points that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). diff --git a/.changeset/weak-oranges-give.md b/.changeset/weak-oranges-give.md new file mode 100644 index 0000000000..9e24244fcb --- /dev/null +++ b/.changeset/weak-oranges-give.md @@ -0,0 +1,8 @@ +--- +'@backstage/core-plugin-api': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder-node': patch +'@backstage/plugin-catalog-react': patch +--- + +Minor type tweaks for TypeScript 5.0 diff --git a/.changeset/wet-lamps-happen.md b/.changeset/wet-lamps-happen.md index 066b34b23c..8bcc1e0679 100644 --- a/.changeset/wet-lamps-happen.md +++ b/.changeset/wet-lamps-happen.md @@ -4,4 +4,4 @@ '@backstage/plugin-search-backend-module-explore': minor --- -Package introduced to export search backend modules that can be used with the new backend system to extend search with plugin specific functionality, such as collators. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](../docs/features/search/how-to-guides.md#how-to-migrate-to-use-search-together-with-the-new-backend-system). +Package introduced to export search backend modules that can be used with the new backend system to extend search with plugin specific functionality, such as collators. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). diff --git a/.changeset/witty-points-visit.md b/.changeset/witty-points-visit.md new file mode 100644 index 0000000000..9cbbe8c944 --- /dev/null +++ b/.changeset/witty-points-visit.md @@ -0,0 +1,103 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch +'@backstage/plugin-api-docs-module-protoc-gen-doc': patch +'@backstage/plugin-techdocs-module-addons-contrib': patch +'@backstage/plugin-cicd-statistics-module-gitlab': patch +'@backstage/plugin-github-pull-requests-board': patch +'@backstage/plugin-techdocs-addons-test-utils': patch +'@backstage/plugin-analytics-module-ga': patch +'@backstage/plugin-git-release-manager': patch +'@backstage/integration-react': patch +'@backstage/plugin-github-deployments': patch +'@backstage/plugin-microsoft-calendar': patch +'@backstage/plugin-newrelic-dashboard': patch +'@backstage/plugin-entity-validation': patch +'@backstage/plugin-sonarqube-backend': patch +'@backstage/core-components': patch +'@backstage/core-plugin-api': patch +'@backstage/plugin-permission-react': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/version-bridge': patch +'@backstage/plugin-apollo-explorer': patch +'@backstage/plugin-catalog-graphql': patch +'@backstage/plugin-cicd-statistics': patch +'@backstage/plugin-entity-feedback': patch +'@backstage/plugin-gitops-profiles': patch +'@backstage/plugin-graphql-voyager': patch +'@backstage/plugin-sonarqube-react': patch +'@backstage/plugin-apache-airflow': patch +'@backstage/plugin-catalog-import': patch +'@backstage/plugin-github-actions': patch +'@backstage/plugin-octopus-deploy': patch +'@backstage/plugin-splunk-on-call': patch +'@backstage/plugin-stack-overflow': patch +'@backstage/plugin-techdocs-react': patch +'@backstage/core-app-api': patch +'@backstage/plugin-catalog-graph': patch +'@backstage/plugin-catalog-react': patch +'@backstage/plugin-code-coverage': patch +'@backstage/plugin-config-schema': patch +'@backstage/plugin-cost-insights': patch +'@backstage/plugin-explore-react': patch +'@backstage/plugin-github-issues': patch +'@backstage/plugin-tech-insights': patch +'@backstage/plugin-user-settings': patch +'@backstage/integration': patch +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-azure-devops': patch +'@backstage/plugin-code-climate': patch +'@backstage/plugin-gcp-projects': patch +'@backstage/plugin-search-react': patch +'@backstage/create-app': patch +'@backstage/test-utils': patch +'@backstage/plugin-azure-sites': patch +'@backstage/plugin-firehydrant': patch +'@backstage/dev-utils': patch +'@backstage/plugin-cloudbuild': patch +'@backstage/plugin-kubernetes': patch +'@backstage/plugin-lighthouse': patch +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-stackstorm': patch +'@backstage/plugin-tech-radar': patch +'@backstage/plugin-codescene': patch +'@backstage/plugin-dynatrace': patch +'@backstage/plugin-gcalendar': patch +'@backstage/plugin-org-react': patch +'@backstage/plugin-pagerduty': patch +'@backstage/plugin-shortcuts': patch +'@backstage/plugin-sonarqube': patch +'@backstage/plugin-xcmetrics': patch +'@backstage/plugin-airbrake': patch +'@backstage/plugin-api-docs': patch +'@backstage/plugin-circleci': patch +'@backstage/plugin-graphiql': patch +'@backstage/plugin-linguist': patch +'@backstage/plugin-newrelic': patch +'@backstage/plugin-periskop': patch +'@backstage/plugin-playlist': patch +'@backstage/plugin-techdocs': patch +'@backstage/plugin-bitrise': patch +'@backstage/plugin-catalog': patch +'@backstage/plugin-explore': patch +'@backstage/plugin-jenkins': patch +'@backstage/plugin-rollbar': patch +'@backstage/theme': patch +'@backstage/plugin-allure': patch +'@backstage/plugin-badges': patch +'@backstage/plugin-bazaar': patch +'@backstage/plugin-search': patch +'@backstage/plugin-sentry': patch +'@backstage/plugin-fossa': patch +'@backstage/plugin-ilert': patch +'@backstage/plugin-kafka': patch +'@backstage/plugin-vault': patch +'@backstage/plugin-gocd': patch +'@backstage/plugin-home': patch +'@backstage/plugin-todo': patch +'@backstage/plugin-adr': patch +'@backstage/plugin-org': patch +'@backstage/repo-tools': patch +'@backstage/cli': patch +--- + +Update peer dependencies diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index f058475367..83fba8aa56 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -267,6 +267,7 @@ permissioning plantuml Platformize Podman +posix postgres postpack pre diff --git a/ADOPTERS.md b/ADOPTERS.md index 61e149e498..306ae24280 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -103,7 +103,7 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Stilingue](https://www.stilingue.com.br/) | [@stilingue-inteligencia-artificial](https://github.com/Stilingue-IA), [@bbviana](https://github.com/bbviana) | Developer portal, services catalog and centralization of metrics from Grafana, Sentry and GCP. Furthermore, centralization of documentation and infra details like DNS, Network services, SSL and so on. | | [TUI Group](https://www.tuigroup.com/) | [Simon Stamm](https://github.com/simonstamm), [Christian Rudolph](https://github.com/ChrisRu82) | Developer portal for all engineer to provide discoverability to all internal components, APIs, documentation and to scaffold templates with integrations to our internal tools extended by plugins from our community. | | [Alliander](https://www.alliander.com/) | [@leon-vg](https://github.com/leon-vg), [@gieljl](https://github.com/gieljl), [@niekteg](https://github.com/niekteg) | Developer portal - software catalog, technical documentation, software templates, tech radar and exploration of used tools/services | -| [VIA](https://www.via.com.br) | [@vagnerguedes](https://github.com/vagnerguedes) | Centralized Developer Experience portal - Software catalog and documentation platform, software templates, techdocs, scaffolding, self-service infrastructure | +| [VIA](https://www.via.com.br) | [Rogerio Segovia](https://github.com/rsegovia) | Centralized Developer Experience portal - Software catalog and documentation platform, software templates, techdocs, scaffolding, self-service infrastructure | | [Surevine](https://www.surevine.com/) | [@DJDANNY123](https://github.com/djdanny123) | Developer portal for software catalog, discovery and a view of the technologies we are using across the organisation, we are looking to explore how we can enrich our entities in Backstage by integrating a software bill of materials. | | [Bonial International GmbH](https://www.bonial.com/) | [@pjungermann](https://github.com/pjungermann) | Centralized developer portal with software catalog, tech docs, templates, and more. | | [Beez Innovation Labs Pvt. Ltd](https://www.beezlabs.com/) | [Karthikeyan Venkatesan](https://github.com/karthikeyan23) | Developer portal with software catalog, scaffolding, tech docs, templates, and infra. | @@ -119,7 +119,7 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Marks & Spencer](https://www.marksandspencer.com/) | [Kamal Cheriyath](https://github.com/kcheriyath) | Centralised discovery, adoption and devops automation hub for Engineering & Architecture. | | [McKesson](https://www.mckesson.com/) | [Agnel Antony](https://github.com/aantony2) | Internal Developer Platform for developer gated CI/CD templates, technical documentation, cloud automation service catalog, etc. | | [World Fuel Services](https://www.wfscorp.com/) | [Anirudh Kurapathi](https://github.com/anirudhkurapati), [Alex Kwon](https://github.com/alexkwon), [Lester Hernandez](https://github.com/lhernandez-wfscorp), [Avi Boru](https://github.com/aviboru), [Vardhan Annapureddy](https://github.com/harshaaws) | Internal Developer Portal, service catalog product, API's, Software Templates, tech docs and more. | -| [leboncoin](https://www.leboncoin.fr/) | [Andy Ladjadj](https://github.com/aladjadj) | Centralize our multiple UI in a single portal. Simplify onbording, new features and harmonize how people search information. Core features (catalog,api,docs,scafolder) are good to start the adoption. status: internal beta. | +| [leboncoin](https://www.leboncoin.fr/) | [Andy Ladjadj](https://github.com/aladjadj) | Centralize our multiple UI in a single portal. Simplify onbording, new features and harmonize how people search information. | | [Contentful](https://www.contentful.com) | [James Bourne](https://github.com/jamesmbourne) | Centralized documentation of service ownership, APIs, and documentation, and new service creation with a custom scaffolder - [full case study with Roadie](https://roadie.io/case-studies/maintaining-velocity-through-hypergrowth-contentful/). | | [Back Market](https://www.backmarket.com) | [Sami Farhat](https://github.com/skfarhat) | Internal Developer Portal featuring catalog, tech-radar, ownership management, component creation (scaffolder) and centralized infrastructure management -- probably more to come. | | [Avalia Systems](https://avalia.io) | [Olivier Liechti](https://github.com/wasadigi), [Fabio Velloso](https://github.com/fabiovelloso) | Innersource, software analytics, knowledge base for 360 software assessments, collaborative applications, hub for tracking and sharing IP assets. | @@ -227,7 +227,7 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Booking.com](https://www.linkedin.com/company/booking.com/) | [Mesut Yilmazyildirim](https://www.linkedin.com/in/myilmazyildirim) | We are adopting Backstage as the new reliability platform inside the company. We are migrating UIs of our internal developer tools to Backstage for a better user experience. | [Swissquote Bank](https://swissquote.com/company/jobs/open-positions) | [Bruno Rocha](https://www.linkedin.com/in/bruno-rocha1/) | Integrating Backstage as the visualization layer & tactical overview of our services and teams. | [XP Inc.](https://www.linkedin.com/company/xpinc/) | [Gabriel Santos](https://www.linkedin.com/in/gabriel-santos-6bb740a/) | Developer Portal Catalog (components, APIs, resources, users, groups) and organization relations. -| [OVO Energy](https://www.ovoenergy.com/) | [Michael Wizner](https://github.com/mwz), [Dan Laird](https://github.com/dlaird-ovo), [Samantha Betts](https://github.com/sammbetts) | Developer Experience Tool with an aim to to improve processes, boost productivity, finding of information/docs and building tech engagement throughout the business. +| [OVO Energy](https://www.ovoenergy.com/) | [Michael Wizner](https://github.com/mwz), [Dan Laird](https://github.com/dlaird-ovo), [Samantha Betts](https://github.com/sammbetts) | Developer Experience Tool with an aim to to improve processes, boost productivity, finding of information/docs and building tech engagement throughout the business. | [MusicTribe](https://careers.musictribe.com/) | [Alex Ford](mailto:alex.j.ford@gmail.com), [Tiago Barbosa](https://github.com/t1agob) | We are starting to use Backstage as a developer portal to share API specifications and documentation, to quickly onboard new projects with the software templates, and to help developers discover software through the catalog. | [Cazoo](https://www.cazoo.co.uk/) | [Abz Mungul](https://www.linkedin.com/in/abzmungul/), [Scott Edwards](https://www.linkedin.com/in/scott-edwards-tech/) | We're assessing Backstage as our developer platform at Cazoo with a focus on reducing cognitive load for our engineers. We're currently aiming for 3 outcomes: creating visibility into service ownership across teams, improving the discoverability of event schemas and relationships, and improving the discoverability of technical documentation and best practices. | | [Gumtree](https://www.gumtree.com.au) | [Kumar Gaurav](https://www.linkedin.com/in/kumargaurav517) | We are starting to use it as a single place to find all component information in a distributed architecture. | @@ -235,4 +235,5 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [The LEGO Group](https://www.lego.com) | [Waqas Ali](https://www.linkedin.com/in/waqasali47) | We are building our internal develper portal on top of Backstage. | | [CORS.gmbh](https://www.cors.gmbh) | [@dpfaffenbauer](https://github.com/dpfaffenbauer) | Developer Portal for our Projects we develop for our Customers and Hosting them On Kubernetes. | | [Comcast](https://comcast.github.io/) | [Ryan Emerle](https://github.com/remerle) | Developer portal enabling discovery of products, services, and documentation throughout the enterprise to ultimately reduce friction and improve time-to-market. | - +| [Syntasso](https://www.syntasso.io/) | [@syntassodev](https://github.com/syntassodev) | Backstage is used as a optional UI for the [Kratix project](https://kratix.io), a framework for building platforms. +| [Bankdata](https://www.bankdata.dk) | [Thomas Grønbæk](https://www.linkedin.com/in/thomas-grønbæk/) | We are assessing Backstage as our internal developer portal @Bankdata. Goal is to reduce cognitive load and friction for developers and thereby improving developer experience, onboarding and productivity. Expect use of Software Catalog for discoverability and ownership, Tech Docs and Software Templates to integrate tooling and best practices. diff --git a/GOVERNANCE.md b/GOVERNANCE.md index 3314e40993..2367dab99c 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -208,12 +208,12 @@ In all cases in this document where voting is mentioned, the voting process is a It is important for contributors to be and stay active to set an example and show commitment to the project. Inactivity is harmful to the project as it may lead to unexpected delays, contributor attrition, and a loss of trust in the project. -Inactivity is measured by periods of no contributions for longer than: +Inactivity is measured by periods of no contributions without explanation, for longer than: - Core Maintainer: 2 months - Project Area Maintainer: 4 months - Plugin Maintainer: 6 months -- Organization Member: 8 months +- Organization Member: 12 months Consequences of being inactive include: diff --git a/OWNERS.md b/OWNERS.md index 08736d5723..2124863f8d 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -38,15 +38,28 @@ Scope: Discoverability within Backstage, including the home page, information ar | Raghunandan Balachandran | Spotify | BUX | [soapraj](http://github.com/soapraj) | raghunandanb#1114 | | Renan Mendes Carvalho | Spotify | BUX | [aitherios](http://github.com/aitherios) | aitherios#0593 | +### Helm Charts + +Team: @backstage/helm-chart-maintainers + +Scope: The Backstage [Helm Chart(s)](https://github.com/backstage/charts). + +| Name | Organization | Team | GitHub | Discord | +| -------------------- | ------------ | ---- | ---------------------------------------- | -------------- | +| Andrew Block | Red Hat | | [sabre1041](http://github.com/sabre1041) | sabre1041#2622 | +| Tom Coufal | Red Hat | | [tumido](http://github.com/tumido) | Tumi#4346 | +| Vincenzo Scamporlino | Spotify | | [vinzscam](http://github.com/vinzscam) | vinzscam#6944 | + ### Kubernetes Team: @backstage/kubernetes-maintainers Scope: The Kubernetes plugin and the base it provides for other plugins to build upon. -| Name | Organization | Team | GitHub | Discord | -| -------------- | ------------ | ---- | ---------------------------------------- | ------------ | -| Matthew Clarke | Spotify | | [mclarke47](http://github.com/mclarke47) | mclarke#0725 | +| Name | Organization | Team | GitHub | Discord | +| -------------- | ------------ | ---- | ---------------------------------------------- | ----------------- | +| Matthew Clarke | Spotify | | [mclarke47](http://github.com/mclarke47) | mclarke#0725 | +| Jamie Klassen | VMware | | [jamieklassen](http://github.com/jamieklassen) | jamieklassen#3047 | ### TechDocs @@ -69,20 +82,21 @@ Scope: The TechDocs plugin and related tooling ## Organization Members -| Name | Organization | GitHub | Discord | -| ------------------ | ------------------------- | ----------------------------------------------- | ------------------------------ | -| Adam Harvey | Cisco | [adamdmharvey](https://github.com/adamdmharvey) | `adamharvey#3739` | -| Andre Wanlin | Keyloop | [awanlin](https://github.com/awanlin) | `Ahhhndre#3095` | -| Andrew Thauer | Wealthsimple | [andrewthauer](https://github.com/andrewthauer) | `andrewthauer#3060` | -| Brian Fletcher | RoadieHQ | [punkle](https://github.com/punkle) | `Brian Fletcher#7051` | -| David Tuite | Roadie | [dtuite](https://github.com/dtuite) | `David Tuite (roadie.io)#1010` | -| Himanshu Mishra | Harness.io | [OrkoHunter](https://github.com/OrkoHunter) | `OrkoHunter#1520` | -| Jamie Klassen | VMware | [jamieklassen](https://github.com/jamieklassen) | `jamieklassen#3047` | -| Jussi Hallila | Roadie | [Xantier](https://github.com/Xantier) | `Xantier#0086` | -| Mark Avery | Cvent | [webark](https://github.com/webark) | `webark#8471` | -| Patrick Jungermann | Bonial International GmbH | [pjungermann](https://github.com/pjungermann) | `pjungermann#6933` | -| Phil Kuang | FactSet Research Systems | [kuangp](https://github.com/kuangp) | `pkuang#3202` | -| Taras Mankovski | Frontside | [taras](https://github.com/taras) | `tarasm#1256` | +| Name | Organization | GitHub | Discord | +| ------------------------------ | ------------------------- | ----------------------------------------------- | ------------------------------ | +| Adam Harvey | Cisco | [adamdmharvey](https://github.com/adamdmharvey) | `adamharvey#3739` | +| Andre Wanlin | Keyloop | [awanlin](https://github.com/awanlin) | `Ahhhndre#3095` | +| Andrew Thauer | Wealthsimple | [andrewthauer](https://github.com/andrewthauer) | `andrewthauer#3060` | +| Brian Fletcher | RoadieHQ | [punkle](https://github.com/punkle) | `Brian Fletcher#7051` | +| Carlos Esteban Lopez Jaramillo | VMWare | [luchillo17](https://github.com/luchillo17) | `luchillo17#8777` | +| David Tuite | Roadie | [dtuite](https://github.com/dtuite) | `David Tuite (roadie.io)#1010` | +| Himanshu Mishra | Harness.io | [OrkoHunter](https://github.com/OrkoHunter) | `OrkoHunter#1520` | +| Jamie Klassen | VMware | [jamieklassen](https://github.com/jamieklassen) | `jamieklassen#3047` | +| Jussi Hallila | Roadie | [Xantier](https://github.com/Xantier) | `Xantier#0086` | +| Mark Avery | Cvent | [webark](https://github.com/webark) | `webark#8471` | +| Patrick Jungermann | Bonial International GmbH | [pjungermann](https://github.com/pjungermann) | `pjungermann#6933` | +| Phil Kuang | FactSet Research Systems | [kuangp](https://github.com/kuangp) | `pkuang#3202` | +| Taras Mankovski | Frontside | [taras](https://github.com/taras) | `tarasm#1256` | ## Emeritus Core Maintainers diff --git a/docs/auth/microsoft/azure-easyauth.md b/docs/auth/microsoft/azure-easyauth.md index 4daf0851f0..8ea626288c 100644 --- a/docs/auth/microsoft/azure-easyauth.md +++ b/docs/auth/microsoft/azure-easyauth.md @@ -1,10 +1,12 @@ --- -id: azure-easy-auth +id: easy-auth title: Azure EasyAuth Provider -sidebar_label: Azure EasyAuth +sidebar_label: Azure Easy Auth description: Adding Azure's EasyAuth Proxy as an authentication provider in Backstage --- +The Backstage `core-plugin-api` package comes with a Microsoft authentication provider that can authenticate users using Azure Active Directory for PaaS service hosted in Azure that support Easy Auth, such as Azure App Services. + ## Backstage Changes Add the following into your `app-config.yaml` or `app-config.production.yaml` file diff --git a/docs/backend-system/building-backends/08-migrating.md b/docs/backend-system/building-backends/08-migrating.md index b4005b41b4..539c52b9f6 100644 --- a/docs/backend-system/building-backends/08-migrating.md +++ b/docs/backend-system/building-backends/08-migrating.md @@ -121,7 +121,7 @@ given prefix. In the simple case, what we did above is sufficient, TypeScript is happy, and the backend runs with the new feature. If they do, feel free to skip this entire -section, and deleting `types.ts`. +section, and delete `types.ts`. Sometimes though, type errors can be reported on the newly added line, saying that parts of the `PluginEnvironment` type do not match. This happens when the diff --git a/docs/deployment/docker.md b/docs/deployment/docker.md index 88c22afb9b..f96204b413 100644 --- a/docs/deployment/docker.md +++ b/docs/deployment/docker.md @@ -37,10 +37,6 @@ The required steps in the host build are to install dependencies with `yarn install`, generate type definitions using `yarn tsc`, and build the backend package with `yarn build:backend`. -> NOTE: If you created your app prior to 2021-02-18, follow the -> [migration step](https://github.com/backstage/backstage/releases/tag/release-2021-02-18) -> to move from `backend:build` to `backend:bundle`. - In a CI workflow it might look something like this: ```bash @@ -50,7 +46,8 @@ yarn install --frozen-lockfile yarn tsc # Build the backend, which bundles it all up into the packages/backend/dist folder. -yarn build:backend +# The configuration files here should match the one you use inside the Dockerfile below. +yarn build:backend --config app-config.yaml ``` Once the host build is complete, we are ready to build our image. The following diff --git a/docs/features/kubernetes/proxy.md b/docs/features/kubernetes/proxy.md index b53dfeb29d..7b6837dd7d 100644 --- a/docs/features/kubernetes/proxy.md +++ b/docs/features/kubernetes/proxy.md @@ -69,15 +69,9 @@ Overall, the only changes to each request are: - the endpoint's base URL prefix is stripped. - the `Backstage-Kubernetes-Authorization` header becomes the `Authorization` header that is used when forwarding the request. -## Authentication +The proxy expects a `KubernetesAuthTranslator` to be provided that is used to decorate all requests with `Auth` by default. It does this by supplying a `serviceAccountToken` field into `clusterDetails` using the defined `authProvider` in `clusterDetails`. -Until some security and permission decisions are made (see [this -conversation](https://github.com/backstage/backstage/pull/13026/files#r1029376939) -for context), contributors consuming the proxy endpoint in their plugin code are -responsible for negotiating their own bearer token out-of-band. This requires -knowing some auth details about the cluster being contacted -- in practice, only -clusters with [client side auth -providers](https://backstage.io/docs/features/kubernetes/authentication#client-side-providers) can reasonably be reached. +## Authentication The proxy has no provisions for mTLS, so it cannot be used to connect to clusters using the [x509 Client diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index abb29ab4eb..7de37cb624 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -376,7 +376,7 @@ There are other more specific search results layout components that also accept Recently, the Backstage maintainers [announced the new Backend System](https://backstage.io/blog/2023/02/15/backend-system-alpha). The search plugins are now migrated to support the new backend system. In this guide you will learn how to update your backend set up. -In packages/backend-next/index.ts +In "packages/backend-next/index.ts", install the search plugin [1], the search engine [2], and the search collators/decorators modules [3]: ```ts import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; @@ -386,14 +386,27 @@ import { searchModuleTechDocsCollator } from '@backstage/plugin-search-backend-m import { searchModuleExploreCollator } from '@backstage/plugin-search-backend-module-explore/alpha'; const backend = createBackend(); -// adding the search plugin to the backend +// [1] adding the search plugin to the backend backend.add(searchPlugin()); -// (optional) the default search engine is Lunr, if you want to extend the search backend with another search engine. +// [2] (optional) the default search engine is Lunr, if you want to extend the search backend with another search engine. backend.add(searchModuleElasticsearchEngine()); -// extending search with collator modules to start index documents, take in optional schedule parameters. +// [3] extending search with collator modules to start index documents, take in optional schedule parameters. backend.add(searchModuleCatalogCollator()); backend.add(searchModuleTechDocsCollator()); backend.add(searchModuleExploreCollator()); backend.start(); ``` + +To create your own collators/decorators modules, please use the [searchModuleCatalogCollator](https://github.com/backstage/backstage/blob/d7f955f300893f50c4882ea8f5c09aa42dfaacfd/plugins/search-backend-module-catalog/src/alpha.ts#L49) as an example, we recommend that modules are separated by plugin packages (e.g. `search-backend-module-`). You can also find the available search engines and collator/decorator modules documentation in the Alpha API reports: + +**Search engine modules** + +- Postgres [module](https://github.com/backstage/backstage/blob/d7f955f300893f50c4882ea8f5c09aa42dfaacfd/plugins/search-backend-module-pg/alpha-api-report.md); +- Elasticsearch [module](https://github.com/backstage/backstage/blob/d7f955f300893f50c4882ea8f5c09aa42dfaacfd/plugins/search-backend-module-elasticsearch/alpha-api-report.md). + +**Search collator/decorator modules** + +- Catalog [module](https://github.com/backstage/backstage/blob/d7f955f300893f50c4882ea8f5c09aa42dfaacfd/plugins/search-backend-module-catalog/alpha-api-report.md); +- Explore [module](https://github.com/backstage/backstage/blob/d7f955f300893f50c4882ea8f5c09aa42dfaacfd/plugins/search-backend-module-explore/alpha-api-report.md); +- TechDocs [module](https://github.com/backstage/backstage/blob/d7f955f300893f50c4882ea8f5c09aa42dfaacfd/plugins/search-backend-module-techdocs/alpha-api-report.md). diff --git a/docs/features/software-templates/writing-custom-actions.md b/docs/features/software-templates/writing-custom-actions.md index 7a841dfd0e..f04940a418 100644 --- a/docs/features/software-templates/writing-custom-actions.md +++ b/docs/features/software-templates/writing-custom-actions.md @@ -31,7 +31,7 @@ import { z } from 'zod'; export const createNewFileAction = () => { return createTemplateAction({ - id: 'mycompany:create-file', + id: 'acme:file:create', schema: { input: z.object({ contents: z.string().describe('The contents of the file'), @@ -75,7 +75,7 @@ import { writeFile } from 'fs'; export const createNewFileAction = () => { return createTemplateAction<{ contents: string; filename: string }>({ - id: 'mycompany:create-file', + id: 'acme:file:create', schema: { input: { required: ['contents', 'filename'], @@ -107,6 +107,17 @@ export const createNewFileAction = () => { }; ``` +#### Naming Conventions + +Try to keep names consistent for both your own custom actions, and any actions contributed to open source. We've found that a separation of `:` and using a verb as the last part of the name works well. +We follow `provider:entity:verb` or as close to this as possible for our built in actions. For example, `github:actions:create` or `github:repo:create`. + +Also feel free to use your company name to namespace them if you prefer too, for example `acme:file:create` like above. + +Prefer to use `camelCase` over `snake-case` for these actions if possible, which leads to better reading and writing of template entity definitions. + +> We're aware that there are some exceptions to this, but try to follow as close as possible. We'll be working on migrating these in the repository over time too. + ### The context object When the action `handler` is called, we provide you a `context` as the only diff --git a/docs/features/techdocs/how-to-guides.md b/docs/features/techdocs/how-to-guides.md index 64f7335335..ceccbe1468 100644 --- a/docs/features/techdocs/how-to-guides.md +++ b/docs/features/techdocs/how-to-guides.md @@ -139,21 +139,25 @@ import { TechDocsCustomHome } from '@backstage/plugin-techdocs'; const techDocsTabsConfig = [ { - label: "Recommended Documentation", + label: 'Recommended Documentation', panels: [ { title: 'Golden Path', description: 'Documentation about standards to follow', panelType: 'DocsCardGrid', - filterPredicate: entity => entity?.metadata?.tags?.includes('recommended') ?? false, - } - ] - } -] + filterPredicate: entity => + entity?.metadata?.tags?.includes('recommended') ?? false, + }, + ], + }, +]; const AppRoutes = () => { - }> + } + /> ; }; ``` diff --git a/docs/integrations/bitbucketCloud/discovery.md b/docs/integrations/bitbucketCloud/discovery.md index c5a7eee4a0..6e1533dea0 100644 --- a/docs/integrations/bitbucketCloud/discovery.md +++ b/docs/integrations/bitbucketCloud/discovery.md @@ -76,36 +76,37 @@ Additionally, you need to decide how you want to receive events from external so Set up your provider -```ts title="packages/backend/src/plugins/catalogEventBasedProviders.ts" +```ts title="packages/backend/src/plugins/catalog.ts" +import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; /* highlight-add-start */ -import { CatalogClient } from '@backstage/catalog-client'; import { BitbucketCloudEntityProvider } from '@backstage/plugin-catalog-backend-module-bitbucket-cloud'; /* highlight-add-end */ -import { EntityProvider } from '@backstage/plugin-catalog-node'; -import { EventSubscriber } from '@backstage/plugin-events-node'; + +import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; +import { Router } from 'express'; import { PluginEnvironment } from '../types'; -export default async function createCatalogEventBasedProviders( - /* highlight-remove-next-line */ - _: PluginEnvironment, - /* highlight-add-next-line */ +export default async function createPlugin( env: PluginEnvironment, -): Promise> { - const providers: Array< - (EntityProvider & EventSubscriber) | Array - > = []; - // add your event-based entity providers here +): Promise { + const builder = await CatalogBuilder.create(env); + builder.addProcessor(new ScaffolderEntitiesProcessor()); /* highlight-add-start */ - providers.push( - BitbucketCloudEntityProvider.fromConfig(env.config, { + const bitbucketCloudProvider = BitbucketCloudEntityProvider.fromConfig( + env.config, + { catalogApi: new CatalogClient({ discoveryApi: env.discovery }), logger: env.logger, scheduler: env.scheduler, tokenManager: env.tokenManager, - }), + }, ); + env.eventBroker.subscribe(bitbucketCloudProvider); + builder.addEntityProvider(bitbucketCloudProvider); /* highlight-add-end */ - return providers.flat(); + const { processingEngine, router } = await builder.build(); + await processingEngine.start(); + return router; } ``` diff --git a/docs/integrations/github/discovery.md b/docs/integrations/github/discovery.md index fb65173b28..7d7744cb09 100644 --- a/docs/integrations/github/discovery.md +++ b/docs/integrations/github/discovery.md @@ -69,37 +69,36 @@ Additionally, you need to decide how you want to receive events from external so Set up your provider -```ts title="packages/backend/src/plugins/catalogEventBasedProviders.ts" +```ts title="packages/backend/src/plugins/catalog.ts" +import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; /* highlight-add-next-line */ import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; -import { EntityProvider } from '@backstage/plugin-catalog-node'; -import { EventSubscriber } from '@backstage/plugin-events-node'; +import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; +import { Router } from 'express'; import { PluginEnvironment } from '../types'; -export default async function createCatalogEventBasedProviders( - /* highlight-remove-next-line */ - _: PluginEnvironment, - /* highlight-add-next-line */ + +export default async function createPlugin( env: PluginEnvironment, -): Promise> { - const providers: Array< - (EntityProvider & EventSubscriber) | Array - > = []; - // add your event-based entity providers here +): Promise { + const builder = await CatalogBuilder.create(env); + builder.addProcessor(new ScaffolderEntitiesProcessor()); /* highlight-add-start */ - providers.push( - GithubEntityProvider.fromConfig(env.config, { - logger: env.logger, - // optional: alternatively, use scheduler with schedule defined in app-config.yaml - schedule: env.scheduler.createScheduledTaskRunner({ - frequency: { minutes: 30 }, - timeout: { minutes: 3 }, - }), - // optional: alternatively, use schedule - scheduler: env.scheduler, + const githubProvider = GithubEntityProvider.fromConfig(env.config, { + logger: env.logger, + // optional: alternatively, use scheduler with schedule defined in app-config.yaml + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 30 }, + timeout: { minutes: 3 }, }), - ); + // optional: alternatively, use schedule + scheduler: env.scheduler, + }); + env.eventBroker.subscribe(githubProvider); + builder.addEntityProvider(demoProvider); /* highlight-add-end */ - return providers.flat(); + const { processingEngine, router } = await builder.build(); + await processingEngine.start(); + return router; } ``` diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md index 8f67e2a43f..ccffe60bd1 100644 --- a/docs/integrations/github/org.md +++ b/docs/integrations/github/org.md @@ -79,25 +79,21 @@ Additionally, you need to decide how you want to receive events from external so Set up your provider -```ts title="packages/backend/src/plugins/catalogEventBasedProviders.ts" +```ts title="packages/backend/src/plugins/catalog.ts" +import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; /* highlight-add-next-line */ import { GithubOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; -import { EntityProvider } from '@backstage/plugin-catalog-node'; -import { EventSubscriber } from '@backstage/plugin-events-node'; +import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; +import { Router } from 'express'; import { PluginEnvironment } from '../types'; -export default async function createCatalogEventBasedProviders( - /* highlight-remove-next-line */ - _: PluginEnvironment, - /* highlight-add-next-line */ + +export default async function createPlugin( env: PluginEnvironment, -): Promise> { - const providers: Array< - (EntityProvider & EventSubscriber) | Array - > = []; - // add your event-based entity providers here +): Promise { + const builder = await CatalogBuilder.create(env); + builder.addProcessor(new ScaffolderEntitiesProcessor()); /* highlight-add-start */ - providers.push( - GithubOrgEntityProvider.fromConfig(env.config, { + const githubOrgProvider = GithubOrgEntityProvider.fromConfig(env.config, { id: 'production', orgUrl: 'https://github.com/backstage', logger: env.logger, @@ -105,10 +101,12 @@ export default async function createCatalogEventBasedProviders( frequency: { minutes: 60 }, timeout: { minutes: 15 }, }), - }), - ); + env.eventBroker.subscribe(githubOrgProvider); + builder.addEntityProvider(githubOrgProvider); /* highlight-add-end */ - return providers.flat(); + const { processingEngine, router } = await builder.build(); + await processingEngine.start(); + return router; } ``` diff --git a/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md b/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md index 103e463cda..e714301ded 100644 --- a/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md +++ b/docs/permissions/plugin-authors/03-adding-a-resource-permission-check.md @@ -91,7 +91,7 @@ This enables decisions based on characteristics of the resource, but it's import Install the missing module: ```bash -$ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-node zod@~3.18.0 +$ yarn workspace @internal/plugin-todo-list-backend add @backstage/plugin-permission-node zod ``` Create a new `plugins/todo-list-backend/src/service/rules.ts` file and append the following code: diff --git a/docs/plugins/backend-plugin.md b/docs/plugins/backend-plugin.md index 9ce835f5f5..73b8f9027a 100644 --- a/docs/plugins/backend-plugin.md +++ b/docs/plugins/backend-plugin.md @@ -184,9 +184,10 @@ export async function createRouter( options: RouterOptions, ): Promise { const router = Router(); + const { identity } = options; router.post('/example', async (req, res) => { - const identity = await identity.getIdentity({ request: req }); + const userIdentity = await identity.getIdentity({ request: req }); ... }); ``` diff --git a/docs/plugins/composability.md b/docs/plugins/composability.md index 124a612f26..b18bae31c6 100644 --- a/docs/plugins/composability.md +++ b/docs/plugins/composability.md @@ -196,14 +196,14 @@ const App = () => ( There are a couple of naming patterns to adhere to as you build plugins, which helps clarify the intent and usage of the exports. -| Description | Pattern | Examples | -| --------------------- | ----------------- | ---------------------------------------------------- | -| Top-level Pages | `\*Page` | `CatalogIndexPage`, `SettingsPage`, `LighthousePage` | -| Entity Tab Content | `Entity\*Content` | `EntityJenkinsContent`, `EntityKubernetesContent` | -| Entity Overview Card | `Entity\*Card` | `EntitySentryCard`, `EntityPagerDutyCard` | -| Entity Conditional | `is\*Available` | `isPagerDutyAvailable`, `isJenkinsAvailable` | -| Plugin Instance | `\*Plugin` | `jenkinsPlugin`, `catalogPlugin` | -| Utility API Reference | `\*ApiRef` | `configApiRef`, `catalogApiRef` | +| Description | Pattern | Examples | +| --------------------- | ---------------- | ---------------------------------------------------- | +| Top-level Pages | `*Page` | `CatalogIndexPage`, `SettingsPage`, `LighthousePage` | +| Entity Tab Content | `Entity*Content` | `EntityJenkinsContent`, `EntityKubernetesContent` | +| Entity Overview Card | `Entity*Card` | `EntitySentryCard`, `EntityPagerDutyCard` | +| Entity Conditional | `is*Available` | `isPagerDutyAvailable`, `isJenkinsAvailable` | +| Plugin Instance | `*Plugin` | `jenkinsPlugin`, `catalogPlugin` | +| Utility API Reference | `*ApiRef` | `configApiRef`, `catalogApiRef` | ### Routing System diff --git a/docs/plugins/structure-of-a-plugin.md b/docs/plugins/structure-of-a-plugin.md index 8bf21bf589..8878e1c04d 100644 --- a/docs/plugins/structure-of-a-plugin.md +++ b/docs/plugins/structure-of-a-plugin.md @@ -13,7 +13,8 @@ The new plugin should look something like: ``` new-plugin/ - dist/ + dev/ + index.ts node_modules/ src/ components/ @@ -29,11 +30,10 @@ new-plugin/ plugin.test.ts plugin.ts routes.ts - jest.config.js - jest.setup.ts + setupTests.ts + .eslintrc.js package.json README.md - tsconfig.json ``` You might note a thing or two. Yes, a plugin looks like a mini project on it's @@ -48,8 +48,7 @@ folder. ## Base files -In the root folder you have some configuration for typescript and jest, the test -runner. You get a readme to populate with info about your plugin and a +You get a readme to populate with info about your plugin and a package.json to declare the plugin dependencies, metadata and scripts. ## The plugin file @@ -92,7 +91,7 @@ The generated plugin includes two example components to showcase how we structure our plugins. There are usually one or multiple page components and next to them you can split up the UI in as many components as you feel like. -We have the `ExamplePage` to show an example Backstage page component. The +We have the `ExampleComponent` to show an example Backstage page component. The `ExampleFetchComponent` showcases the common task of making an async request to a public API and plot the response data in a table using Material-UI components. diff --git a/docs/releases/v1.13.0-next.1-changelog.md b/docs/releases/v1.13.0-next.1-changelog.md new file mode 100644 index 0000000000..18d21e2d0a --- /dev/null +++ b/docs/releases/v1.13.0-next.1-changelog.md @@ -0,0 +1,2596 @@ +# Release v1.13.0-next.1 + +## @backstage/plugin-kubernetes-backend@0.10.0-next.1 + +### Minor Changes + +- 88fbb3d075a: Add support for the new plugin system to the Kubernetes plugin + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + +## @backstage/plugin-scaffolder-backend@1.13.0-next.1 + +### Minor Changes + +- 30ffdae70f9: Added `fetch:plain:file` action to fetch a single file, this action is also added to the list of built-in actions. + +- 65e989f4018: Added the possibility to authorize parameters and steps of a template + + The scaffolder plugin is now integrated with the permission framework. + It is possible to toggle parameters or actions within templates by marking each section with specific `tags`, inside a `backstage:permissions` property under each parameter or action. Each parameter or action can then be permissioned by using a conditional decision containing the `scaffolderTemplateRules.hasTag` rule. + +- 95ea9f69b6f: Provide some more default filters out of the box and refactoring how the filters are applied to the `SecureTemplater`. + + - `parseEntityRef` will take an string entity triplet and return a parsed object. + - `pick` will allow you to reference a specific property in the piped object. + + So you can now combine things like this: `${{ parameters.entity | parseEntityRef | pick('name') }}` to get the name of a specific entity, or `${{ parameters.repoUrl | parseRepoUrl | pick('owner') }}` to get the owner of a repo. + +### Patch Changes + +- a7eb36c6e38: Improve type-check for scaffolder output parameters +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.0-next.0 + +### Minor Changes + +- 1b49a18bf8d: Created `confluence:transform:markdown` action for converting confluence docs to Markdown. + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/plugin-search-backend@1.3.0-next.1 + +### Minor Changes + +- 1469daa409e: Exports search plugin that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-backend-module-catalog@0.1.0-next.0 + +### Minor Changes + +- 01ae205352e: Package introduced to export search backend modules that can be used with the new backend system to extend search with plugin specific functionality, such as collators. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.1 + +### Minor Changes + +- 1469daa409e: Search backend modules migrated to the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-backend-module-explore@0.1.0-next.0 + +### Minor Changes + +- 01ae205352e: Package introduced to export search backend modules that can be used with the new backend system to extend search with plugin specific functionality, such as collators. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-backend-module-techdocs@0.1.0-next.0 + +### Minor Changes + +- 01ae205352e: Package introduced to export search backend modules that can be used with the new backend system to extend search with plugin specific functionality, such as collators. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-techdocs-node@1.6.1-next.1 + +## @backstage/plugin-search-backend-node@1.2.0-next.1 + +### Minor Changes + +- 1469daa409e: Exports services and extension points that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/app-defaults@1.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/backend-app-api@0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## @backstage/backend-common@0.18.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-app-api@0.4.2-next.1 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/integration-aws-node@0.1.2 + - @backstage/types@1.0.2 + +## @backstage/backend-defaults@0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + +## @backstage/backend-plugin-api@0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## @backstage/backend-tasks@0.5.1-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/backend-test-utils@0.1.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## @backstage/cli@0.22.6-next.1 + +### Patch Changes + +- 24432ae52fb: Fix the build for packages with multiple entry points to avoid duplicated modules. +- 79e91d4c30a: Support importing `.md` files in build loader +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- b588ab73972: Ensure that the `package prepack` command and backend bundling uses posix paths in `package.json` on all OSes. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/eslint-plugin@0.1.3-next.0 + - @backstage/release-manifests@0.0.9 + - @backstage/types@1.0.2 + +## @backstage/core-app-api@1.7.0-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/core-components@0.12.6-next.1 + +### Patch Changes + +- d0befd3fb23: Fixed a bug that could prevent auth from working when using the `guest` or `custom` auth providers. +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/core-plugin-api@1.5.1-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/create-app@0.4.39-next.1 + +### Patch Changes + +- 71fd0966d10: Add `permissionApi` as dependency of the scaffolder-backend plugin +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/dev-utils@1.0.14-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/test-utils@1.3.0-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/app-defaults@1.3.0-next.1 + - @backstage/catalog-model@1.2.1 + +## @backstage/integration@1.4.4-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/integration-react@1.1.12-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + +## @backstage/repo-tools@0.1.4-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + +## @techdocs/cli@1.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/plugin-techdocs-node@1.6.1-next.1 + +## @backstage/test-utils@1.3.0-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/theme@0.2.19-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies + +## @backstage/version-bridge@1.0.4-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies + +## @backstage/plugin-adr@0.4.2-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-adr-common@0.2.8-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-adr-backend@0.3.2-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-adr-common@0.2.8-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-adr-common@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-airbrake@0.3.17-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/test-utils@1.3.0-next.1 + - @backstage/dev-utils@1.0.14-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-airbrake-backend@0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-allure@0.1.33-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-analytics-module-ga@0.1.28-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-apache-airflow@0.2.10-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + +## @backstage/plugin-api-docs@0.9.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-catalog@1.10.0-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-api-docs-module-protoc-gen-doc@0.1.2-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies + +## @backstage/plugin-apollo-explorer@0.1.10-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-app-backend@0.3.44-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-backend@0.18.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## @backstage/plugin-auth-node@0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-azure-devops@0.2.8-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-devops-backend@0.3.23-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-sites@0.1.6-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-azure-sites-backend@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-badges@0.2.41-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-badges-backend@0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-bazaar@0.2.7-next.1 + +### Patch Changes + +- 656914bb0ad: Added the `fullWidth` and `fullHeight` optional properties to the `BazaarPage`, + to replicate the styling options available on the `BazaarOverviewCard`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/cli@0.22.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-catalog@1.10.0-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-bazaar-backend@0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + +## @backstage/plugin-bitrise@0.1.44-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-catalog@1.10.0-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-catalog-backend@1.8.1-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- c4b846359c0: Allow replacement of the BuiltinKindsEntityProcessor which enables customization of schema validation and connections emitted. +- 01ae205352e: Collator factories instantiated in new backend system modules and now marked as deprecated. Will be continued to be exported publicly until the new backend system is fully rolled out. +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.0 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.1.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + +## @backstage/plugin-catalog-backend-module-azure@0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-catalog-backend-module-github@0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-catalog-common@1.0.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-catalog-graph@0.2.29-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-catalog-graphql@0.3.20-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-import@0.9.7-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## @backstage/plugin-catalog-node@1.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## @backstage/plugin-catalog-react@1.4.1-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## @backstage/plugin-cicd-statistics@0.1.19-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.13-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-cicd-statistics@0.1.19-next.1 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-circleci@0.3.17-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-cloudbuild@0.3.17-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-code-climate@0.1.17-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-code-coverage@0.2.10-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-code-coverage-backend@0.2.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-codescene@0.1.12-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-config-schema@0.1.40-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/plugin-cost-insights@0.12.6-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-cost-insights-common@0.1.1 + +## @backstage/plugin-dynatrace@3.0.1-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-entity-feedback@0.2.0-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + +## @backstage/plugin-entity-feedback-backend@0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + +## @backstage/plugin-entity-validation@0.1.2-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## @backstage/plugin-events-backend@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-events-backend-module-aws-sqs@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-events-backend-module-azure@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-events-backend-module-gerrit@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-events-backend-module-github@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-events-backend-module-gitlab@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-events-backend-test-utils@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.5-next.1 + +## @backstage/plugin-events-node@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.1 + +## @backstage/plugin-explore@0.4.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-explore-react@0.0.28-next.0 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-explore-backend@0.0.6-next.1 + +### Patch Changes + +- 01ae205352e: Collator factories instantiated in new backend system modules and now marked as deprecated. Will be continued to be exported publicly until the new backend system is fully rolled out. +- Updated dependencies + - @backstage/plugin-search-backend-module-explore@0.1.0-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-explore-react@0.0.28-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-explore-common@0.0.1 + +## @backstage/plugin-firehydrant@0.2.1-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-fossa@0.2.49-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-gcalendar@0.3.13-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/errors@1.1.5 + +## @backstage/plugin-gcp-projects@0.3.36-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-git-release-manager@0.3.30-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-github-actions@0.5.17-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-github-deployments@0.1.48-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-github-issues@0.2.6-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-github-pull-requests-board@0.1.11-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-gitops-profiles@0.3.35-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-gocd@0.1.23-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-graphiql@0.2.49-next.1 + +### Patch Changes + +- 8b9e8ece403: Allow to pass lazy GraphQL endpoint URL +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-graphql-backend@0.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-graphql@0.3.20-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-graphql-voyager@0.1.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-home@0.4.33-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-ilert@0.2.6-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-jenkins@0.7.16-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-jenkins-common@0.1.15-next.0 + +## @backstage/plugin-jenkins-backend@0.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-jenkins-common@0.1.15-next.0 + +## @backstage/plugin-jenkins-common@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## @backstage/plugin-kafka@0.3.17-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-kafka-backend@0.2.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-kubernetes@0.7.10-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + +## @backstage/plugin-kubernetes-common@0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-lighthouse@0.4.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-lighthouse-backend@0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-linguist@0.1.2-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-linguist-backend@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-microsoft-calendar@0.1.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/errors@1.1.5 + +## @backstage/plugin-newrelic@0.3.35-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-newrelic-dashboard@0.2.10-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-octopus-deploy@0.1.1-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-org@0.6.7-next.1 + +### Patch Changes + +- d7c8d8c52dd: Allow the title of the group profile card to use the title of the entity, if it is set. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-org-react@0.1.6-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-pagerduty@0.5.10-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-periskop@0.1.15-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-periskop-backend@0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-backend@0.5.19-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## @backstage/plugin-permission-common@0.7.5-next.0 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/plugin-permission-node@0.7.7-next.1 + +### Patch Changes + +- 71fd0966d10: Added createConditionAuthorizer utility function, which takes some permission conditions and returns a function that returns a definitive authorization result given a decision and a resource. +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## @backstage/plugin-permission-react@0.4.12-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-playlist@0.1.8-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-playlist-common@0.1.6-next.0 + +## @backstage/plugin-playlist-backend@0.2.7-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-playlist-common@0.1.6-next.0 + +## @backstage/plugin-playlist-common@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + +## @backstage/plugin-proxy-backend@0.2.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-rollbar@0.4.17-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-rollbar-backend@0.1.41-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-scaffolder@1.13.0-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/plugin-scaffolder-react@1.3.0-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-common@1.2.7-next.1 + +### Patch Changes + +- 65e989f4018: Added permissions for authorizing parameters and steps +- 65e989f4018: Define optional `backstage:permissions` property to parameters and steps used to authorize part of the template using the permission framework +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-node@0.1.2-next.1 + +### Patch Changes + +- a7eb36c6e38: Improve type-check for scaffolder output parameters +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-react@1.3.0-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/plugin-search@1.1.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-backend-module-pg@0.5.5-next.1 + +### Patch Changes + +- 1469daa409e: Search backend modules migrated to the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). +- Updated dependencies + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-common@1.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-search-react@1.5.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-sentry@0.5.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-shortcuts@0.3.9-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-sonarqube@0.6.6-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-sonarqube-react@0.1.5-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-sonarqube-backend@0.1.9-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-sonarqube-react@0.1.5-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-splunk-on-call@0.4.6-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-stack-overflow@0.1.13-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-home@0.4.33-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-stack-overflow-backend@0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-stackstorm@0.1.1-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/errors@1.1.5 + +## @backstage/plugin-tech-insights@0.3.9-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-insights-backend@0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.1 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.1 + +## @backstage/plugin-tech-insights-node@0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-radar@0.6.3-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-techdocs@1.6.1-next.1 + +### Patch Changes + +- 6c809d1a41c: Minor visual tweaks to adapt to changes in mkdocs-material v9 + +- 847a1eee3da: Change anchor links color in Techdocs content + + With the color (mkdocs supplied) used for anchor links the background and foreground colors do not have a sufficient contrast ratio. Using the link color from theme palette. + +- e0c6e8b9c3c: Update peer dependencies + +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.12-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/plugin-techdocs@1.6.1-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/test-utils@1.3.0-next.1 + - @backstage/plugin-catalog@1.10.0-next.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-techdocs-backend@1.6.1-next.1 + +### Patch Changes + +- 01ae205352e: Collator factories instantiated in new backend system modules and now marked as deprecated. Will be continued to be exported publicly until the new backend system is fully rolled out. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.0 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-techdocs-node@1.6.1-next.1 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-techdocs-node@1.6.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration-aws-node@0.1.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-techdocs-react@1.1.5-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-todo@0.2.19-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-todo-backend@0.1.41-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.1 + +## @backstage/plugin-user-settings@0.7.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/plugin-user-settings-backend@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## @backstage/plugin-vault@0.1.11-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-vault-backend@0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-xcmetrics@0.2.37-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/errors@1.1.5 + +## example-app@0.2.82-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/cli@0.22.6-next.1 + - @backstage/plugin-org@0.6.7-next.1 + - @backstage/plugin-techdocs@1.6.1-next.1 + - @backstage/plugin-scaffolder-react@1.3.0-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/plugin-scaffolder@1.13.0-next.1 + - @backstage/plugin-dynatrace@3.0.1-next.1 + - @backstage/plugin-airbrake@0.3.17-next.1 + - @backstage/plugin-circleci@0.3.17-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/plugin-stackstorm@0.1.1-next.1 + - @backstage/plugin-linguist@0.1.2-next.1 + - @backstage/plugin-playlist@0.1.8-next.1 + - @backstage/plugin-graphiql@0.2.49-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.1 + - @backstage/plugin-microsoft-calendar@0.1.2-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.10-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/plugin-entity-feedback@0.2.0-next.1 + - @backstage/plugin-apache-airflow@0.2.10-next.1 + - @backstage/plugin-catalog-import@0.9.7-next.1 + - @backstage/plugin-github-actions@0.5.17-next.1 + - @backstage/plugin-stack-overflow@0.1.13-next.1 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/plugin-catalog-graph@0.2.29-next.1 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-code-coverage@0.2.10-next.1 + - @backstage/plugin-cost-insights@0.12.6-next.1 + - @backstage/plugin-tech-insights@0.3.9-next.1 + - @backstage/plugin-user-settings@0.7.2-next.1 + - @backstage/plugin-azure-devops@0.2.8-next.1 + - @backstage/plugin-gcp-projects@0.3.36-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/plugin-azure-sites@0.1.6-next.1 + - @backstage/plugin-cloudbuild@0.3.17-next.1 + - @backstage/plugin-kubernetes@0.7.10-next.1 + - @backstage/plugin-lighthouse@0.4.2-next.1 + - @backstage/plugin-tech-radar@0.6.3-next.1 + - @backstage/plugin-gcalendar@0.3.13-next.1 + - @backstage/plugin-pagerduty@0.5.10-next.1 + - @backstage/plugin-shortcuts@0.3.9-next.1 + - @backstage/plugin-api-docs@0.9.2-next.1 + - @backstage/plugin-newrelic@0.3.35-next.1 + - @backstage/plugin-explore@0.4.2-next.1 + - @backstage/plugin-jenkins@0.7.16-next.1 + - @backstage/plugin-rollbar@0.4.17-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-badges@0.2.41-next.1 + - @backstage/plugin-search@1.1.2-next.1 + - @backstage/plugin-sentry@0.5.2-next.1 + - @backstage/plugin-kafka@0.3.17-next.1 + - @backstage/plugin-gocd@0.1.23-next.1 + - @backstage/plugin-home@0.4.33-next.1 + - @backstage/plugin-todo@0.2.19-next.1 + - @backstage/app-defaults@1.3.0-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @internal/plugin-catalog-customized@0.0.9-next.1 + +## example-backend@0.2.82-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend@1.3.0-next.1 + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.5-next.1 + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-backend@0.5.19-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-playlist-backend@0.2.7-next.1 + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/plugin-adr-backend@0.3.2-next.1 + - @backstage/plugin-kubernetes-backend@0.10.0-next.1 + - @backstage/plugin-techdocs-backend@1.6.1-next.1 + - @backstage/plugin-explore-backend@0.0.6-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.18.2-next.1 + - example-app@0.2.82-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-app-backend@0.3.44-next.1 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-azure-devops-backend@0.3.23-next.1 + - @backstage/plugin-azure-sites-backend@0.1.6-next.1 + - @backstage/plugin-badges-backend@0.1.38-next.1 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-code-coverage-backend@0.2.10-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.2-next.1 + - @backstage/plugin-events-backend@0.2.5-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + - @backstage/plugin-graphql-backend@0.1.34-next.1 + - @backstage/plugin-jenkins-backend@0.1.34-next.1 + - @backstage/plugin-kafka-backend@0.2.37-next.1 + - @backstage/plugin-lighthouse-backend@0.1.2-next.1 + - @backstage/plugin-linguist-backend@0.2.1-next.1 + - @backstage/plugin-proxy-backend@0.2.38-next.1 + - @backstage/plugin-rollbar-backend@0.1.41-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-tech-insights-backend@0.5.10-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.1 + - @backstage/plugin-tech-insights-node@0.4.2-next.1 + - @backstage/plugin-todo-backend@0.1.41-next.1 + +## example-backend-next@0.0.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend@1.3.0-next.1 + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/plugin-kubernetes-backend@0.10.0-next.1 + - @backstage/plugin-techdocs-backend@1.6.1-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.0 + - @backstage/backend-defaults@0.1.9-next.1 + - @backstage/plugin-app-backend@0.3.44-next.1 + - @backstage/plugin-todo-backend@0.1.41-next.1 + +## e2e-test@0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.39-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + +## techdocs-cli-embedded-app@0.2.81-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/cli@0.22.6-next.1 + - @backstage/plugin-techdocs@1.6.1-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/test-utils@1.3.0-next.1 + - @backstage/plugin-catalog@1.10.0-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/app-defaults@1.3.0-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## @internal/plugin-catalog-customized@0.0.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-catalog@1.10.0-next.1 + +## @internal/plugin-todo-list@1.0.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + +## @internal/plugin-todo-list-backend@1.0.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## @internal/plugin-todo-list-common@1.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 diff --git a/docs/releases/v1.13.0-next.2-changelog.md b/docs/releases/v1.13.0-next.2-changelog.md new file mode 100644 index 0000000000..a6c4808306 --- /dev/null +++ b/docs/releases/v1.13.0-next.2-changelog.md @@ -0,0 +1,2337 @@ +# Release v1.13.0-next.2 + +## @backstage/plugin-kubernetes-backend@0.10.0-next.2 + +### Minor Changes + +- e6c7c850129: Plugins that instantiate the `KubernetesProxy` must now provide a parameter of the type `KubernetesProxyOptions` which includes providing a `KubernetesAuthTranslator`. The `KubernetesBuilder` now builds its own `KubernetesAuthTranslatorMap` that it provides to the `KubernetesProxy`. The `DispatchingKubernetesAuthTranslator` expects a `KubernetesTranslatorMap` to be provided as a parameter. The `KubernetesBuilder` now has a method called `setAuthTranslatorMap` which allows integrators to bring their own `KubernetesAuthTranslator's` to the `KubernetesPlugin`. + +### Patch Changes + +- 76e8f08fa24: fix localKubectlProxy auth provider fetching +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## @backstage/plugin-scaffolder@1.13.0-next.2 + +### Minor Changes + +- cf18c32934a: The Installed Actions page now shows details for nested objects and arrays + +### Patch Changes + +- 90dda42cfd2: bug: Invert `templateFilter` predicate to align with `Array.filter` +- 34dab7ee7f8: `scaffolder/next`: bump `rjsf` dependencies to `5.5.0` +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/plugin-scaffolder-react@1.3.0-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-react@0.4.12-next.1 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + +## @backstage/plugin-search@1.2.0-next.2 + +### Minor Changes + +- d6b73b0380d: Search modal auto closes on location change + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## @backstage/app-defaults@1.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-permission-react@0.4.12-next.1 + +## @backstage/backend-app-api@0.4.2-next.2 + +### Patch Changes + +- 5c7ce585824: Allow an additionalConfig to be provided to loadBackendConfig that fetches config values during runtime. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## @backstage/backend-common@0.18.4-next.2 + +### Patch Changes + +- 5c7ce585824: Allow an additionalConfig to be provided to loadBackendConfig that fetches config values during runtime. +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.2 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-aws-node@0.1.2 + - @backstage/types@1.0.2 + +## @backstage/backend-defaults@0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + +## @backstage/backend-plugin-api@0.5.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## @backstage/backend-tasks@0.5.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## @backstage/backend-test-utils@0.1.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## @backstage/catalog-client@1.4.1-next.0 + +### Patch Changes + +- c1c4e080b79: Fixed bug in `queryEntities` of `CatalogClient` where the `sortField` is supposed to be changed to `orderField`. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/cli@0.22.6-next.2 + +### Patch Changes + +- 8075b67e64c: When building a backend package with dependencies any `--config ` options will now be forwarded to any dependent app package builds, unless the build script in the app package already contains a `--config` option. +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/eslint-plugin@0.1.3-next.0 + - @backstage/release-manifests@0.0.9 + - @backstage/types@1.0.2 + +## @backstage/core-app-api@1.7.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + +## @backstage/core-components@0.12.6-next.2 + +### Patch Changes + +- 67140d9f96f: Upgrade `react-virtualized-auto-sizer´ to version `^1.0.11\` +- 7e60bee2dea: Split the `BackstageSidebar` style `drawer` class, such that the `width` property is in a separate `drawerWidth` class instead. This makes it such that you can style the `drawer` class in your theme again. +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/version-bridge@1.0.4-next.0 + +## @backstage/core-plugin-api@1.5.1-next.1 + +### Patch Changes + +- 2898b6c8d52: Minor type tweaks for TypeScript 5.0 +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + +## @backstage/create-app@0.4.39-next.2 + +### Patch Changes + +- 2945923b133: Upgraded the TypeScript version to 5.0 + + To apply this change in your own project, switch the TypeScript version in your root `package.json`: + + ```diff + - "typescript": "~4.6.4", + + "typescript": "~5.0.0", + ``` + +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/dev-utils@1.0.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/app-defaults@1.3.0-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/test-utils@1.3.0-next.2 + - @backstage/theme@0.2.19-next.0 + +## @backstage/integration-react@1.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## @techdocs/cli@1.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/plugin-techdocs-node@1.6.1-next.2 + +## @backstage/test-utils@1.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-permission-react@0.4.12-next.1 + +## @backstage/plugin-adr@0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-adr-common@0.2.8-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## @backstage/plugin-adr-backend@0.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-adr-common@0.2.8-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-airbrake@0.3.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/dev-utils@1.0.14-next.2 + - @backstage/test-utils@1.3.0-next.2 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-airbrake-backend@0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + +## @backstage/plugin-allure@0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-analytics-module-ga@0.1.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-apache-airflow@0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + +## @backstage/plugin-api-docs@0.9.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog@1.10.0-next.2 + +## @backstage/plugin-apollo-explorer@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-app-backend@0.3.44-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-backend@0.18.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## @backstage/plugin-auth-node@0.2.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-azure-devops@0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-devops-backend@0.3.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-sites@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-azure-sites-backend@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-badges@0.2.41-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-badges-backend@0.1.38-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-bazaar@0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.6-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog@1.10.0-next.2 + +## @backstage/plugin-bazaar-backend@0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## @backstage/plugin-bitrise@0.1.44-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-catalog@1.10.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## @backstage/plugin-catalog-backend@1.8.1-next.2 + +### Patch Changes + +- 62a725e3a94: Use the `LocationSpec` type from the `catalog-common` package in place of the deprecated `LocationSpec` from the `catalog-node` package. +- c36b89f2af3: Fixed bug in the `DefaultCatalogProcessingEngine` where entities that contained multiple different types of relations for the same source entity would not properly trigger stitching for that source entity. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.1.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + +## @backstage/plugin-catalog-backend-module-azure@0.1.15-next.2 + +### Patch Changes + +- 62a725e3a94: Use the `LocationSpec` type from the `catalog-common` package in place of the deprecated `LocationSpec` from the `catalog-node` package. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## @backstage/plugin-catalog-backend-module-github@0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + +## @backstage/plugin-catalog-backend-module-gitlab@0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.3.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## @backstage/plugin-catalog-graph@0.2.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-catalog-import@0.9.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## @backstage/plugin-catalog-node@1.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## @backstage/plugin-catalog-react@1.4.1-next.2 + +### Patch Changes + +- 81bee24c5de: Fixed bug in catalog filters where you could not click on the text to select a value. +- 2898b6c8d52: Minor type tweaks for TypeScript 5.0 +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-permission-react@0.4.12-next.1 + +## @backstage/plugin-cicd-statistics@0.1.19-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cicd-statistics@0.1.19-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-circleci@0.3.17-next.2 + +### Patch Changes + +- d14ac997c36: Add hover over CircleCI avatar icon to show user name in builds table +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-cloudbuild@0.3.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-code-climate@0.1.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-code-coverage@0.2.10-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-code-coverage-backend@0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + +## @backstage/plugin-codescene@0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-config-schema@0.1.40-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-cost-insights@0.12.6-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-cost-insights-common@0.1.1 + +## @backstage/plugin-dynatrace@3.0.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-entity-feedback@0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + +## @backstage/plugin-entity-feedback-backend@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + +## @backstage/plugin-entity-validation@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## @backstage/plugin-events-backend@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-events-node@0.2.5-next.2 + +## @backstage/plugin-events-backend-module-aws-sqs@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-events-node@0.2.5-next.2 + +## @backstage/plugin-events-backend-module-azure@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + +## @backstage/plugin-events-backend-module-gerrit@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + +## @backstage/plugin-events-backend-module-github@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-events-node@0.2.5-next.2 + +## @backstage/plugin-events-backend-module-gitlab@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-events-node@0.2.5-next.2 + +## @backstage/plugin-events-backend-test-utils@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.5-next.2 + +## @backstage/plugin-events-node@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.2 + +## @backstage/plugin-explore@0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.28-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## @backstage/plugin-explore-backend@0.0.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-explore-react@0.0.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/plugin-explore-common@0.0.1 + +## @backstage/plugin-firehydrant@0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-fossa@0.2.49-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-gcalendar@0.3.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-gcp-projects@0.3.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-git-release-manager@0.3.30-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-github-actions@0.5.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-github-deployments@0.1.48-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-github-issues@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-github-pull-requests-board@0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-gitops-profiles@0.3.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-gocd@0.1.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-graphiql@0.2.49-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-graphql-backend@0.1.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-graphql@0.3.20-next.1 + +## @backstage/plugin-graphql-voyager@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-home@0.4.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-ilert@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-jenkins@0.7.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-jenkins-common@0.1.15-next.0 + +## @backstage/plugin-jenkins-backend@0.1.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-jenkins-common@0.1.15-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## @backstage/plugin-kafka@0.3.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-kafka-backend@0.2.37-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-kubernetes@0.7.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + +## @backstage/plugin-lighthouse@0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-lighthouse-backend@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-linguist@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-linguist-backend@0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-microsoft-calendar@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-newrelic@0.3.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-newrelic-dashboard@0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## @backstage/plugin-octopus-deploy@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-org@0.6.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-org-react@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-pagerduty@0.5.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-periskop@0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-periskop-backend@0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-backend@0.5.19-next.2 + +### Patch Changes + +- 84946a580c4: Introduced alpha export of the `permissionPlugin` for use in the new backend system, along with a `permissionModuleAllowAllPolicy` that can be used to allow all requests. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## @backstage/plugin-permission-node@0.7.7-next.2 + +### Patch Changes + +- 788f0f5a152: Introduced alpha export of the `policyExtensionPoint` for use in the new backend system. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## @backstage/plugin-permission-react@0.4.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## @backstage/plugin-playlist@0.1.8-next.2 + +### Patch Changes + +- 1b3c0546047: Added config properties to change dynamically the group noun for all the components in the UI +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-permission-react@0.4.12-next.1 + - @backstage/plugin-playlist-common@0.1.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## @backstage/plugin-playlist-backend@0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-playlist-common@0.1.6-next.0 + +## @backstage/plugin-proxy-backend@0.2.38-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + +## @backstage/plugin-rollbar@0.4.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-rollbar-backend@0.1.41-next.2 + +### Patch Changes + +- 66b6cfc5716: Replace `camelcase-keys` dependency with one with better compatibility. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + +## @backstage/plugin-scaffolder-backend@1.13.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-node@0.1.2-next.2 + +### Patch Changes + +- 2898b6c8d52: Minor type tweaks for TypeScript 5.0 +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + +## @backstage/plugin-scaffolder-react@1.3.0-next.2 + +### Patch Changes + +- 90dda42cfd2: bug: Invert `templateFilter` predicate to align with `Array.filter` +- 34dab7ee7f8: `scaffolder/next`: bump `rjsf` dependencies to `5.5.0` +- 2898b6c8d52: Minor type tweaks for TypeScript 5.0 +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + +## @backstage/plugin-search-backend@1.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-backend-module-catalog@0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-backend-module-explore@0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-backend-module-pg@0.5.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-backend-module-techdocs@0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-techdocs-node@1.6.1-next.2 + +## @backstage/plugin-search-backend-node@1.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-search-react@1.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-sentry@0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-shortcuts@0.3.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-sonarqube@0.6.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-sonarqube-react@0.1.5-next.1 + +## @backstage/plugin-sonarqube-backend@0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-sonarqube-react@0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-splunk-on-call@0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-stack-overflow@0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-home@0.4.33-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## @backstage/plugin-stack-overflow-backend@0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-stackstorm@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-tech-insights@0.3.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-insights-backend@0.5.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.2 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.2 + +### Patch Changes + +- 9cb1db6546a: When multiple fact retrievers are used for a check, allow for cases where only one returns a given fact +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.2 + +## @backstage/plugin-tech-insights-node@0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-radar@0.6.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-techdocs@1.6.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/plugin-techdocs@1.6.1-next.2 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/test-utils@1.3.0-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog@1.10.0-next.2 + - @backstage/plugin-search-react@1.5.2-next.2 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + +## @backstage/plugin-techdocs-backend@1.6.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-techdocs-node@1.6.1-next.2 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.2 + +### Patch Changes + +- c657d0a610e: Bump `photoswipe` dependency to `^5.3.7`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + +## @backstage/plugin-techdocs-node@1.6.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-aws-node@0.1.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## @backstage/plugin-techdocs-react@1.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/version-bridge@1.0.4-next.0 + +## @backstage/plugin-todo@0.2.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-todo-backend@0.1.41-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## @backstage/plugin-user-settings@0.7.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-user-settings-backend@0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## @backstage/plugin-vault@0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## @backstage/plugin-vault-backend@0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## @backstage/plugin-xcmetrics@0.2.37-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## example-app@0.2.82-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-circleci@0.3.17-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.2 + - @backstage/cli@0.22.6-next.2 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/plugin-scaffolder-react@1.3.0-next.2 + - @backstage/plugin-scaffolder@1.13.0-next.2 + - @backstage/plugin-code-coverage@0.2.10-next.2 + - @backstage/plugin-cost-insights@0.12.6-next.2 + - @backstage/plugin-playlist@0.1.8-next.2 + - @backstage/plugin-search@1.2.0-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/plugin-techdocs@1.6.1-next.2 + - @backstage/app-defaults@1.3.0-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-airbrake@0.3.17-next.2 + - @backstage/plugin-apache-airflow@0.2.10-next.2 + - @backstage/plugin-api-docs@0.9.2-next.2 + - @backstage/plugin-azure-devops@0.2.8-next.2 + - @backstage/plugin-azure-sites@0.1.6-next.2 + - @backstage/plugin-badges@0.2.41-next.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-graph@0.2.29-next.2 + - @backstage/plugin-catalog-import@0.9.7-next.2 + - @backstage/plugin-cloudbuild@0.3.17-next.2 + - @backstage/plugin-dynatrace@3.0.1-next.2 + - @backstage/plugin-entity-feedback@0.2.0-next.2 + - @backstage/plugin-explore@0.4.2-next.2 + - @backstage/plugin-gcalendar@0.3.13-next.2 + - @backstage/plugin-gcp-projects@0.3.36-next.2 + - @backstage/plugin-github-actions@0.5.17-next.2 + - @backstage/plugin-gocd@0.1.23-next.2 + - @backstage/plugin-graphiql@0.2.49-next.2 + - @backstage/plugin-home@0.4.33-next.2 + - @backstage/plugin-jenkins@0.7.16-next.2 + - @backstage/plugin-kafka@0.3.17-next.2 + - @backstage/plugin-kubernetes@0.7.10-next.2 + - @backstage/plugin-lighthouse@0.4.2-next.2 + - @backstage/plugin-linguist@0.1.2-next.2 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-microsoft-calendar@0.1.2-next.2 + - @backstage/plugin-newrelic@0.3.35-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.10-next.2 + - @backstage/plugin-org@0.6.7-next.2 + - @backstage/plugin-pagerduty@0.5.10-next.2 + - @backstage/plugin-permission-react@0.4.12-next.1 + - @backstage/plugin-rollbar@0.4.17-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + - @backstage/plugin-sentry@0.5.2-next.2 + - @backstage/plugin-shortcuts@0.3.9-next.2 + - @backstage/plugin-stack-overflow@0.1.13-next.2 + - @backstage/plugin-stackstorm@0.1.1-next.2 + - @backstage/plugin-tech-insights@0.3.9-next.2 + - @backstage/plugin-tech-radar@0.6.3-next.2 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + - @backstage/plugin-todo@0.2.19-next.2 + - @backstage/plugin-user-settings@0.7.2-next.2 + - @internal/plugin-catalog-customized@0.0.9-next.2 + +## example-backend@0.2.82-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.10.0-next.2 + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/plugin-permission-backend@0.5.19-next.2 + - @backstage/plugin-rollbar-backend@0.1.41-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - example-app@0.2.82-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-adr-backend@0.3.2-next.2 + - @backstage/plugin-app-backend@0.3.44-next.2 + - @backstage/plugin-auth-backend@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-azure-devops-backend@0.3.23-next.2 + - @backstage/plugin-azure-sites-backend@0.1.6-next.2 + - @backstage/plugin-badges-backend@0.1.38-next.2 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-code-coverage-backend@0.2.10-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.2-next.2 + - @backstage/plugin-events-backend@0.2.5-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + - @backstage/plugin-explore-backend@0.0.6-next.2 + - @backstage/plugin-graphql-backend@0.1.34-next.2 + - @backstage/plugin-jenkins-backend@0.1.34-next.2 + - @backstage/plugin-kafka-backend@0.2.37-next.2 + - @backstage/plugin-lighthouse-backend@0.1.2-next.2 + - @backstage/plugin-linguist-backend@0.2.1-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-playlist-backend@0.2.7-next.2 + - @backstage/plugin-proxy-backend@0.2.38-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.2 + - @backstage/plugin-search-backend@1.3.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.5-next.2 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-tech-insights-backend@0.5.10-next.2 + - @backstage/plugin-tech-insights-node@0.4.2-next.2 + - @backstage/plugin-techdocs-backend@1.6.1-next.2 + - @backstage/plugin-todo-backend@0.1.41-next.2 + +## example-backend-next@0.0.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.10.0-next.2 + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/plugin-permission-backend@0.5.19-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - @backstage/backend-defaults@0.1.9-next.2 + - @backstage/plugin-app-backend@0.3.44-next.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend@1.3.0-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-techdocs-backend@1.6.1-next.2 + - @backstage/plugin-todo-backend@0.1.41-next.2 + +## e2e-test@0.2.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.39-next.2 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + +## techdocs-cli-embedded-app@0.2.81-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.6-next.2 + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/plugin-techdocs@1.6.1-next.2 + - @backstage/app-defaults@1.3.0-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/test-utils@1.3.0-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog@1.10.0-next.2 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + +## @internal/plugin-catalog-customized@0.0.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/plugin-catalog@1.10.0-next.2 + +## @internal/plugin-todo-list@1.0.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## @internal/plugin-todo-list-backend@1.0.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 diff --git a/microsite/data/plugins/api-spectral-linter.yaml b/microsite/data/plugins/api-spectral-linter.yaml new file mode 100644 index 0000000000..292279e324 --- /dev/null +++ b/microsite/data/plugins/api-spectral-linter.yaml @@ -0,0 +1,10 @@ +--- +title: API Spectral Linter +author: dweber019 +authorUrl: https://github.com/dweber019 +category: Linting +description: API Spectral Linter is a quality assurance tool that checks the compliance of API's specifications Spectral rule sets. +documentation: https://github.com/dweber019/backstage-plugin-api-docs-spectral-linter +iconUrl: https://raw.githubusercontent.com/dweber019/backstage-plugin-api-docs-spectral-linter/main/plugins/api-docs-spectral-linter/docs/pluginIcon.png +npmPackageName: '@dweber019/backstage-plugin-api-docs-spectral-linter' +addedDate: '2023-03-27' diff --git a/microsite/data/plugins/bulletin-board.yaml b/microsite/data/plugins/bulletin-board.yaml new file mode 100644 index 0000000000..67791f6f84 --- /dev/null +++ b/microsite/data/plugins/bulletin-board.yaml @@ -0,0 +1,10 @@ +--- +title: Bulletin Board +author: v-ngu +authorUrl: https://github.com/v-ngu +category: Discovery +description: Share interesting ideas, news and links with your teammates within Backstage. +documentation: https://github.com/v-ngu/backstage-plugin-bulletin-board +iconUrl: /img/bulletin-board.png +npmPackageName: 'backstage-plugin-bulletin-board' +addedDate: '2023-04-01' diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 09727685a0..b3e6f07b0e 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -277,15 +277,16 @@ "items": [ "auth/auth0/provider", "auth/atlassian/provider", - "auth/bitbucket/provider", "auth/microsoft/provider", + "auth/microsoft/easy-auth", + "auth/bitbucket/provider", "auth/github/provider", "auth/gitlab/provider", "auth/google/provider", "auth/google/gcp-iap-auth", "auth/okta/provider", - "auth/onelogin/provider", - "auth/oauth2-proxy/provider" + "auth/oauth2-proxy/provider", + "auth/onelogin/provider" ] }, "auth/identity-resolver", diff --git a/microsite/static/img/bulletin-board.png b/microsite/static/img/bulletin-board.png new file mode 100644 index 0000000000..918d81827a Binary files /dev/null and b/microsite/static/img/bulletin-board.png differ diff --git a/microsite/yarn.lock b/microsite/yarn.lock index b243fcecdb..021d21a043 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -8560,11 +8560,11 @@ __metadata: linkType: hard "prettier@npm:^2.6.2": - version: 2.8.6 - resolution: "prettier@npm:2.8.6" + version: 2.8.7 + resolution: "prettier@npm:2.8.7" bin: prettier: bin-prettier.js - checksum: 8ac94fa67aec0e65743ea15ebf954ef2f1e52638abd129dc04e8b49e8bb3224c0233c98df6b5c98efd31bd2a43866590486559438ee4ead09dc81be389068572 + checksum: fdc8f2616f099f5f0d685907f4449a70595a0fc1d081a88919604375989e0d5e9168d6121d8cc6861f21990b31665828e00472544d785d5940ea08a17660c3a6 languageName: node linkType: hard diff --git a/mkdocs.yml b/mkdocs.yml index 4b5c2cf7a2..4a75c3f67f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -6,6 +6,7 @@ edit_uri: edit/master/docs plugins: - techdocs-core +# For sidebar navigation on https://backstage.io/, see `microsite/sidebars.json` nav: - Overview: - What is Backstage?: 'overview/what-is-backstage.md' diff --git a/package.json b/package.json index 8550a72a97..e6f04eac95 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "dev": "concurrently \"yarn start\" \"yarn start-backend\"", "start": "yarn workspace example-app start", "start-backend": "yarn workspace example-backend start", - "build:backend": "yarn workspace backend build", + "build:backend": "yarn workspace example-backend build", "build:all": "backstage-cli repo build --all", "build:api-reports": "yarn build:api-reports:only --tsc", "build:api-reports:only": "backstage-repo-tools api-reports --allow-warnings 'packages/core-components,plugins/+(catalog|catalog-import|git-release-manager|jenkins|kubernetes)' -o ae-wrong-input-file-type --validate-release-tags", @@ -47,7 +47,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.13.0-next.0", + "version": "1.13.0-next.2", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" @@ -81,7 +81,7 @@ "semver": "^7.3.2", "shx": "^0.3.2", "ts-node": "^10.4.0", - "typescript": "~4.7.0" + "typescript": "~5.0.0" }, "prettier": "@spotify/prettier-config", "lint-staged": { diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index b2d85cea1a..b33264451c 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/app-defaults +## 1.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-permission-react@0.4.12-next.1 + +## 1.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/theme@0.2.19-next.0 + ## 1.3.0-next.0 ### Minor Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index d4540bfd1d..08b726cbbe 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/app-defaults", "description": "Provides the default wiring of a Backstage App", - "version": "1.3.0-next.0", + "version": "1.3.0-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 7c0a558a86..3cc4aa0190 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,143 @@ # example-app +## 0.2.82-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-circleci@0.3.17-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.2 + - @backstage/cli@0.22.6-next.2 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/plugin-scaffolder-react@1.3.0-next.2 + - @backstage/plugin-scaffolder@1.13.0-next.2 + - @backstage/plugin-code-coverage@0.2.10-next.2 + - @backstage/plugin-cost-insights@0.12.6-next.2 + - @backstage/plugin-playlist@0.1.8-next.2 + - @backstage/plugin-search@1.2.0-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/plugin-techdocs@1.6.1-next.2 + - @backstage/app-defaults@1.3.0-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-airbrake@0.3.17-next.2 + - @backstage/plugin-apache-airflow@0.2.10-next.2 + - @backstage/plugin-api-docs@0.9.2-next.2 + - @backstage/plugin-azure-devops@0.2.8-next.2 + - @backstage/plugin-azure-sites@0.1.6-next.2 + - @backstage/plugin-badges@0.2.41-next.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-graph@0.2.29-next.2 + - @backstage/plugin-catalog-import@0.9.7-next.2 + - @backstage/plugin-cloudbuild@0.3.17-next.2 + - @backstage/plugin-dynatrace@3.0.1-next.2 + - @backstage/plugin-entity-feedback@0.2.0-next.2 + - @backstage/plugin-explore@0.4.2-next.2 + - @backstage/plugin-gcalendar@0.3.13-next.2 + - @backstage/plugin-gcp-projects@0.3.36-next.2 + - @backstage/plugin-github-actions@0.5.17-next.2 + - @backstage/plugin-gocd@0.1.23-next.2 + - @backstage/plugin-graphiql@0.2.49-next.2 + - @backstage/plugin-home@0.4.33-next.2 + - @backstage/plugin-jenkins@0.7.16-next.2 + - @backstage/plugin-kafka@0.3.17-next.2 + - @backstage/plugin-kubernetes@0.7.10-next.2 + - @backstage/plugin-lighthouse@0.4.2-next.2 + - @backstage/plugin-linguist@0.1.2-next.2 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-microsoft-calendar@0.1.2-next.2 + - @backstage/plugin-newrelic@0.3.35-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.10-next.2 + - @backstage/plugin-org@0.6.7-next.2 + - @backstage/plugin-pagerduty@0.5.10-next.2 + - @backstage/plugin-permission-react@0.4.12-next.1 + - @backstage/plugin-rollbar@0.4.17-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + - @backstage/plugin-sentry@0.5.2-next.2 + - @backstage/plugin-shortcuts@0.3.9-next.2 + - @backstage/plugin-stack-overflow@0.1.13-next.2 + - @backstage/plugin-stackstorm@0.1.1-next.2 + - @backstage/plugin-tech-insights@0.3.9-next.2 + - @backstage/plugin-tech-radar@0.6.3-next.2 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + - @backstage/plugin-todo@0.2.19-next.2 + - @backstage/plugin-user-settings@0.7.2-next.2 + - @internal/plugin-catalog-customized@0.0.9-next.2 + +## 0.2.82-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/cli@0.22.6-next.1 + - @backstage/plugin-org@0.6.7-next.1 + - @backstage/plugin-techdocs@1.6.1-next.1 + - @backstage/plugin-scaffolder-react@1.3.0-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/plugin-scaffolder@1.13.0-next.1 + - @backstage/plugin-dynatrace@3.0.1-next.1 + - @backstage/plugin-airbrake@0.3.17-next.1 + - @backstage/plugin-circleci@0.3.17-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/plugin-stackstorm@0.1.1-next.1 + - @backstage/plugin-linguist@0.1.2-next.1 + - @backstage/plugin-playlist@0.1.8-next.1 + - @backstage/plugin-graphiql@0.2.49-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.1 + - @backstage/plugin-microsoft-calendar@0.1.2-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.10-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/plugin-entity-feedback@0.2.0-next.1 + - @backstage/plugin-apache-airflow@0.2.10-next.1 + - @backstage/plugin-catalog-import@0.9.7-next.1 + - @backstage/plugin-github-actions@0.5.17-next.1 + - @backstage/plugin-stack-overflow@0.1.13-next.1 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/plugin-catalog-graph@0.2.29-next.1 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-code-coverage@0.2.10-next.1 + - @backstage/plugin-cost-insights@0.12.6-next.1 + - @backstage/plugin-tech-insights@0.3.9-next.1 + - @backstage/plugin-user-settings@0.7.2-next.1 + - @backstage/plugin-azure-devops@0.2.8-next.1 + - @backstage/plugin-gcp-projects@0.3.36-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/plugin-azure-sites@0.1.6-next.1 + - @backstage/plugin-cloudbuild@0.3.17-next.1 + - @backstage/plugin-kubernetes@0.7.10-next.1 + - @backstage/plugin-lighthouse@0.4.2-next.1 + - @backstage/plugin-tech-radar@0.6.3-next.1 + - @backstage/plugin-gcalendar@0.3.13-next.1 + - @backstage/plugin-pagerduty@0.5.10-next.1 + - @backstage/plugin-shortcuts@0.3.9-next.1 + - @backstage/plugin-api-docs@0.9.2-next.1 + - @backstage/plugin-newrelic@0.3.35-next.1 + - @backstage/plugin-explore@0.4.2-next.1 + - @backstage/plugin-jenkins@0.7.16-next.1 + - @backstage/plugin-rollbar@0.4.17-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-badges@0.2.41-next.1 + - @backstage/plugin-search@1.1.2-next.1 + - @backstage/plugin-sentry@0.5.2-next.1 + - @backstage/plugin-kafka@0.3.17-next.1 + - @backstage/plugin-gocd@0.1.23-next.1 + - @backstage/plugin-home@0.4.33-next.1 + - @backstage/plugin-todo@0.2.19-next.1 + - @backstage/app-defaults@1.3.0-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @internal/plugin-catalog-customized@0.0.9-next.1 + ## 0.2.82-next.0 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 5902184f89..155f33250a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.82-next.0", + "version": "0.2.82-next.2", "private": true, "backstage": { "role": "frontend" @@ -83,6 +83,7 @@ "prop-types": "^15.7.2", "react": "^17.0.2", "react-dom": "^17.0.2", + "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4", "zen-observable": "^0.10.0" @@ -90,6 +91,7 @@ "devDependencies": { "@backstage/test-utils": "workspace:^", "@testing-library/cypress": "^9.0.0", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 1ee6978a87..ea465e4ed8 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -60,12 +60,11 @@ import { HomepageCompositionRoot } from '@backstage/plugin-home'; import { LighthousePage } from '@backstage/plugin-lighthouse'; import { NewRelicPage } from '@backstage/plugin-newrelic'; import { NextScaffolderPage } from '@backstage/plugin-scaffolder/alpha'; +import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder'; import { - ScaffolderPage, - scaffolderPlugin, + ScaffolderFieldExtensions, ScaffolderLayouts, -} from '@backstage/plugin-scaffolder'; -import { ScaffolderFieldExtensions } from '@backstage/plugin-scaffolder-react'; +} from '@backstage/plugin-scaffolder-react'; import { SearchPage } from '@backstage/plugin-search'; import { TechRadarPage } from '@backstage/plugin-tech-radar'; import { diff --git a/packages/app/src/components/search/SearchModal.tsx b/packages/app/src/components/search/SearchModal.tsx index ea5a156c55..fea80f9952 100644 --- a/packages/app/src/components/search/SearchModal.tsx +++ b/packages/app/src/components/search/SearchModal.tsx @@ -186,7 +186,7 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { - + } /> } /> } /> diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index ed9deb5037..429a9ba824 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/backend-app-api +## 0.4.2-next.2 + +### Patch Changes + +- 5c7ce585824: Allow an additionalConfig to be provided to loadBackendConfig that fetches config values during runtime. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + ## 0.4.2-next.0 ### Patch Changes diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index e99135b3ec..90b76ffb64 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -5,6 +5,7 @@ ```ts /// +import type { AppConfig } from '@backstage/config'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { CacheClient } from '@backstage/backend-common'; import { Config } from '@backstage/config'; @@ -178,6 +179,7 @@ export const lifecycleServiceFactory: () => ServiceFactory< export function loadBackendConfig(options: { remote?: LoadConfigOptionsRemote; argv: string[]; + additionalConfigs?: AppConfig[]; }): Promise<{ config: Config; }>; diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index dda56af96c..708b9769d5 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-app-api", "description": "Core API used by Backstage backend apps", - "version": "0.4.2-next.0", + "version": "0.4.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-app-api/src/config/config.ts b/packages/backend-app-api/src/config/config.ts index d3349b41ef..7367767870 100644 --- a/packages/backend-app-api/src/config/config.ts +++ b/packages/backend-app-api/src/config/config.ts @@ -24,7 +24,8 @@ import { ConfigTarget, LoadConfigOptionsRemote, } from '@backstage/config-loader'; -import { Config, ConfigReader } from '@backstage/config'; +import { ConfigReader } from '@backstage/config'; +import type { Config, AppConfig } from '@backstage/config'; import { getPackages } from '@manypkg/get-packages'; import { ObservableConfigProxy } from './ObservableConfigProxy'; import { isValidUrl } from '../lib/urls'; @@ -70,6 +71,7 @@ export async function createConfigSecretEnumerator(options: { export async function loadBackendConfig(options: { remote?: LoadConfigOptionsRemote; argv: string[]; + additionalConfigs?: AppConfig[]; }): Promise<{ config: Config }> { const args = parseArgs(options.argv); @@ -92,8 +94,11 @@ export async function loadBackendConfig(options: { console.info( `Reloaded config from ${newConfigs.map(c => c.context).join(', ')}`, ); - - config.setConfig(ConfigReader.fromConfigs(newConfigs)); + const configsToMerge = [...newConfigs]; + if (options.additionalConfigs) { + configsToMerge.push(...options.additionalConfigs); + } + config.setConfig(ConfigReader.fromConfigs(configsToMerge)); }, stopSignal: new Promise(resolve => { if (currentCancelFunc) { @@ -109,12 +114,15 @@ export async function loadBackendConfig(options: { }), }, }); - console.info( `Loaded config from ${appConfigs.map(c => c.context).join(', ')}`, ); - config.setConfig(ConfigReader.fromConfigs(appConfigs)); + const finalAppConfigs = [...appConfigs]; + if (options.additionalConfigs) { + finalAppConfigs.push(...options.additionalConfigs); + } + config.setConfig(ConfigReader.fromConfigs(finalAppConfigs)); return { config }; } diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index 3ec4fe5837..cd363a7d83 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/backend-common +## 0.18.4-next.2 + +### Patch Changes + +- 5c7ce585824: Allow an additionalConfig to be provided to loadBackendConfig that fetches config values during runtime. +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.2 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-aws-node@0.1.2 + - @backstage/types@1.0.2 + +## 0.18.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-app-api@0.4.2-next.1 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/integration-aws-node@0.1.2 + - @backstage/types@1.0.2 + ## 0.18.4-next.0 ### Patch Changes diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index f1d8a74dbe..99f4bfea71 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -6,6 +6,7 @@ /// /// +import { AppConfig } from '@backstage/config'; import { AwsCredentialsManager } from '@backstage/integration-aws-node'; import { AwsS3Integration } from '@backstage/integration'; import { AzureIntegration } from '@backstage/integration'; @@ -533,6 +534,7 @@ export const legacyPlugin: ( export function loadBackendConfig(options: { logger: LoggerService; remote?: LoadConfigOptionsRemote; + additionalConfig?: AppConfig; argv: string[]; }): Promise; diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 3f96d5f4ce..6d6473a721 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-common", "description": "Common functionality library for Backstage backends", - "version": "0.18.4-next.0", + "version": "0.18.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/src/config.ts b/packages/backend-common/src/config.ts index dd96a6b46a..cc824c47fd 100644 --- a/packages/backend-common/src/config.ts +++ b/packages/backend-common/src/config.ts @@ -19,7 +19,7 @@ import { loadBackendConfig as newLoadBackendConfig, } from '@backstage/backend-app-api'; import { LoggerService } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; +import { AppConfig, Config } from '@backstage/config'; import { LoadConfigOptionsRemote } from '@backstage/config-loader'; import { setRootLoggerRedactionList } from './logging/createRootLogger'; @@ -34,6 +34,7 @@ export async function loadBackendConfig(options: { logger: LoggerService; // process.argv or any other overrides remote?: LoadConfigOptionsRemote; + additionalConfig?: AppConfig; argv: string[]; }): Promise { const secretEnumerator = await createConfigSecretEnumerator({ diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 01afac257b..2b2fa0a062 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/backend-defaults +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + ## 0.1.9-next.0 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 2f9655384e..3fb8420ca6 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-defaults", "description": "Backend defaults used by Backstage backend apps", - "version": "0.1.9-next.0", + "version": "0.1.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index 39af1fa1c3..d325959c18 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,45 @@ # example-backend-next +## 0.0.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.10.0-next.2 + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/plugin-permission-backend@0.5.19-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - @backstage/backend-defaults@0.1.9-next.2 + - @backstage/plugin-app-backend@0.3.44-next.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend@1.3.0-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-techdocs-backend@1.6.1-next.2 + - @backstage/plugin-todo-backend@0.1.41-next.2 + +## 0.0.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend@1.3.0-next.1 + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/plugin-kubernetes-backend@0.10.0-next.1 + - @backstage/plugin-techdocs-backend@1.6.1-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.0 + - @backstage/backend-defaults@0.1.9-next.1 + - @backstage/plugin-app-backend@0.3.44-next.1 + - @backstage/plugin-todo-backend@0.1.41-next.1 + ## 0.0.10-next.0 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index bed4f10975..9ad6d2f7a1 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.10-next.0", + "version": "0.0.10-next.2", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", @@ -27,7 +27,12 @@ "dependencies": { "@backstage/backend-defaults": "workspace:^", "@backstage/plugin-app-backend": "workspace:^", + "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-kubernetes-backend": "workspace:^", + "@backstage/plugin-permission-backend": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-permission-node": "workspace:^", "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-search-backend": "workspace:^", "@backstage/plugin-search-backend-module-catalog": "workspace:^", diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts index e3cbbd53b8..fc936b1b0f 100644 --- a/packages/backend-next/src/index.ts +++ b/packages/backend-next/src/index.ts @@ -16,14 +16,19 @@ import { createBackend } from '@backstage/backend-defaults'; import { appPlugin } from '@backstage/plugin-app-backend/alpha'; -import { todoPlugin } from '@backstage/plugin-todo-backend'; -import { techdocsPlugin } from '@backstage/plugin-techdocs-backend/alpha'; import { catalogPlugin } from '@backstage/plugin-catalog-backend/alpha'; +import { kubernetesPlugin } from '@backstage/plugin-kubernetes-backend/alpha'; +import { + permissionModuleAllowAllPolicy, + permissionPlugin, +} from '@backstage/plugin-permission-backend/alpha'; import { catalogModuleTemplateKind } from '@backstage/plugin-scaffolder-backend/alpha'; -import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; import { searchModuleCatalogCollator } from '@backstage/plugin-search-backend-module-catalog/alpha'; -import { searchModuleTechDocsCollator } from '@backstage/plugin-search-backend-module-techdocs/alpha'; import { searchModuleExploreCollator } from '@backstage/plugin-search-backend-module-explore/alpha'; +import { searchModuleTechDocsCollator } from '@backstage/plugin-search-backend-module-techdocs/alpha'; +import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; +import { techdocsPlugin } from '@backstage/plugin-techdocs-backend/alpha'; +import { todoPlugin } from '@backstage/plugin-todo-backend'; const backend = createBackend(); @@ -45,4 +50,11 @@ backend.add(searchModuleCatalogCollator()); backend.add(searchModuleTechDocsCollator()); backend.add(searchModuleExploreCollator()); +// Kubernetes +backend.add(kubernetesPlugin()); + +// Permissions +backend.add(permissionPlugin()); +backend.add(permissionModuleAllowAllPolicy()); + backend.start(); diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index f3cb679fce..3ded5d7fa4 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/backend-plugin-api +## 0.5.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## 0.5.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + ## 0.5.1-next.0 ### Patch Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 6566772f2f..a98cdd0b0f 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-api", "description": "Core API used by Backstage backend plugins", - "version": "0.5.1-next.0", + "version": "0.5.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index 7d2540d83a..fa0e3fc00c 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/backend-tasks +## 0.5.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.5.1-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + ## 0.5.1-next.0 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index 4b78b5f5c4..04e4c75470 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-tasks", "description": "Common distributed task management library for Backstage backends", - "version": "0.5.1-next.0", + "version": "0.5.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-tasks/src/migrations.test.ts b/packages/backend-tasks/src/migrations.test.ts index 74503ab9a7..7e471a1c16 100644 --- a/packages/backend-tasks/src/migrations.test.ts +++ b/packages/backend-tasks/src/migrations.test.ts @@ -39,6 +39,8 @@ async function migrateUntilBefore(knex: Knex, target: string): Promise { } } +jest.setTimeout(60_000); + describe('migrations', () => { const databases = TestDatabases.create({ ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], @@ -80,6 +82,5 @@ describe('migrations', () => { await knex.destroy(); }, - 60_000, ); }); diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts index 9a29810683..6247755bbd 100644 --- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts +++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts @@ -32,6 +32,8 @@ function defer() { return { promise, resolve }; } +jest.setTimeout(60_000); + describe('PluginTaskManagerImpl', () => { const databases = TestDatabases.create({ ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], @@ -77,7 +79,6 @@ describe('PluginTaskManagerImpl', () => { await promise; expect(fn).toHaveBeenCalledWith(expect.any(AbortSignal)); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -98,7 +99,6 @@ describe('PluginTaskManagerImpl', () => { await promise; expect(fn).toHaveBeenCalledWith(expect.any(AbortSignal)); }, - 60_000, ); }); @@ -125,7 +125,6 @@ describe('PluginTaskManagerImpl', () => { await promise; expect(fn).toHaveBeenCalledWith(expect.any(AbortSignal)); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -146,7 +145,6 @@ describe('PluginTaskManagerImpl', () => { NotFoundError, ); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -172,7 +170,6 @@ describe('PluginTaskManagerImpl', () => { ConflictError, ); }, - 60_000, ); }); @@ -300,7 +297,6 @@ describe('PluginTaskManagerImpl', () => { await promise; expect(fn).toHaveBeenCalledWith(expect.any(AbortSignal)); }, - 60_000, ); }); @@ -340,7 +336,6 @@ describe('PluginTaskManagerImpl', () => { }, ]); }, - 60_000, ); }); diff --git a/packages/backend-tasks/src/tasks/TaskScheduler.test.ts b/packages/backend-tasks/src/tasks/TaskScheduler.test.ts index aa2db5a364..89eff433db 100644 --- a/packages/backend-tasks/src/tasks/TaskScheduler.test.ts +++ b/packages/backend-tasks/src/tasks/TaskScheduler.test.ts @@ -20,6 +20,8 @@ import { Duration } from 'luxon'; import waitForExpect from 'wait-for-expect'; import { TaskScheduler } from './TaskScheduler'; +jest.setTimeout(60_000); + describe('TaskScheduler', () => { const logger = getVoidLogger(); const databases = TestDatabases.create({ @@ -56,7 +58,6 @@ describe('TaskScheduler', () => { expect(fn).toHaveBeenCalled(); }); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -77,6 +78,5 @@ describe('TaskScheduler', () => { expect(fn).toHaveBeenCalled(); }); }, - 60_000, ); }); diff --git a/packages/backend-tasks/src/tasks/TaskWorker.test.ts b/packages/backend-tasks/src/tasks/TaskWorker.test.ts index 28dbcc4337..fa2577ce53 100644 --- a/packages/backend-tasks/src/tasks/TaskWorker.test.ts +++ b/packages/backend-tasks/src/tasks/TaskWorker.test.ts @@ -23,6 +23,8 @@ import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables'; import { TaskWorker } from './TaskWorker'; import { TaskSettingsV2 } from './types'; +jest.setTimeout(60_000); + describe('TaskWorker', () => { const logger = getVoidLogger(); const databases = TestDatabases.create({ @@ -115,7 +117,6 @@ describe('TaskWorker', () => { }), ); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -140,7 +141,6 @@ describe('TaskWorker', () => { expect(logger.error).toHaveBeenCalled(); }); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -164,7 +164,6 @@ describe('TaskWorker', () => { expect(fn).toHaveBeenCalledTimes(3); }); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -223,7 +222,6 @@ describe('TaskWorker', () => { }), ); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -280,7 +278,6 @@ describe('TaskWorker', () => { false, ); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -334,6 +331,5 @@ describe('TaskWorker', () => { await promise2; expect(fn1.mock.calls.length).toBeGreaterThan(before); }, - 60_000, ); }); diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index a1f4e76ea2..a25d966eb5 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/backend-test-utils +## 0.1.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## 0.1.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + ## 0.1.36-next.0 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 05195f98aa..a9d8f33377 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-test-utils", "description": "Test helpers library for Backstage backends", - "version": "0.1.36-next.0", + "version": "0.1.36-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-test-utils/src/database/TestDatabases.test.ts b/packages/backend-test-utils/src/database/TestDatabases.test.ts index 000e047c4d..691ac5259e 100644 --- a/packages/backend-test-utils/src/database/TestDatabases.test.ts +++ b/packages/backend-test-utils/src/database/TestDatabases.test.ts @@ -22,12 +22,16 @@ import { TestDatabases } from './TestDatabases'; const itIfDocker = isDockerDisabledForTests() ? it.skip : it; +jest.setTimeout(60_000); + describe('TestDatabases', () => { const OLD_ENV = process.env; + beforeEach(() => { jest.resetModules(); process.env = { ...OLD_ENV }; }); + afterAll(() => { process.env = OLD_ENV; }); @@ -49,109 +53,84 @@ describe('TestDatabases', () => { { a: 1 }, ]); }, - 60_000, ); }); - itIfDocker( - 'obeys a provided connection string for postgres 13', - async () => { - const dbs = TestDatabases.create(); - const { host, port, user, password, stop } = await startPostgresContainer( - 'postgres:13', - ); + itIfDocker('obeys a provided connection string for postgres 13', async () => { + const dbs = TestDatabases.create(); + const { host, port, user, password, stop } = await startPostgresContainer( + 'postgres:13', + ); - try { - // Leave a mark - process.env.BACKSTAGE_TEST_DATABASE_POSTGRES13_CONNECTION_STRING = `postgresql://${user}:${password}@${host}:${port}`; - const input = await dbs.init('POSTGRES_13'); - await input.schema.createTable('a', table => - table.string('x').primary(), - ); - await input.insert({ x: 'y' }).into('a'); + try { + // Leave a mark + process.env.BACKSTAGE_TEST_DATABASE_POSTGRES13_CONNECTION_STRING = `postgresql://${user}:${password}@${host}:${port}`; + const input = await dbs.init('POSTGRES_13'); + await input.schema.createTable('a', table => table.string('x').primary()); + await input.insert({ x: 'y' }).into('a'); - // Look for the mark - const database = input.client.config.connection.database; - const output = knexFactory({ - client: 'pg', - connection: { host, port, user, password, database }, - }); - // eslint-disable-next-line jest/no-standalone-expect - await expect(output.select('x').from('a')).resolves.toEqual([ - { x: 'y' }, - ]); - } finally { - await stop(); - } - }, - 60_000, - ); + // Look for the mark + const database = input.client.config.connection.database; + const output = knexFactory({ + client: 'pg', + connection: { host, port, user, password, database }, + }); + // eslint-disable-next-line jest/no-standalone-expect + await expect(output.select('x').from('a')).resolves.toEqual([{ x: 'y' }]); + } finally { + await stop(); + } + }); - itIfDocker( - 'obeys a provided connection string for postgres 9', - async () => { - const dbs = TestDatabases.create(); - const { host, port, user, password, stop } = await startPostgresContainer( - 'postgres:9', - ); + itIfDocker('obeys a provided connection string for postgres 9', async () => { + const dbs = TestDatabases.create(); + const { host, port, user, password, stop } = await startPostgresContainer( + 'postgres:9', + ); - try { - // Leave a mark - process.env.BACKSTAGE_TEST_DATABASE_POSTGRES9_CONNECTION_STRING = `postgresql://${user}:${password}@${host}:${port}`; - const input = await dbs.init('POSTGRES_9'); - await input.schema.createTable('a', table => - table.string('x').primary(), - ); - await input.insert({ x: 'y' }).into('a'); + try { + // Leave a mark + process.env.BACKSTAGE_TEST_DATABASE_POSTGRES9_CONNECTION_STRING = `postgresql://${user}:${password}@${host}:${port}`; + const input = await dbs.init('POSTGRES_9'); + await input.schema.createTable('a', table => table.string('x').primary()); + await input.insert({ x: 'y' }).into('a'); - // Look for the mark - const database = input.client.config.connection.database; - const output = knexFactory({ - client: 'pg', - connection: { host, port, user, password, database }, - }); - // eslint-disable-next-line jest/no-standalone-expect - await expect(output.select('x').from('a')).resolves.toEqual([ - { x: 'y' }, - ]); - } finally { - await stop(); - } - }, - 60_000, - ); + // Look for the mark + const database = input.client.config.connection.database; + const output = knexFactory({ + client: 'pg', + connection: { host, port, user, password, database }, + }); + // eslint-disable-next-line jest/no-standalone-expect + await expect(output.select('x').from('a')).resolves.toEqual([{ x: 'y' }]); + } finally { + await stop(); + } + }); - itIfDocker( - 'obeys a provided connection string for mysql 8', - async () => { - const dbs = TestDatabases.create(); - const { host, port, user, password, stop } = await startMysqlContainer( - 'mysql:8', - ); + itIfDocker('obeys a provided connection string for mysql 8', async () => { + const dbs = TestDatabases.create(); + const { host, port, user, password, stop } = await startMysqlContainer( + 'mysql:8', + ); - try { - // Leave a mark - process.env.BACKSTAGE_TEST_DATABASE_MYSQL8_CONNECTION_STRING = `mysql://${user}:${password}@${host}:${port}/ignored`; - const input = await dbs.init('MYSQL_8'); - await input.schema.createTable('a', table => - table.string('x').primary(), - ); - await input.insert({ x: 'y' }).into('a'); + try { + // Leave a mark + process.env.BACKSTAGE_TEST_DATABASE_MYSQL8_CONNECTION_STRING = `mysql://${user}:${password}@${host}:${port}/ignored`; + const input = await dbs.init('MYSQL_8'); + await input.schema.createTable('a', table => table.string('x').primary()); + await input.insert({ x: 'y' }).into('a'); - // Look for the mark - const database = input.client.config.connection.database; - const output = knexFactory({ - client: 'mysql2', - connection: { host, port, user, password, database }, - }); - // eslint-disable-next-line jest/no-standalone-expect - await expect(output.select('x').from('a')).resolves.toEqual([ - { x: 'y' }, - ]); - } finally { - await stop(); - } - }, - 60_000, - ); + // Look for the mark + const database = input.client.config.connection.database; + const output = knexFactory({ + client: 'mysql2', + connection: { host, port, user, password, database }, + }); + // eslint-disable-next-line jest/no-standalone-expect + await expect(output.select('x').from('a')).resolves.toEqual([{ x: 'y' }]); + } finally { + await stop(); + } + }); }); diff --git a/packages/backend-test-utils/src/database/startMysqlContainer.test.ts b/packages/backend-test-utils/src/database/startMysqlContainer.test.ts index 282e84dabc..23cb128a35 100644 --- a/packages/backend-test-utils/src/database/startMysqlContainer.test.ts +++ b/packages/backend-test-utils/src/database/startMysqlContainer.test.ts @@ -20,21 +20,19 @@ import { startMysqlContainer } from './startMysqlContainer'; const itIfDocker = isDockerDisabledForTests() ? it.skip : it; +jest.setTimeout(60_000); + describe('startMysqlContainer', () => { - itIfDocker( - 'successfully launches the container', - async () => { - const { stop, ...connection } = await startMysqlContainer('mysql:8'); - const db = createConnection({ client: 'mysql2', connection }); - try { - const result = await db.select(db.raw('version() AS version')); - // eslint-disable-next-line jest/no-standalone-expect - expect(result[0]?.version).toContain('8.'); - } finally { - await db.destroy(); - await stop(); - } - }, - 60_000, - ); + itIfDocker('successfully launches the container', async () => { + const { stop, ...connection } = await startMysqlContainer('mysql:8'); + const db = createConnection({ client: 'mysql2', connection }); + try { + const result = await db.select(db.raw('version() AS version')); + // eslint-disable-next-line jest/no-standalone-expect + expect(result[0]?.version).toContain('8.'); + } finally { + await db.destroy(); + await stop(); + } + }); }); diff --git a/packages/backend-test-utils/src/database/startPostgresContainer.test.ts b/packages/backend-test-utils/src/database/startPostgresContainer.test.ts index 3c3ad5e15f..f64a605fd4 100644 --- a/packages/backend-test-utils/src/database/startPostgresContainer.test.ts +++ b/packages/backend-test-utils/src/database/startPostgresContainer.test.ts @@ -20,23 +20,19 @@ import { startPostgresContainer } from './startPostgresContainer'; const itIfDocker = isDockerDisabledForTests() ? it.skip : it; +jest.setTimeout(60_000); + describe('startPostgresContainer', () => { - itIfDocker( - 'successfully launches the container', - async () => { - const { stop, ...connection } = await startPostgresContainer( - 'postgres:13', - ); - const db = createConnection({ client: 'pg', connection }); - try { - const result = await db.select(db.raw('version()')); - // eslint-disable-next-line jest/no-standalone-expect - expect(result[0]?.version).toContain('PostgreSQL'); - } finally { - await db.destroy(); - await stop(); - } - }, - 60_000, - ); + itIfDocker('successfully launches the container', async () => { + const { stop, ...connection } = await startPostgresContainer('postgres:13'); + const db = createConnection({ client: 'pg', connection }); + try { + const result = await db.select(db.raw('version()')); + // eslint-disable-next-line jest/no-standalone-expect + expect(result[0]?.version).toContain('PostgreSQL'); + } finally { + await db.destroy(); + await stop(); + } + }); }); diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index fd9247bb44..27f99c23a0 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,107 @@ # example-backend +## 0.2.82-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.10.0-next.2 + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/plugin-permission-backend@0.5.19-next.2 + - @backstage/plugin-rollbar-backend@0.1.41-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - example-app@0.2.82-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-adr-backend@0.3.2-next.2 + - @backstage/plugin-app-backend@0.3.44-next.2 + - @backstage/plugin-auth-backend@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-azure-devops-backend@0.3.23-next.2 + - @backstage/plugin-azure-sites-backend@0.1.6-next.2 + - @backstage/plugin-badges-backend@0.1.38-next.2 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-code-coverage-backend@0.2.10-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.2-next.2 + - @backstage/plugin-events-backend@0.2.5-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + - @backstage/plugin-explore-backend@0.0.6-next.2 + - @backstage/plugin-graphql-backend@0.1.34-next.2 + - @backstage/plugin-jenkins-backend@0.1.34-next.2 + - @backstage/plugin-kafka-backend@0.2.37-next.2 + - @backstage/plugin-lighthouse-backend@0.1.2-next.2 + - @backstage/plugin-linguist-backend@0.2.1-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-playlist-backend@0.2.7-next.2 + - @backstage/plugin-proxy-backend@0.2.38-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.2 + - @backstage/plugin-search-backend@1.3.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.5-next.2 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-tech-insights-backend@0.5.10-next.2 + - @backstage/plugin-tech-insights-node@0.4.2-next.2 + - @backstage/plugin-techdocs-backend@1.6.1-next.2 + - @backstage/plugin-todo-backend@0.1.41-next.2 + +## 0.2.82-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend@1.3.0-next.1 + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.5-next.1 + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-backend@0.5.19-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-playlist-backend@0.2.7-next.1 + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/plugin-adr-backend@0.3.2-next.1 + - @backstage/plugin-kubernetes-backend@0.10.0-next.1 + - @backstage/plugin-techdocs-backend@1.6.1-next.1 + - @backstage/plugin-explore-backend@0.0.6-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.18.2-next.1 + - example-app@0.2.82-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-app-backend@0.3.44-next.1 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-azure-devops-backend@0.3.23-next.1 + - @backstage/plugin-azure-sites-backend@0.1.6-next.1 + - @backstage/plugin-badges-backend@0.1.38-next.1 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-code-coverage-backend@0.2.10-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.2-next.1 + - @backstage/plugin-events-backend@0.2.5-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + - @backstage/plugin-graphql-backend@0.1.34-next.1 + - @backstage/plugin-jenkins-backend@0.1.34-next.1 + - @backstage/plugin-kafka-backend@0.2.37-next.1 + - @backstage/plugin-lighthouse-backend@0.1.2-next.1 + - @backstage/plugin-linguist-backend@0.2.1-next.1 + - @backstage/plugin-proxy-backend@0.2.38-next.1 + - @backstage/plugin-rollbar-backend@0.1.41-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-tech-insights-backend@0.5.10-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.1 + - @backstage/plugin-tech-insights-node@0.4.2-next.1 + - @backstage/plugin-todo-backend@0.1.41-next.1 + ## 0.2.82-next.0 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 22da65099f..2de450b348 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.82-next.0", + "version": "0.2.82-next.2", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 011be941cf..593d30bc3b 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -42,7 +42,6 @@ import { metricsInit, metricsHandler } from './metrics'; import auth from './plugins/auth'; import azureDevOps from './plugins/azure-devops'; import catalog from './plugins/catalog'; -import catalogEventBasedProviders from './plugins/catalogEventBasedProviders'; import codeCoverage from './plugins/codecoverage'; import entityFeedback from './plugins/entityFeedback'; import events from './plugins/events'; @@ -68,6 +67,7 @@ import linguist from './plugins/linguist'; import { PluginEnvironment } from './types'; import { ServerPermissionClient } from '@backstage/plugin-permission-node'; import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; +import { DefaultEventBroker } from '@backstage/plugin-events-backend'; function makeCreateEnv(config: Config) { const root = getRootLogger(); @@ -85,6 +85,8 @@ function makeCreateEnv(config: Config) { discovery, }); + const eventBroker = new DefaultEventBroker(root.child({ type: 'plugin' })); + root.info(`Created UrlReader ${reader}`); return (plugin: string): PluginEnvironment => { @@ -99,6 +101,7 @@ function makeCreateEnv(config: Config) { database, config, reader, + eventBroker, discovery, tokenManager, permissions, @@ -156,18 +159,12 @@ async function main() { const exploreEnv = useHotMemoize(module, () => createEnv('explore')); const lighthouseEnv = useHotMemoize(module, () => createEnv('lighthouse')); - const eventBasedEntityProviders = await catalogEventBasedProviders( - catalogEnv, - ); const linguistEnv = useHotMemoize(module, () => createEnv('linguist')); const apiRouter = Router(); - apiRouter.use( - '/catalog', - await catalog(catalogEnv, eventBasedEntityProviders), - ); + apiRouter.use('/catalog', await catalog(catalogEnv)); apiRouter.use('/code-coverage', await codeCoverage(codeCoverageEnv)); - apiRouter.use('/events', await events(eventsEnv, eventBasedEntityProviders)); + apiRouter.use('/events', await events(eventsEnv)); apiRouter.use('/rollbar', await rollbar(rollbarEnv)); apiRouter.use('/scaffolder', await scaffolder(scaffolderEnv)); apiRouter.use('/tech-insights', await techInsights(techInsightsEnv)); diff --git a/packages/backend/src/plugins/catalogEventBasedProviders.ts b/packages/backend/src/plugins/DemoEventBasedEntityProvider.ts similarity index 63% rename from packages/backend/src/plugins/catalogEventBasedProviders.ts rename to packages/backend/src/plugins/DemoEventBasedEntityProvider.ts index 346ed40fa6..7a032198a3 100644 --- a/packages/backend/src/plugins/catalogEventBasedProviders.ts +++ b/packages/backend/src/plugins/DemoEventBasedEntityProvider.ts @@ -18,15 +18,29 @@ import { EntityProvider, EntityProviderConnection, } from '@backstage/plugin-catalog-node'; -import { EventParams, EventSubscriber } from '@backstage/plugin-events-node'; +import { + EventBroker, + EventParams, + EventSubscriber, +} from '@backstage/plugin-events-node'; import { Logger } from 'winston'; -import { PluginEnvironment } from '../types'; -class DemoEventBasedEntityProvider implements EntityProvider, EventSubscriber { - constructor( - private readonly logger: Logger, - private readonly topics: string[], - ) {} +export class DemoEventBasedEntityProvider + implements EntityProvider, EventSubscriber +{ + private readonly logger: Logger; + private readonly topics: string[]; + + constructor(opts: { + eventBroker: EventBroker; + logger: Logger; + topics: string[]; + }) { + const { eventBroker, logger, topics } = opts; + this.logger = logger; + this.topics = topics; + eventBroker.subscribe(this); + } async onEvent(params: EventParams): Promise { this.logger.info( @@ -48,14 +62,3 @@ class DemoEventBasedEntityProvider implements EntityProvider, EventSubscriber { return DemoEventBasedEntityProvider.name; } } - -export default async function createCatalogEventBasedProviders( - env: PluginEnvironment, -): Promise> { - const providers: Array< - (EntityProvider & EventSubscriber) | Array - > = []; - providers.push(new DemoEventBasedEntityProvider(env.logger, ['example'])); - // add your event-based entity providers here - return providers.flat(); -} diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index f6fe25f86a..ae00d5a7ec 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -15,18 +15,24 @@ */ import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; -import { EntityProvider } from '@backstage/plugin-catalog-node'; import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; +import { DemoEventBasedEntityProvider } from './DemoEventBasedEntityProvider'; export default async function createPlugin( env: PluginEnvironment, - providers?: Array, ): Promise { const builder = await CatalogBuilder.create(env); builder.addProcessor(new ScaffolderEntitiesProcessor()); - builder.addEntityProvider(providers ?? []); + + const demoProvider = new DemoEventBasedEntityProvider({ + logger: env.logger, + topics: ['example'], + eventBroker: env.eventBroker, + }); + builder.addEntityProvider(demoProvider); + const { processingEngine, router } = await builder.build(); await processingEngine.start(); return router; diff --git a/packages/backend/src/plugins/events.ts b/packages/backend/src/plugins/events.ts index 7427d34217..f3ff354240 100644 --- a/packages/backend/src/plugins/events.ts +++ b/packages/backend/src/plugins/events.ts @@ -18,13 +18,11 @@ import { EventsBackend, HttpPostIngressEventPublisher, } from '@backstage/plugin-events-backend'; -import { EventSubscriber } from '@backstage/plugin-events-node'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; export default async function createPlugin( env: PluginEnvironment, - subscribers: EventSubscriber[], ): Promise { const eventsRouter = Router(); @@ -35,8 +33,8 @@ export default async function createPlugin( http.bind(eventsRouter); await new EventsBackend(env.logger) + .setEventBroker(env.eventBroker) .addPublishers(http) - .addSubscribers(subscribers) .start(); return eventsRouter; diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts index 895581c702..ab1baf0c95 100644 --- a/packages/backend/src/types.ts +++ b/packages/backend/src/types.ts @@ -26,6 +26,7 @@ import { import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { IdentityApi } from '@backstage/plugin-auth-node'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; +import { EventBroker } from '@backstage/plugin-events-node'; export type PluginEnvironment = { logger: Logger; @@ -38,4 +39,5 @@ export type PluginEnvironment = { permissions: PermissionEvaluator; scheduler: PluginTaskScheduler; identity: IdentityApi; + eventBroker: EventBroker; }; diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index edd3811ef8..90d71ada6c 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/catalog-client +## 1.4.1-next.0 + +### Patch Changes + +- c1c4e080b79: Fixed bug in `queryEntities` of `CatalogClient` where the `sortField` is supposed to be changed to `orderField`. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 1.4.0 ### Minor Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index 07709d8c65..61af4ff046 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-client", "description": "An isomorphic client for the catalog backend", - "version": "1.4.0", + "version": "1.4.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts index 53bb55b95f..f5c221569d 100644 --- a/packages/catalog-client/src/CatalogClient.test.ts +++ b/packages/catalog-client/src/CatalogClient.test.ts @@ -352,7 +352,7 @@ describe('CatalogClient', () => { ], }); expect(mockedEndpoint.mock.calls[0][0].url.search).toBe( - '?limit=100&sortField=metadata.name,asc&sortField=metadata.uid,desc&fields=a,b&fullTextFilterTerm=query', + '?limit=100&orderField=metadata.name,asc&orderField=metadata.uid,desc&fields=a,b&fullTextFilterTerm=query', ); }); diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index be4ae6289d..c388519e05 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -230,7 +230,7 @@ export class CatalogClient implements CatalogApi { } if (orderFields !== undefined) { (Array.isArray(orderFields) ? orderFields : [orderFields]).forEach( - ({ field, order }) => params.push(`sortField=${field},${order}`), + ({ field, order }) => params.push(`orderField=${field},${order}`), ); } if (fields.length) { diff --git a/packages/catalog-model/src/validation/CommonValidatorFunctions.test.ts b/packages/catalog-model/src/validation/CommonValidatorFunctions.test.ts index a887a9aa2e..88b6e54113 100644 --- a/packages/catalog-model/src/validation/CommonValidatorFunctions.test.ts +++ b/packages/catalog-model/src/validation/CommonValidatorFunctions.test.ts @@ -125,7 +125,7 @@ describe('CommonValidatorFunctions', () => { ['a-b', true], ['-a-b', false], ['a-b-', false], - ['a--b', false], + ['a--b', true], ['a_b', false], ['adam.bertil.caesar', true], ['adam.ber-til.caesar', true], @@ -154,7 +154,8 @@ describe('CommonValidatorFunctions', () => { ['a-b', true], ['-a-b', false], ['a-b-', false], - ['a--b', false], + ['a--b', true], + ['xn--c6h', true], ['a_b', false], [`${'a'.repeat(63)}`, true], [`${'a'.repeat(64)}`, false], diff --git a/packages/catalog-model/src/validation/CommonValidatorFunctions.ts b/packages/catalog-model/src/validation/CommonValidatorFunctions.ts index 40a85c5331..295c5b8895 100644 --- a/packages/catalog-model/src/validation/CommonValidatorFunctions.ts +++ b/packages/catalog-model/src/validation/CommonValidatorFunctions.ts @@ -91,7 +91,7 @@ export class CommonValidatorFunctions { typeof value === 'string' && value.length >= 1 && value.length <= 63 && - /^[a-z0-9]+(\-[a-z0-9]+)*$/.test(value) + /^[a-z0-9]+(?:\-+[a-z0-9]+)*$/.test(value) ); } diff --git a/packages/catalog-model/src/validation/KubernetesValidatorFunctions.test.ts b/packages/catalog-model/src/validation/KubernetesValidatorFunctions.test.ts index c194774906..dad0631b47 100644 --- a/packages/catalog-model/src/validation/KubernetesValidatorFunctions.test.ts +++ b/packages/catalog-model/src/validation/KubernetesValidatorFunctions.test.ts @@ -31,7 +31,7 @@ describe('KubernetesValidatorFunctions', () => { ['a/a', true], ['a/aAb5C', true], ['a-b.c/v1', true], - ['a--b.c/v1', false], + ['a--b.c/v1', true], [ `${'a'.repeat(63)}.${'a'.repeat(63)}.${'a'.repeat(63)}.${'a'.repeat( 61, @@ -96,7 +96,7 @@ describe('KubernetesValidatorFunctions', () => { ['a-b', true], ['-a-b', false], ['a-b-', false], - ['a--b', false], + ['a--b', true], ['a_b', false], ['a.b', false], ])(`isValidNamespace %p ? %p`, (value, matches) => { @@ -121,7 +121,7 @@ describe('KubernetesValidatorFunctions', () => { ['a..b', true], ['a/a', true], ['a-b.c/a', true], - ['a--b.c/a', false], + ['a--b.c/a', true], [ `${'a'.repeat(63)}.${'a'.repeat(63)}.${'a'.repeat(63)}.${'a'.repeat( 61, @@ -178,7 +178,7 @@ describe('KubernetesValidatorFunctions', () => { ['a..b', true], ['a/a', true], ['a-b.c/a', true], - ['a--b.c/a', false], + ['a--b.c/a', true], [ `${'a'.repeat(63)}.${'a'.repeat(63)}.${'a'.repeat(63)}.${'a'.repeat( 61, diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index e88e554b70..99918f2da5 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/cli +## 0.22.6-next.2 + +### Patch Changes + +- 8075b67e64c: When building a backend package with dependencies any `--config ` options will now be forwarded to any dependent app package builds, unless the build script in the app package already contains a `--config` option. +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/eslint-plugin@0.1.3-next.0 + - @backstage/release-manifests@0.0.9 + - @backstage/types@1.0.2 + +## 0.22.6-next.1 + +### Patch Changes + +- 24432ae52fb: Fix the build for packages with multiple entry points to avoid duplicated modules. +- 79e91d4c30a: Support importing `.md` files in build loader +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- b588ab73972: Ensure that the `package prepack` command and backend bundling uses posix paths in `package.json` on all OSes. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/eslint-plugin@0.1.3-next.0 + - @backstage/release-manifests@0.0.9 + - @backstage/types@1.0.2 + ## 0.22.6-next.0 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index d4b4547225..5974116843 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "0.22.6-next.0", + "version": "0.22.6-next.2", "publishConfig": { "access": "public" }, @@ -50,6 +50,7 @@ "@spotify/eslint-config-react": "^14.0.0", "@spotify/eslint-config-typescript": "^14.0.0", "@sucrase/webpack-loader": "^2.0.0", + "@svgr/core": "6.5.x", "@svgr/plugin-jsx": "6.5.x", "@svgr/plugin-svgo": "6.5.x", "@svgr/rollup": "6.5.x", @@ -160,7 +161,8 @@ "mock-fs": "^5.1.0", "msw": "^1.0.0", "nodemon": "^2.0.2", - "ts-node": "^10.0.0" + "ts-node": "^10.0.0", + "type-fest": "^2.19.0" }, "peerDependencies": { "@microsoft/api-extractor": "^7.21.2" diff --git a/packages/cli/src/commands/build/buildBackend.ts b/packages/cli/src/commands/build/buildBackend.ts index 7e61f9ae85..5d42aa18d4 100644 --- a/packages/cli/src/commands/build/buildBackend.ts +++ b/packages/cli/src/commands/build/buildBackend.ts @@ -28,10 +28,11 @@ const SKELETON_FILE = 'skeleton.tar.gz'; interface BuildBackendOptions { targetDir: string; skipBuildDependencies: boolean; + configPaths?: string[]; } export async function buildBackend(options: BuildBackendOptions) { - const { targetDir, skipBuildDependencies } = options; + const { targetDir, skipBuildDependencies, configPaths } = options; const pkg = await fs.readJson(resolvePath(targetDir, 'package.json')); // We build the target package without generating type declarations. @@ -45,6 +46,7 @@ export async function buildBackend(options: BuildBackendOptions) { try { await createDistWorkspace([pkg.name], { targetDir: tmpDir, + configPaths, buildDependencies: !skipBuildDependencies, buildExcludes: [pkg.name], parallelism: getEnvironmentParallelism(), diff --git a/packages/cli/src/commands/build/command.ts b/packages/cli/src/commands/build/command.ts index fcaf58e1ee..90b76545ce 100644 --- a/packages/cli/src/commands/build/command.ts +++ b/packages/cli/src/commands/build/command.ts @@ -20,20 +20,29 @@ import { findRoleFromCommand, getRoleInfo } from '../../lib/role'; import { paths } from '../../lib/paths'; import { buildFrontend } from './buildFrontend'; import { buildBackend } from './buildBackend'; +import { isValidUrl } from '../../lib/urls'; export async function command(opts: OptionValues): Promise { const role = await findRoleFromCommand(opts); - if (role === 'frontend') { - return buildFrontend({ - targetDir: paths.targetDir, - configPaths: opts.config as string[], - writeStats: Boolean(opts.stats), + if (role === 'frontend' || role === 'backend') { + const configPaths = (opts.config as string[]).map(arg => { + if (isValidUrl(arg)) { + return arg; + } + return paths.resolveTarget(arg); }); - } - if (role === 'backend') { + + if (role === 'frontend') { + return buildFrontend({ + targetDir: paths.targetDir, + configPaths, + writeStats: Boolean(opts.stats), + }); + } return buildBackend({ targetDir: paths.targetDir, + configPaths, skipBuildDependencies: Boolean(opts.skipBuildDependencies), }); } diff --git a/packages/cli/src/lib/new/FactoryRegistry.ts b/packages/cli/src/lib/new/FactoryRegistry.ts index 9072d46c4c..d16aa0615a 100644 --- a/packages/cli/src/lib/new/FactoryRegistry.ts +++ b/packages/cli/src/lib/new/FactoryRegistry.ts @@ -15,12 +15,12 @@ */ import chalk from 'chalk'; -import inquirer from 'inquirer'; +import inquirer, { Answers } from 'inquirer'; import { AnyFactory, Prompt } from './types'; import * as factories from './factories'; import partition from 'lodash/partition'; -function applyPromptMessageTransforms( +function applyPromptMessageTransforms( prompt: Prompt, transforms: { message: (msg: string) => string; diff --git a/packages/cli/src/lib/new/types.ts b/packages/cli/src/lib/new/types.ts index 5a2460d0df..6a894bf9ef 100644 --- a/packages/cli/src/lib/new/types.ts +++ b/packages/cli/src/lib/new/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { DistinctQuestion } from 'inquirer'; +import { Answers, DistinctQuestion } from 'inquirer'; export interface CreateContext { /** The package scope to use for new packages */ @@ -37,7 +37,9 @@ export interface CreateContext { export type AnyOptions = Record; -export type Prompt = DistinctQuestion & { name: string }; +export type Prompt = DistinctQuestion & { + name: string; +}; export interface Factory { /** diff --git a/packages/cli/src/lib/packager/createDistWorkspace.ts b/packages/cli/src/lib/packager/createDistWorkspace.ts index 2d2967fc44..601f442a73 100644 --- a/packages/cli/src/lib/packager/createDistWorkspace.ts +++ b/packages/cli/src/lib/packager/createDistWorkspace.ts @@ -60,6 +60,11 @@ type Options = { */ targetDir?: string; + /** + * Configuration files to load during packaging. + */ + configPaths?: string[]; + /** * Files to copy into the target workspace. * @@ -127,13 +132,18 @@ export async function createDistWorkspace( if (options.buildDependencies) { const exclude = options.buildExcludes ?? []; + const configPaths = options.configPaths ?? []; const toBuild = new Set( targets.map(_ => _.name).filter(name => !exclude.includes(name)), ); const standardBuilds = new Array(); - const customBuild = new Array<{ dir: string; name: string }>(); + const customBuild = new Array<{ + dir: string; + name: string; + args?: string[]; + }>(); for (const pkg of packages) { if (!toBuild.has(pkg.packageJson.name)) { @@ -166,7 +176,10 @@ export async function createDistWorkspace( console.warn( `Building ${pkg.packageJson.name} separately because it is a bundled package`, ); - customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name }); + const args = buildScript.includes('--config') + ? [] + : configPaths.map(p => ['--config', p]).flat(); + customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name, args }); continue; } @@ -193,8 +206,8 @@ export async function createDistWorkspace( if (customBuild.length > 0) { await runParallelWorkers({ items: customBuild, - worker: async ({ name, dir }) => { - await run('yarn', ['run', 'build'], { + worker: async ({ name, dir, args }) => { + await run('yarn', ['run', 'build', ...(args || [])], { cwd: dir, stdoutLogFunc: prefixLogFunc(`${name}: `, 'stdout'), stderrLogFunc: prefixLogFunc(`${name}: `, 'stderr'), diff --git a/packages/cli/src/lib/packager/productionPack.ts b/packages/cli/src/lib/packager/productionPack.ts index a26f4893d0..30f4545b24 100644 --- a/packages/cli/src/lib/packager/productionPack.ts +++ b/packages/cli/src/lib/packager/productionPack.ts @@ -16,7 +16,7 @@ import fs from 'fs-extra'; import npmPackList from 'npm-packlist'; -import { join as joinPath, resolve as resolvePath } from 'path'; +import { resolve as resolvePath, posix as posixPath } from 'path'; import { ExtendedPackageJSON } from '../monorepo'; import { readEntryPoints } from '../monorepo/entryPoints'; @@ -142,7 +142,7 @@ export async function revertProductionPack(packageDir: string) { function resolveEntrypoint(pkg: any, name: string) { const targetEntry = pkg.publishConfig[name] || pkg[name]; - return targetEntry && joinPath('..', targetEntry); + return targetEntry && posixPath.join('..', targetEntry); } // Writes e.g. alpha/package.json @@ -160,7 +160,7 @@ async function writeReleaseStageEntrypoint( main: resolveEntrypoint(pkg, 'main'), module: resolveEntrypoint(pkg, 'module'), browser: resolveEntrypoint(pkg, 'browser'), - types: joinPath('..', pkg.publishConfig![`${stage}Types`]!), + types: posixPath.join('..', pkg.publishConfig![`${stage}Types`]!), }, { encoding: 'utf8', spaces: 2 }, ); @@ -202,7 +202,7 @@ async function prepareExportsEntryPoints( for (const [key, ext] of Object.entries(EXPORT_MAP)) { const name = `${entryPoint.name}${ext}`; if (distFiles.includes(name)) { - exp[key] = `./${joinPath(`dist`, name)}`; + exp[key] = `./${posixPath.join(`dist`, name)}`; } } exp.default = exp.require ?? exp.import; @@ -228,9 +228,9 @@ async function prepareExportsEntryPoints( { name: pkg.name, version: pkg.version, - ...(exp.default ? { main: joinPath('..', exp.default) } : {}), - ...(exp.import ? { module: joinPath('..', exp.import) } : {}), - ...(exp.types ? { types: joinPath('..', exp.types) } : {}), + ...(exp.default ? { main: posixPath.join('..', exp.default) } : {}), + ...(exp.import ? { module: posixPath.join('..', exp.import) } : {}), + ...(exp.types ? { types: posixPath.join('..', exp.types) } : {}), }, { encoding: 'utf8', spaces: 2 }, ); diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index af0ca61ef0..fbb8d2b430 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/core-app-api +## 1.7.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + +## 1.7.0-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 1.7.0-next.0 ### Minor Changes diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md index d7e4a22873..b6d3722822 100644 --- a/packages/core-app-api/api-report.md +++ b/packages/core-app-api/api-report.md @@ -116,9 +116,11 @@ export const ApiProvider: { (props: PropsWithChildren): JSX.Element; propTypes: { apis: PropTypes.Validator< - PropTypes.InferProps<{ - get: PropTypes.Validator<(...args: any[]) => any>; - }> + NonNullable< + PropTypes.InferProps<{ + get: PropTypes.Validator<(...args: any[]) => any>; + }> + > >; children: PropTypes.Requireable; }; @@ -441,7 +443,26 @@ export class LocalStorageFeatureFlags implements FeatureFlagsApi { // @public export class MicrosoftAuth { // (undocumented) - static create(options: OAuthApiCreateOptions): typeof microsoftAuthApiRef.T; + static create(options: OAuth2CreateOptions): typeof microsoftAuthApiRef.T; + // (undocumented) + getAccessToken( + scope?: string | string[], + options?: AuthRequestOptions, + ): Promise; + // (undocumented) + getBackstageIdentity( + options?: AuthRequestOptions, + ): Promise; + // (undocumented) + getIdToken(options?: AuthRequestOptions): Promise; + // (undocumented) + getProfile(options?: AuthRequestOptions): Promise; + // (undocumented) + sessionState$(): Observable; + // (undocumented) + signIn(): Promise; + // (undocumented) + signOut(): Promise; } // @public diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 1dda0c58f8..6ec3e26ad5 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-app-api", "description": "Core app API used by Backstage apps", - "version": "1.7.0-next.0", + "version": "1.7.0-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -37,19 +37,22 @@ "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", "@types/prop-types": "^15.7.3", + "@types/react": "^16.13.1 || ^17.0.0", + "history": "^5.0.0", "prop-types": "^15.7.2", "react-use": "^17.2.4", "zen-observable": "^0.10.0", "zod": "^3.21.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.test.ts b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.test.ts new file mode 100644 index 0000000000..c71799ed98 --- /dev/null +++ b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.test.ts @@ -0,0 +1,154 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import MicrosoftAuth from './MicrosoftAuth'; +import MockOAuthApi from '../../OAuthRequestApi/MockOAuthApi'; +import { UrlPatternDiscovery } from '../../DiscoveryApi'; +import { ConfigReader } from '@backstage/config'; +import { microsoftAuthApiRef } from '@backstage/core-plugin-api'; +import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { setupServer } from 'msw/node'; +import { rest } from 'msw'; + +describe('MicrosoftAuth', () => { + const server = setupServer(); + setupRequestMockHandlers(server); + const microsoftAuth = MicrosoftAuth.create({ + configApi: new ConfigReader(undefined), + oauthRequestApi: new MockOAuthApi(), + discoveryApi: UrlPatternDiscovery.compile( + 'http://backstage.test/api/{{ pluginId }}', + ), + }); + + describe('with a refresh token', () => { + beforeEach(() => { + server.use( + rest.get( + 'http://backstage.test/api/auth/microsoft/refresh', + async (req, res, ctx) => { + const scopeParam = req.url.searchParams.get('scope'); + return res( + ctx.json({ + providerInfo: { + accessToken: scopeParam + ? 'tokenForOtherResource' + : 'tokenForGrantScopes', + scope: scopeParam || 'grant-resource/scope', + }, + }), + ); + }, + ), + ); + }); + + it('gets access token with requested scopes for grant', async () => { + const accessToken = await microsoftAuth.getAccessToken(); + + expect(accessToken).toEqual('tokenForGrantScopes'); + }); + + it('gets access token for other consented scopes besides those directly granted', async () => { + const accessToken = await microsoftAuth.getAccessToken( + 'azure-resource/scope', + ); + + expect(accessToken).toEqual('tokenForOtherResource'); + }); + + it('fails when requesting scopes for multiple resources at once', async () => { + const accessTokenPromise = microsoftAuth.getAccessToken( + 'one-resource/scope other-resource/scope', + ); + + await expect(accessTokenPromise).rejects.toThrow( + 'Requested access token with scopes from multiple Azure resources: one-resource, other-resource. Access tokens can only have a single audience.', + ); + }); + }); + + describe('without a refresh token', () => { + let mockRequester: jest.Mock; + let sut: typeof microsoftAuthApiRef.T; + + beforeEach(() => { + mockRequester = jest.fn(); + sut = MicrosoftAuth.create({ + configApi: new ConfigReader(undefined), + oauthRequestApi: { + createAuthRequester: jest.fn().mockReturnValue(mockRequester), + authRequest$: jest.fn(), + }, + discoveryApi: UrlPatternDiscovery.compile( + 'http://backstage.test/api/{{ pluginId }}', + ), + }); + server.use( + rest.get( + 'http://backstage.test/api/auth/microsoft/refresh', + (_, res, ctx) => { + return res( + ctx.status(401), + ctx.json({ + error: { + name: 'AuthenticationError', + message: + 'Refresh failed; caused by InputError: Missing session cookie', + cause: { + name: 'InputError', + message: 'Missing session cookie', + }, + }, + request: { + method: 'GET', + url: '/api/auth/microsoft/refresh?env=development', + }, + response: { + statusCode: 401, + }, + }), + ); + }, + ), + ); + }); + + it('gets access token for Microsoft Graph via popup', async () => { + await sut.getAccessToken(); + + expect(mockRequester).toHaveBeenCalledWith( + new Set(['User.Read', 'email', 'offline_access', 'openid', 'profile']), + ); + }); + + it('gets access + refresh token for other azure resources via popup', async () => { + await sut.getAccessToken('azure-resource/scope'); + + expect(mockRequester).toHaveBeenCalledWith( + new Set(['azure-resource/scope', 'offline_access']), + ); + }); + + it('requests scopes for resource ID when scope contains a resource URI', async () => { + await sut.getAccessToken('api://customApiClientId/some.scope'); + + expect(mockRequester).toHaveBeenCalledWith( + new Set(['api://customApiClientId/some.scope', 'offline_access']), + ); + }); + }); +}); diff --git a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts index 30cfde7c6e..fdffb3fc45 100644 --- a/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts +++ b/packages/core-app-api/src/apis/implementations/auth/microsoft/MicrosoftAuth.ts @@ -14,9 +14,15 @@ * limitations under the License. */ -import { microsoftAuthApiRef } from '@backstage/core-plugin-api'; -import { OAuth2 } from '../oauth2'; -import { OAuthApiCreateOptions } from '../types'; +import { + microsoftAuthApiRef, + AuthRequestOptions, + AuthProviderInfo, + ConfigApi, + DiscoveryApi, + OAuthRequestApi, +} from '@backstage/core-plugin-api'; +import { OAuth2, OAuth2CreateOptions } from '../oauth2'; const DEFAULT_PROVIDER = { id: 'microsoft', @@ -30,7 +36,20 @@ const DEFAULT_PROVIDER = { * @public */ export default class MicrosoftAuth { - static create(options: OAuthApiCreateOptions): typeof microsoftAuthApiRef.T { + private oauth2: { [aud: string]: OAuth2 }; + private configApi: ConfigApi | undefined; + private environment: string; + private provider: AuthProviderInfo; + private oauthRequestApi: OAuthRequestApi; + private discoveryApi: DiscoveryApi; + private scopeTransform: (scopes: string[]) => string[]; + + private static MicrosoftGraphID = '00000003-0000-0000-c000-000000000000'; + + static create(options: OAuth2CreateOptions): typeof microsoftAuthApiRef.T { + return new MicrosoftAuth(options); + } + private constructor(options: OAuth2CreateOptions) { const { configApi, environment = 'development', @@ -44,15 +63,114 @@ export default class MicrosoftAuth { 'email', 'User.Read', ], + scopeTransform = scopes => scopes.concat('offline_access'), } = options; - return OAuth2.create({ - configApi, - discoveryApi, - oauthRequestApi, - provider, - environment, - defaultScopes, - }); + this.configApi = configApi; + this.environment = environment; + this.provider = provider; + this.oauthRequestApi = oauthRequestApi; + this.discoveryApi = discoveryApi; + this.scopeTransform = scopeTransform; + + this.oauth2 = { + [MicrosoftAuth.MicrosoftGraphID]: OAuth2.create({ + configApi: this.configApi, + discoveryApi: this.discoveryApi, + oauthRequestApi: this.oauthRequestApi, + provider: this.provider, + environment: this.environment, + scopeTransform: this.scopeTransform, + defaultScopes, + }), + }; + } + + private microsoftGraph(): OAuth2 { + return this.oauth2[MicrosoftAuth.MicrosoftGraphID]; + } + + private static resourceForScopes(scope: string): Promise { + const audiences = scope + .split(' ') + .map(MicrosoftAuth.resourceForScope) + .filter(aud => aud !== 'openid'); + if (audiences.length > 1) { + return Promise.reject( + new Error( + `Requested access token with scopes from multiple Azure resources: ${audiences.join( + ', ', + )}. Access tokens can only have a single audience.`, + ), + ); + } + const audience = audiences[0] ?? MicrosoftAuth.MicrosoftGraphID; + return Promise.resolve(audience); + } + + private static resourceForScope(scope: string): string { + const groups = scope.match(/^(?.*)\/(?[^\/]*)$/)?.groups; + if (groups) { + const { resourceURI } = groups; + const aud = resourceURI.replace(/^api:\/\//, ''); + return aud; + } + switch (scope) { + case 'email': + case 'openid': + case 'offline_access': + case 'profile': { + return 'openid'; + } + default: + return MicrosoftAuth.MicrosoftGraphID; + } + } + + async getAccessToken( + scope?: string | string[], + options?: AuthRequestOptions, + ): Promise { + const aud = + scope === undefined + ? MicrosoftAuth.MicrosoftGraphID + : await MicrosoftAuth.resourceForScopes( + Array.isArray(scope) ? scope.join(' ') : scope, + ); + if (!(aud in this.oauth2)) { + this.oauth2[aud] = OAuth2.create({ + configApi: this.configApi, + discoveryApi: this.discoveryApi, + oauthRequestApi: this.oauthRequestApi, + provider: this.provider, + environment: this.environment, + scopeTransform: this.scopeTransform, + }); + } + return this.oauth2[aud].getAccessToken(scope, options); + } + + getIdToken(options?: AuthRequestOptions) { + return this.microsoftGraph().getIdToken(options); + } + + getProfile(options?: AuthRequestOptions) { + return this.microsoftGraph().getProfile(options); + } + + getBackstageIdentity(options?: AuthRequestOptions) { + return this.microsoftGraph().getBackstageIdentity(options); + } + + signIn() { + return this.microsoftGraph().signIn(); + } + + signOut() { + return this.microsoftGraph().signOut(); + } + + sessionState$() { + return this.microsoftGraph().sessionState$(); } } diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts index 51da9cbfb5..c46e87581f 100644 --- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts +++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.test.ts @@ -59,22 +59,22 @@ describe('DefaultAuthConnector', () => { jest.resetAllMocks(); }); - it('should refresh a session', async () => { + it('should refresh a session with scope', async () => { server.use( - rest.get('*', (_req, res, ctx) => + rest.get('*', (req, res, ctx) => res( ctx.json({ idToken: 'mock-id-token', accessToken: 'mock-access-token', - scopes: 'a b c', + scopes: req.url.searchParams.get('scope') || 'default-scope', expiresInSeconds: '60', }), ), ), ); - const helper = new DefaultAuthConnector(defaultOptions); - const session = await helper.refreshSession(); + const connector = new DefaultAuthConnector(defaultOptions); + const session = await connector.refreshSession(new Set(['a', 'b', 'c'])); expect(session.idToken).toBe('mock-id-token'); expect(session.accessToken).toBe('mock-access-token'); expect(session.scopes).toEqual(new Set(['a', 'b', 'c'])); @@ -89,8 +89,8 @@ describe('DefaultAuthConnector', () => { ), ); - const helper = new DefaultAuthConnector(defaultOptions); - await expect(helper.refreshSession()).rejects.toThrow( + const connector = new DefaultAuthConnector(defaultOptions); + await expect(connector.refreshSession()).rejects.toThrow( 'Auth refresh request failed, Error: Network NOPE', ); }); @@ -98,19 +98,19 @@ describe('DefaultAuthConnector', () => { it('should handle failure response when refreshing session', async () => { server.use(rest.get('*', (_req, res, ctx) => res(ctx.status(401, 'NOPE')))); - const helper = new DefaultAuthConnector(defaultOptions); - await expect(helper.refreshSession()).rejects.toThrow( + const connector = new DefaultAuthConnector(defaultOptions); + await expect(connector.refreshSession()).rejects.toThrow( 'Auth refresh request failed, NOPE', ); }); it('should fail if popup was rejected', async () => { const mockOauth = new MockOAuthApi(); - const helper = new DefaultAuthConnector({ + const connector = new DefaultAuthConnector({ ...defaultOptions, oauthRequestApi: mockOauth, }); - const promise = helper.createSession({ scopes: new Set(['a', 'b']) }); + const promise = connector.createSession({ scopes: new Set(['a', 'b']) }); await mockOauth.rejectAll(); await expect(promise).rejects.toMatchObject({ name: 'RejectedError' }); }); @@ -125,12 +125,12 @@ describe('DefaultAuthConnector', () => { scopes: 'a b', expiresInSeconds: 3600, }); - const helper = new DefaultAuthConnector({ + const connector = new DefaultAuthConnector({ ...defaultOptions, oauthRequestApi: mockOauth, }); - const sessionPromise = helper.createSession({ + const sessionPromise = connector.createSession({ scopes: new Set(['a', 'b']), }); @@ -153,13 +153,13 @@ describe('DefaultAuthConnector', () => { const popupSpy = jest .spyOn(loginPopup, 'showLoginPopup') .mockResolvedValue('my-session'); - const helper = new DefaultAuthConnector({ + const connector = new DefaultAuthConnector({ ...defaultOptions, oauthRequestApi: new MockOAuthApi(), sessionTransform: str => str, }); - const sessionPromise = helper.createSession({ + const sessionPromise = connector.createSession({ scopes: new Set(), instantPopup: true, }); @@ -174,13 +174,13 @@ describe('DefaultAuthConnector', () => { const popupSpy = jest .spyOn(loginPopup, 'showLoginPopup') .mockResolvedValue({ scopes: '' }); - const helper = new DefaultAuthConnector({ + const connector = new DefaultAuthConnector({ ...defaultOptions, joinScopes: scopes => `-${[...scopes].join('')}-`, oauthRequestApi: mockOauth, }); - helper.createSession({ scopes: new Set(['a', 'b']) }); + connector.createSession({ scopes: new Set(['a', 'b']) }); await mockOauth.triggerAll(); diff --git a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts index f2c35b0ba3..728ed3878c 100644 --- a/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts +++ b/packages/core-app-api/src/lib/AuthConnector/DefaultAuthConnector.ts @@ -126,9 +126,12 @@ export class DefaultAuthConnector return this.authRequester(options.scopes); } - async refreshSession(): Promise { + async refreshSession(scopes?: Set): Promise { const res = await fetch( - await this.buildUrl('/refresh', { optional: true }), + await this.buildUrl('/refresh', { + optional: true, + ...(scopes && { scope: this.joinScopesFunc(scopes) }), + }), { headers: { 'x-requested-with': 'XMLHttpRequest', diff --git a/packages/core-app-api/src/lib/AuthConnector/types.ts b/packages/core-app-api/src/lib/AuthConnector/types.ts index 464a2ed627..c8e83e1ccc 100644 --- a/packages/core-app-api/src/lib/AuthConnector/types.ts +++ b/packages/core-app-api/src/lib/AuthConnector/types.ts @@ -25,6 +25,6 @@ export type CreateSessionOptions = { */ export type AuthConnector = { createSession(options: CreateSessionOptions): Promise; - refreshSession(): Promise; + refreshSession(scopes?: Set): Promise; removeSession(): Promise; }; diff --git a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts index a94aca85f8..23432856cb 100644 --- a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts +++ b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts @@ -47,7 +47,7 @@ describe('RefreshingAuthSessionManager', () => { await manager.getSession({}); expect(createSession).toHaveBeenCalledTimes(1); - expect(refreshSession).toHaveBeenCalledTimes(1); + expect(refreshSession).toHaveBeenCalledWith(undefined); expect(stateSubscriber.mock.calls).toEqual([ [SessionState.SignedOut], [SessionState.SignedIn], @@ -103,7 +103,7 @@ describe('RefreshingAuthSessionManager', () => { await manager.getSession({ scopes: new Set(['a']) }); expect(createSession).toHaveBeenCalledTimes(1); - expect(refreshSession).toHaveBeenCalledTimes(1); + expect(refreshSession).toHaveBeenCalledWith(new Set(['a'])); await manager.getSession({ scopes: new Set(['a']) }); expect(createSession).toHaveBeenCalledTimes(1); @@ -134,7 +134,7 @@ describe('RefreshingAuthSessionManager', () => { expect(await manager.getSession({ optional: true })).toBe(undefined); expect(createSession).toHaveBeenCalledTimes(0); - expect(refreshSession).toHaveBeenCalledTimes(1); + expect(refreshSession).toHaveBeenCalledWith(undefined); }); it('should forward option to instantly show auth popup and not attempt refresh', async () => { diff --git a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts index 67d83bb36a..c04eb637de 100644 --- a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts +++ b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts @@ -73,7 +73,9 @@ export class RefreshingAuthSessionManager implements SessionManager { } try { - const refreshedSession = await this.collapsedSessionRefresh(); + const refreshedSession = await this.collapsedSessionRefresh( + options.scopes, + ); const currentScopes = this.sessionScopesFunc(this.currentSession!); const refreshedScopes = this.sessionScopesFunc(refreshedSession); if (hasScopes(refreshedScopes, currentScopes)) { @@ -97,7 +99,7 @@ export class RefreshingAuthSessionManager implements SessionManager { // already had an existing session. if (!this.currentSession && !options.instantPopup) { try { - const newSession = await this.collapsedSessionRefresh(); + const newSession = await this.collapsedSessionRefresh(options.scopes); this.currentSession = newSession; // The session might not have the scopes requested so go back and check again return this.getSession(options); @@ -130,12 +132,12 @@ export class RefreshingAuthSessionManager implements SessionManager { return this.stateTracker.sessionState$(); } - private async collapsedSessionRefresh(): Promise { + private async collapsedSessionRefresh(scopes?: Set): Promise { if (this.refreshPromise) { return this.refreshPromise; } - this.refreshPromise = this.connector.refreshSession(); + this.refreshPromise = this.connector.refreshSession(scopes); try { const session = await this.refreshPromise; diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index b8e29342dc..4f79a0264a 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/core-components +## 0.12.6-next.2 + +### Patch Changes + +- 67140d9f96f: Upgrade `react-virtualized-auto-sizer´ to version `^1.0.11` +- 7e60bee2dea: Split the `BackstageSidebar` style `drawer` class, such that the `width` property is in a separate `drawerWidth` class instead. This makes it such that you can style the `drawer` class in your theme again. +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/version-bridge@1.0.4-next.0 + +## 0.12.6-next.1 + +### Patch Changes + +- d0befd3fb23: Fixed a bug that could prevent auth from working when using the `guest` or `custom` auth providers. +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.12.6-next.0 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 2d83426a09..a885afc8c7 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-components", "description": "Core components used by Backstage plugins and apps", - "version": "0.12.6-next.0", + "version": "0.12.6-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -37,11 +37,13 @@ "@backstage/errors": "workspace:^", "@backstage/theme": "workspace:^", "@backstage/version-bridge": "workspace:^", + "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^20.0.0", + "@types/react": "^16.13.1 || ^17.0.0", "@types/react-sparklines": "^1.7.0", "@types/react-text-truncate": "^0.14.0", "ansi-regex": "^6.0.1", @@ -64,14 +66,13 @@ "react-syntax-highlighter": "^15.4.5", "react-text-truncate": "^0.19.0", "react-use": "^17.3.2", - "react-virtualized-auto-sizer": "^1.0.6", + "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.21.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" @@ -80,6 +81,7 @@ "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/packages/core-components/src/components/LogViewer/RealLogViewer.tsx b/packages/core-components/src/components/LogViewer/RealLogViewer.tsx index 59e0bea44b..adb9eeb760 100644 --- a/packages/core-components/src/components/LogViewer/RealLogViewer.tsx +++ b/packages/core-components/src/components/LogViewer/RealLogViewer.tsx @@ -77,8 +77,8 @@ export function RealLogViewer(props: RealLogViewerProps) { ', () => { fireEvent.click(option); expect(input.textContent).toBe('test 1'); }); + + it('display the placeholder value when selected props updated to undefined', async () => { + const { getByTestId, rerender } = render( + ); + + expect(getByTestId('select').textContent).toBe('All results'); + }); }); diff --git a/packages/core-components/src/components/Select/Select.tsx b/packages/core-components/src/components/Select/Select.tsx index 9cb8822a05..1b57e0d4da 100644 --- a/packages/core-components/src/components/Select/Select.tsx +++ b/packages/core-components/src/components/Select/Select.tsx @@ -163,10 +163,8 @@ export function SelectComponent(props: SelectProps) { }, [triggerReset, multiple]); useEffect(() => { - if (selected !== undefined) { - setValue(selected); - } - }, [selected]); + setValue(selected || (multiple ? [] : '')); + }, [selected, multiple]); const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => { setValue(event.target.value as SelectedItems); diff --git a/packages/core-components/src/components/Table/Table.tsx b/packages/core-components/src/components/Table/Table.tsx index c43345c9d2..848c85eb60 100644 --- a/packages/core-components/src/components/Table/Table.tsx +++ b/packages/core-components/src/components/Table/Table.tsx @@ -376,7 +376,7 @@ export function Table(props: TableProps) { const newData = (data as any[]).filter( el => !!Object.entries(selectedFilters) - .filter(([, value]) => !!value.length) + .filter(([, value]) => !!(value as { length?: number }).length) .every(([key, filterValue]) => { const fieldValue = extractValueByField( el, diff --git a/packages/core-components/src/layout/Sidebar/Bar.tsx b/packages/core-components/src/layout/Sidebar/Bar.tsx index 69b77dd5e1..815d6bc0d6 100644 --- a/packages/core-components/src/layout/Sidebar/Bar.tsx +++ b/packages/core-components/src/layout/Sidebar/Bar.tsx @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { BackstageTheme } from '@backstage/theme'; import Box from '@material-ui/core/Box'; import Button from '@material-ui/core/Button'; @@ -39,7 +40,7 @@ import { useSidebarPinState } from './SidebarPinStateContext'; export type SidebarClassKey = 'drawer' | 'drawerOpen'; const useStyles = makeStyles( theme => ({ - drawer: props => ({ + drawer: { display: 'flex', flexFlow: 'column nowrap', alignItems: 'flex-start', @@ -52,7 +53,6 @@ const useStyles = makeStyles( overflowX: 'hidden', msOverflowStyle: 'none', scrollbarWidth: 'none', - width: props.sidebarConfig.drawerWidthClosed, transition: theme.transitions.create('width', { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.shortest, @@ -63,6 +63,9 @@ const useStyles = makeStyles( '&::-webkit-scrollbar': { display: 'none', }, + }, + drawerWidth: props => ({ + width: props.sidebarConfig.drawerWidthClosed, }), drawerOpen: props => ({ width: props.sidebarConfig.drawerWidthOpen, @@ -174,7 +177,7 @@ const DesktopSidebar = (props: DesktopSidebarProps) => { const isOpen = (state === State.Open && !isSmallScreen) || isPinned; /** - * Close/Open Sidebar directily without delays. Also toggles `SidebarPinState` to avoid hidden content behind Sidebar. + * Close/Open Sidebar directly without delays. Also toggles `SidebarPinState` to avoid hidden content behind Sidebar. */ const setOpen = (open: boolean) => { if (open) { @@ -199,7 +202,7 @@ const DesktopSidebar = (props: DesktopSidebarProps) => { onBlur={disableExpandOnHover ? () => {} : handleClose} > diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 9292367463..c3b4b660d1 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/core-plugin-api +## 1.5.1-next.1 + +### Patch Changes + +- 2898b6c8d52: Minor type tweaks for TypeScript 5.0 +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + +## 1.5.1-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 1.5.0 ### Minor Changes diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md index eabd300fc6..52ee47f6bb 100644 --- a/packages/core-plugin-api/api-report.md +++ b/packages/core-plugin-api/api-report.md @@ -769,10 +769,12 @@ export function useRouteRefParams( ): Params; // @public -export function withApis(apis: TypesToApiRefs):

( - WrappedComponent: React_2.ComponentType

, +export function withApis( + apis: TypesToApiRefs, +): ( + WrappedComponent: React_2.ComponentType, ) => { - (props: React_2.PropsWithChildren>): JSX.Element; + (props: React_2.PropsWithChildren>): JSX.Element; displayName: string; }; ``` diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 283e2b7e34..a5d55c89c6 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-plugin-api", "description": "Core API used by Backstage plugins", - "version": "1.5.0", + "version": "1.5.1-next.1", "publishConfig": { "access": "public" }, @@ -48,19 +48,21 @@ "@backstage/config": "workspace:^", "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", + "@types/react": "^16.13.1 || ^17.0.0", "history": "^5.0.0", "prop-types": "^15.7.2", "zen-observable": "^0.10.0" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/packages/core-plugin-api/src/analytics/AnalyticsContext.tsx b/packages/core-plugin-api/src/analytics/AnalyticsContext.tsx index f28444db46..105be8e2b5 100644 --- a/packages/core-plugin-api/src/analytics/AnalyticsContext.tsx +++ b/packages/core-plugin-api/src/analytics/AnalyticsContext.tsx @@ -91,11 +91,11 @@ export const AnalyticsContext = (options: { * @param values - Analytics context key/value pairs. * @internal */ -export function withAnalyticsContext

( - Component: React.ComponentType

, +export function withAnalyticsContext( + Component: React.ComponentType, values: AnalyticsContextValue, ) { - const ComponentWithAnalyticsContext = (props: P) => { + const ComponentWithAnalyticsContext = (props: TProps) => { return ( diff --git a/packages/core-plugin-api/src/apis/system/useApi.tsx b/packages/core-plugin-api/src/apis/system/useApi.tsx index 465a39cff4..03c4fa33ac 100644 --- a/packages/core-plugin-api/src/apis/system/useApi.tsx +++ b/packages/core-plugin-api/src/apis/system/useApi.tsx @@ -58,11 +58,11 @@ export function useApi(apiRef: ApiRef): T { * @param apis - APIs for the context. * @public */ -export function withApis(apis: TypesToApiRefs) { - return function withApisWrapper

( - WrappedComponent: React.ComponentType

, +export function withApis(apis: TypesToApiRefs) { + return function withApisWrapper( + WrappedComponent: React.ComponentType, ) { - const Hoc = (props: PropsWithChildren>) => { + const Hoc = (props: PropsWithChildren>) => { const apiHolder = useApiHolder(); const impls = {} as T; @@ -79,7 +79,7 @@ export function withApis(apis: TypesToApiRefs) { } } - return ; + return ; }; const displayName = WrappedComponent.displayName || WrappedComponent.name || 'Component'; diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 3ce499d386..861d91dcc3 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/create-app +## 0.4.39-next.2 + +### Patch Changes + +- 2945923b133: Upgraded the TypeScript version to 5.0 + + To apply this change in your own project, switch the TypeScript version in your root `package.json`: + + ```diff + - "typescript": "~4.6.4", + + "typescript": "~5.0.0", + ``` + +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## 0.4.39-next.1 + +### Patch Changes + +- 71fd0966d10: Add `permissionApi` as dependency of the scaffolder-backend plugin +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/cli-common@0.1.12 + ## 0.4.39-next.0 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 264ca6e017..497a4365ad 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.4.39-next.0", + "version": "0.4.39-next.2", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 734de5c6e4..0682114a35 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -35,7 +35,7 @@ "lerna": "^4.0.0", "node-gyp": "^9.0.0", "prettier": "^2.3.2", - "typescript": "~4.6.4" + "typescript": "~5.0.0" }, "resolutions": { "@types/react": "^17", diff --git a/packages/create-app/templates/default-app/packages/app/package.json.hbs b/packages/create-app/templates/default-app/packages/app/package.json.hbs index 306c7c047d..02535e217c 100644 --- a/packages/create-app/templates/default-app/packages/app/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/app/package.json.hbs @@ -48,6 +48,7 @@ "history": "^5.0.0", "react": "^17.0.2", "react-dom": "^17.0.2", + "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4" }, @@ -56,6 +57,7 @@ "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", + "@testing-library/dom": "^8.0.0", "@types/node": "^16.11.26", "@types/react-dom": "*", "cross-env": "^7.0.0", diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index e151728a1b..b42a9d04c3 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/dev-utils +## 1.0.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/app-defaults@1.3.0-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/test-utils@1.3.0-next.2 + - @backstage/theme@0.2.19-next.0 + +## 1.0.14-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/test-utils@1.3.0-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/app-defaults@1.3.0-next.1 + - @backstage/catalog-model@1.2.1 + ## 1.0.14-next.0 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 0568a44472..c6a3dcba1b 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/dev-utils", "description": "Utilities for developing Backstage plugins.", - "version": "1.0.14-next.0", + "version": "1.0.14-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -43,14 +43,15 @@ "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", + "@types/react": "^16.13.1 || ^17.0.0", "react-use": "^17.2.4", "zen-observable": "^0.10.0" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index a3c5ffa88e..b85b553093 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,23 @@ # e2e-test +## 0.2.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.39-next.2 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.39-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + ## 0.2.2-next.0 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 833c5a1eca..558f9c0bf0 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,7 +1,7 @@ { "name": "e2e-test", "description": "E2E test for verifying Backstage packages", - "version": "0.2.2-next.0", + "version": "0.2.2-next.2", "private": true, "backstage": { "role": "cli" diff --git a/packages/eslint-plugin/rules/no-undeclared-imports.js b/packages/eslint-plugin/rules/no-undeclared-imports.js index 06f0afed46..c986b52c65 100644 --- a/packages/eslint-plugin/rules/no-undeclared-imports.js +++ b/packages/eslint-plugin/rules/no-undeclared-imports.js @@ -180,7 +180,7 @@ module.exports = { // The security implication of this is a bit interesting, as crafted add-import // directives could be used to install malicious packages. However, the same is true // for adding malicious packages to package.json, so there's significant difference. - execFileSync('yarn', ['add', ...(flag || []), ...names], { + execFileSync('yarn', ['add', ...(flag ? [flag] : []), ...names], { cwd: localPkg.dir, stdio: 'inherit', }); diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 02a8c9b7e4..b6ada5ca49 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/integration-react +## 1.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## 1.1.12-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + ## 1.1.12-next.0 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 39a8a9908a..a65f6b1917 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-react", "description": "Frontend package for managing integrations towards external systems", - "version": "1.1.12-next.0", + "version": "1.1.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,16 +34,20 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index f81b1824fe..072ead25a0 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration +## 1.4.4-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 1.4.3 ### Patch Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 25e6ba8bf7..482fb886e6 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration", "description": "Helpers for managing integrations towards external systems", - "version": "1.4.3", + "version": "1.4.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,7 +44,6 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/config-loader": "workspace:^", - "@backstage/test-utils": "workspace:^", "@types/luxon": "^3.0.0", "msw": "^1.0.0" }, diff --git a/packages/integration/src/bitbucket/core.test.ts b/packages/integration/src/bitbucket/core.test.ts index 23a193e6fe..6af974723f 100644 --- a/packages/integration/src/bitbucket/core.test.ts +++ b/packages/integration/src/bitbucket/core.test.ts @@ -16,7 +16,7 @@ import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { setupRequestMockHandlers } from '../helpers'; import { BitbucketIntegrationConfig } from './config'; import { getBitbucketDefaultBranch, diff --git a/packages/integration/src/bitbucketCloud/core.test.ts b/packages/integration/src/bitbucketCloud/core.test.ts index 5ce2b74862..3a342bae8b 100644 --- a/packages/integration/src/bitbucketCloud/core.test.ts +++ b/packages/integration/src/bitbucketCloud/core.test.ts @@ -16,7 +16,7 @@ import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { setupRequestMockHandlers } from '../helpers'; import { BitbucketCloudIntegrationConfig } from './config'; import { getBitbucketCloudDefaultBranch, diff --git a/packages/integration/src/bitbucketServer/core.test.ts b/packages/integration/src/bitbucketServer/core.test.ts index 5ed0780604..b03a8dda83 100644 --- a/packages/integration/src/bitbucketServer/core.test.ts +++ b/packages/integration/src/bitbucketServer/core.test.ts @@ -16,7 +16,7 @@ import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { setupRequestMockHandlers } from '../helpers'; import { BitbucketServerIntegrationConfig } from './config'; import { getBitbucketServerDefaultBranch, diff --git a/packages/integration/src/gerrit/core.test.ts b/packages/integration/src/gerrit/core.test.ts index e226492edb..5a829e88f9 100644 --- a/packages/integration/src/gerrit/core.test.ts +++ b/packages/integration/src/gerrit/core.test.ts @@ -17,7 +17,7 @@ import { rest } from 'msw'; import { setupServer } from 'msw/node'; import fetch from 'cross-fetch'; -import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { setupRequestMockHandlers } from '../helpers'; import { GerritIntegrationConfig } from './config'; import { buildGerritGitilesUrl, diff --git a/packages/integration/src/gitea/core.test.ts b/packages/integration/src/gitea/core.test.ts index 520b0f549d..125f3077ef 100644 --- a/packages/integration/src/gitea/core.test.ts +++ b/packages/integration/src/gitea/core.test.ts @@ -15,7 +15,7 @@ */ import { setupServer } from 'msw/node'; -import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { setupRequestMockHandlers } from '../helpers'; import { GiteaIntegrationConfig } from './config'; import { getGiteaEditContentsUrl, diff --git a/packages/integration/src/helpers.ts b/packages/integration/src/helpers.ts index 2e5552d55c..94aafaa6c3 100644 --- a/packages/integration/src/helpers.ts +++ b/packages/integration/src/helpers.ts @@ -104,3 +104,20 @@ export function defaultScmResolveUrl(options: { } return updated.toString(); } + +/** + * Sets up handlers for request mocking + * + * Copied from test-utils, as that is a frontend-only package + * + * @param worker - service worker + */ +export function setupRequestMockHandlers(worker: { + listen: (t: any) => void; + close: () => void; + resetHandlers: () => void; +}) { + beforeAll(() => worker.listen({ onUnhandledRequest: 'error' })); + afterAll(() => worker.close()); + afterEach(() => worker.resetHandlers()); +} diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 5893c3d87c..875bc7a85a 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/repo-tools +## 0.1.4-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + ## 0.1.4-next.0 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index fb1d0c4af8..4a53cc9976 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/repo-tools", "description": "CLI for Backstage repo tooling ", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "publishConfig": { "access": "public" }, @@ -48,6 +48,7 @@ "@backstage/types": "workspace:^", "@types/is-glob": "^4.0.2", "@types/mock-fs": "^4.13.0", + "@types/node": "^16.11.26", "mock-fs": "^5.1.0" }, "peerDependencies": { diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index e1c03b9f9c..44adfb82ac 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,43 @@ # techdocs-cli-embedded-app +## 0.2.81-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.6-next.2 + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/plugin-techdocs@1.6.1-next.2 + - @backstage/app-defaults@1.3.0-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/test-utils@1.3.0-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog@1.10.0-next.2 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + +## 0.2.81-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/cli@0.22.6-next.1 + - @backstage/plugin-techdocs@1.6.1-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/test-utils@1.3.0-next.1 + - @backstage/plugin-catalog@1.10.0-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/app-defaults@1.3.0-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + ## 0.2.81-next.0 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index eab13938f4..38fc6813e6 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.81-next.0", + "version": "0.2.81-next.2", "private": true, "backstage": { "role": "frontend" @@ -30,10 +30,12 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "*", "@types/react-dom": "*", "cross-env": "^7.0.0", "cypress": "^10.0.0", diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 9c1aaee26a..91b7c5841a 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,27 @@ # @techdocs/cli +## 1.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/plugin-techdocs-node@1.6.1-next.2 + +## 1.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/plugin-techdocs-node@1.6.1-next.1 + ## 1.4.1-next.0 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index c8929f3d6a..b1cfda135f 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,7 +1,7 @@ { "name": "@techdocs/cli", "description": "Utility CLI for managing TechDocs sites in Backstage.", - "version": "1.4.1-next.0", + "version": "1.4.1-next.2", "publishConfig": { "access": "public" }, diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 382cce8c09..7992c31644 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/test-utils +## 1.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-permission-react@0.4.12-next.1 + +## 1.3.0-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 1.3.0-next.0 ### Minor Changes diff --git a/packages/test-utils/api-report.md b/packages/test-utils/api-report.md index 37650ff18a..01fc31c28f 100644 --- a/packages/test-utils/api-report.md +++ b/packages/test-utils/api-report.md @@ -173,7 +173,9 @@ export class MockStorageApi implements StorageApi { // (undocumented) forBucket(name: string): StorageApi; // (undocumented) - observe$(key: string): Observable>; + observe$( + key: string, + ): Observable>; // (undocumented) remove(key: string): Promise; // (undocumented) diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 7670d43cbd..b94986aca2 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/test-utils", "description": "Utilities to test Backstage plugins and apps.", - "version": "1.3.0-next.0", + "version": "1.3.0-next.2", "publishConfig": { "access": "public" }, @@ -54,14 +54,15 @@ "@backstage/types": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "zen-observable": "^0.10.0" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" diff --git a/packages/test-utils/src/testUtils/apis/StorageApi/MockStorageApi.ts b/packages/test-utils/src/testUtils/apis/StorageApi/MockStorageApi.ts index 6ce91a4a31..30d523aed2 100644 --- a/packages/test-utils/src/testUtils/apis/StorageApi/MockStorageApi.ts +++ b/packages/test-utils/src/testUtils/apis/StorageApi/MockStorageApi.ts @@ -101,7 +101,9 @@ export class MockStorageApi implements StorageApi { }); } - observe$(key: string): Observable> { + observe$( + key: string, + ): Observable> { return this.observable.filter(({ key: messageKey }) => messageKey === key); } @@ -109,7 +111,7 @@ export class MockStorageApi implements StorageApi { return `${this.namespace}/${encodeURIComponent(key)}`; } - private notifyChanges(message: StorageValueSnapshot) { + private notifyChanges(message: StorageValueSnapshot) { for (const subscription of this.subscribers) { subscription.next(message); } diff --git a/packages/test-utils/src/testUtils/appWrappers.tsx b/packages/test-utils/src/testUtils/appWrappers.tsx index 6543f8b698..8b644ad2d1 100644 --- a/packages/test-utils/src/testUtils/appWrappers.tsx +++ b/packages/test-utils/src/testUtils/appWrappers.tsx @@ -208,7 +208,7 @@ export function wrapInTestApp( let wrappedElement: React.ReactElement; if (Component instanceof Function) { - wrappedElement = ; + wrappedElement = React.createElement(Component as ComponentType); } else { wrappedElement = Component as React.ReactElement; } @@ -233,7 +233,7 @@ export async function renderInTestApp( ): Promise { let wrappedElement: React.ReactElement; if (Component instanceof Function) { - wrappedElement = ; + wrappedElement = React.createElement(Component as ComponentType); } else { wrappedElement = Component as React.ReactElement; } diff --git a/packages/theme/CHANGELOG.md b/packages/theme/CHANGELOG.md index 5f25f513d4..d0228d42ab 100644 --- a/packages/theme/CHANGELOG.md +++ b/packages/theme/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/theme +## 0.2.19-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies + ## 0.2.18 ### Patch Changes diff --git a/packages/theme/package.json b/packages/theme/package.json index 999fb02dac..c137debe3f 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/theme", "description": "material-ui theme for use with Backstage.", - "version": "0.2.18", + "version": "0.2.19-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -34,8 +34,13 @@ "dependencies": { "@material-ui/core": "^4.12.2" }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0" + }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@types/react": "^16.13.1 || ^17.0.0" }, "files": [ "dist" diff --git a/packages/version-bridge/CHANGELOG.md b/packages/version-bridge/CHANGELOG.md index e495787986..12fda32b5d 100644 --- a/packages/version-bridge/CHANGELOG.md +++ b/packages/version-bridge/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/version-bridge +## 1.0.4-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies + ## 1.0.3 ### Patch Changes diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index d57e6e2b45..e92dedbe6b 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/version-bridge", "description": "Utilities used by @backstage packages to support multiple concurrent versions", - "version": "1.0.3", + "version": "1.0.4-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -31,9 +31,13 @@ "clean": "backstage-cli package clean", "start": "backstage-cli package start" }, + "dependencies": { + "@types/react": "^16.13.1 || ^17.0.0" + }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index 53fb3b9f8d..fe4d38223c 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-adr-backend +## 0.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-adr-common@0.2.8-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 0.3.2-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-adr-common@0.2.8-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 0.3.2-next.0 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index fb0c211284..fc30f22440 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.3.2-next.0", + "version": "0.3.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md index 6b5a58da2a..b4cb2a1a51 100644 --- a/plugins/adr-common/CHANGELOG.md +++ b/plugins/adr-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-adr-common +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 0.2.7 ### Patch Changes diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json index e6364f7915..81cb09c0ae 100644 --- a/plugins/adr-common/package.json +++ b/plugins/adr-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-adr-common", "description": "Common functionalities for the adr plugin", - "version": "0.2.7", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr-common/src/index.ts b/plugins/adr-common/src/index.ts index c3a048d9d1..cf71367cba 100644 --- a/plugins/adr-common/src/index.ts +++ b/plugins/adr-common/src/index.ts @@ -77,7 +77,7 @@ export type AdrFilePathFilterFn = (path: string) => boolean; * @public */ export const madrFilePathFilter: AdrFilePathFilterFn = (path: string) => - /^\d{4}-.+\.md$/.test(path); + /^(?:.*\/)?\d{4}-.+\.md$/.test(path); /** * ADR indexable document interface diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index f67ab9bc20..7e5d25251f 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-adr +## 0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-adr-common@0.2.8-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## 0.4.2-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-adr-common@0.2.8-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 0.4.2-next.0 ### Patch Changes diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 453ff62792..a7763ae881 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.4.2-next.0", + "version": "0.4.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,13 +34,15 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", + "lodash": "^4.17.21", "react-markdown": "^8.0.0", "react-use": "^17.2.4", "remark-gfm": "^3.0.1" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -48,6 +50,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/adr/src/components/EntityAdrContent/EntityAdrContent.tsx b/plugins/adr/src/components/EntityAdrContent/EntityAdrContent.tsx index eb5b4aed21..d136de4717 100644 --- a/plugins/adr/src/components/EntityAdrContent/EntityAdrContent.tsx +++ b/plugins/adr/src/components/EntityAdrContent/EntityAdrContent.tsx @@ -16,9 +16,14 @@ import React, { useEffect, useState } from 'react'; import { Link, useSearchParams } from 'react-router-dom'; +import useAsync from 'react-use/lib/useAsync'; + +import groupBy from 'lodash/groupBy'; + import { Content, ContentHeader, + InfoCard, MissingAnnotationEmptyState, Progress, SupportButton, @@ -35,27 +40,119 @@ import { } from '@backstage/plugin-adr-common'; import { useEntity } from '@backstage/plugin-catalog-react'; import { + Box, Chip, + Collapse, Grid, List, ListItem, + ListItemIcon, ListItemText, makeStyles, Theme, Typography, } from '@material-ui/core'; +import ExpandLess from '@material-ui/icons/ExpandLess'; +import ExpandMore from '@material-ui/icons/ExpandMore'; +import FolderIcon from '@material-ui/icons/Folder'; +import { adrApiRef, AdrFileInfo } from '../../api'; import { rootRouteRef } from '../../routes'; import { AdrContentDecorator, AdrReader } from '../AdrReader'; -import { adrApiRef } from '../../api'; -import useAsync from 'react-use/lib/useAsync'; const useStyles = makeStyles((theme: Theme) => ({ adrMenu: { backgroundColor: theme.palette.background.paper, }, + adrContainerTitle: { + color: theme.palette.grey[700], + marginBottom: theme.spacing(1), + }, + adrChip: { + position: 'absolute', + right: 0, + }, })); +const AdrListContainer = (props: { + adrs: AdrFileInfo[]; + selectedAdr: string; + title: string; +}) => { + const { adrs, selectedAdr, title } = props; + const classes = useStyles(); + const rootLink = useRouteRef(rootRouteRef); + const [open, setOpen] = React.useState(true); + + const getChipColor = (status: string) => { + switch (status) { + case 'accepted': + return 'primary'; + case 'rejected': + case 'deprecated': + return 'secondary'; + default: + return 'default'; + } + }; + + const handleClick = () => { + setOpen(!open); + }; + + return ( + <> + {title && ( + + + + + + {open ? : } + + )} + + + {adrs.map((adr, idx) => ( + + + {adr.date} + {adr.status && ( + + )} + + } + /> + + ))} + + + + ); +}; + /** * Component for browsing ADRs on an entity page. * @public @@ -67,10 +164,7 @@ export const EntityAdrContent = (props: { const { contentDecorators, filePathFilterFn } = props; const classes = useStyles(); const { entity } = useEntity(); - const rootLink = useRouteRef(rootRouteRef); - const [adrList, setAdrList] = useState< - { name: string; title?: string; status?: string; date?: string }[] - >([]); + const [adrList, setAdrList] = useState([]); const [searchParams, setSearchParams] = useSearchParams(); const scmIntegrations = useApi(scmIntegrationsApiRef); const adrApi = useApi(adrApiRef); @@ -82,10 +176,15 @@ export const EntityAdrContent = (props: { }, [entity, scmIntegrations]); const selectedAdr = - adrList.find(adr => adr.name === searchParams.get('record'))?.name ?? ''; + adrList.find(adr => adr.path === searchParams.get('record'))?.path ?? ''; + + const adrSubDirectoryFunc = (adr: AdrFileInfo) => { + return adr.path.split('/').slice(0, -1).join('/'); + }; + useEffect(() => { if (adrList.length && !selectedAdr) { - searchParams.set('record', adrList[0].name); + searchParams.set('record', adrList[0].path); setSearchParams(searchParams, { replace: true }); } }); @@ -95,29 +194,20 @@ export const EntityAdrContent = (props: { return; } - const adrs = value.data - .filter( - (item: { type: string; name: string }) => - item.type === 'file' && - (filePathFilterFn - ? filePathFilterFn(item.name) - : madrFilePathFilter(item.name)), - ) - .map(({ name, title, status, date }) => ({ name, title, status, date })); + const adrs: AdrFileInfo[] = value.data.filter( + (item: AdrFileInfo) => + item.type === 'file' && + (filePathFilterFn + ? filePathFilterFn(item.path) + : madrFilePathFilter(item.path)), + ); setAdrList(adrs); }, [filePathFilterFn, value]); - const getChipColor = (status: string) => { - switch (status) { - case 'accepted': - return 'primary'; - case 'rejected' || 'deprecated': - return 'secondary'; - default: - return 'default'; - } - }; + const adrListGrouped = Object.entries( + groupBy(adrList, adrSubDirectoryFunc), + ).sort(); return ( @@ -141,33 +231,18 @@ export const EntityAdrContent = (props: { (adrList.length ? ( - - {adrList.map((adr, idx) => ( - - + + {adrListGrouped.map(([title, adrs], idx) => ( + - {adr.status && ( - - )} - - ))} - + ))} + + diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index 29771be91c..a04748cc1e 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-airbrake-backend +## 0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + +## 0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + ## 0.2.17-next.0 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index fa3c29c022..6010fd99be 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.2.17-next.0", + "version": "0.2.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index e0efd2802b..23c20ab47e 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-airbrake +## 0.3.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/dev-utils@1.0.14-next.2 + - @backstage/test-utils@1.3.0-next.2 + - @backstage/theme@0.2.19-next.0 + +## 0.3.17-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/test-utils@1.3.0-next.1 + - @backstage/dev-utils@1.0.14-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.3.17-next.0 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index 8249410795..3045c5e365 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.17-next.0", + "version": "0.3.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,6 +36,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -43,10 +44,12 @@ "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index 27a470ce2c..70abb3a232 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-allure +## 0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.1.33-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.33-next.0 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index 986fc62f17..015abaa7ee 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-allure", "description": "A Backstage plugin that integrates with Allure", - "version": "0.1.33-next.0", + "version": "0.1.33-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,6 +35,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -42,10 +43,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index b05b09ab78..cbe66ee1db 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-analytics-module-ga +## 0.1.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + +## 0.1.28-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + ## 0.1.28-next.0 ### Patch Changes diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index f77807b138..84270bd42a 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga", - "version": "0.1.28-next.0", + "version": "0.1.28-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,21 +29,26 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "prop-types": "^15.7.2", "react-ga": "^3.3.0", "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index 6386aee20b..52f8e91729 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-apache-airflow +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + +## 0.2.10-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + ## 0.2.10-next.0 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index ab732c8129..e8d548387b 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apache-airflow", - "version": "0.2.10-next.0", + "version": "0.2.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,17 +32,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "msw": "^1.0.0" }, "files": [ diff --git a/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md b/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md index f1c0b0499b..5b9411907b 100644 --- a/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md +++ b/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-api-docs-module-protoc-gen-doc +## 0.1.2-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies + ## 0.1.1 ### Patch Changes diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index 0fa001ff0e..92694f95e9 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs-module-protoc-gen-doc", "description": "Additional functionalities for the api-docs plugin that renders the output of the protoc-gen-doc", - "version": "0.1.1", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,7 +34,9 @@ "grpc-docs": "^1.1.2" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 2c850a0cb3..2b3efec31b 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-api-docs +## 0.9.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog@1.10.0-next.2 + +## 0.9.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-catalog@1.10.0-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.9.2-next.0 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 8e24c3ccea..bd4ffcf87e 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.9.2-next.0", + "version": "0.9.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,6 +42,7 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "graphiql": "^1.8.8", "graphql": "^16.0.0", "graphql-ws": "^5.4.1", @@ -50,8 +51,8 @@ "swagger-ui-react": "^4.11.1" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -59,6 +60,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index 6a7ec3d0f2..0bc54602cc 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-apollo-explorer +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## 0.1.10-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index 81ac0f02b9..4fd555c8a2 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apollo-explorer", - "version": "0.1.10-next.0", + "version": "0.1.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,17 +32,21 @@ "use-deep-compare-effect": "^1.8.1" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "*", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index 85873f3ddb..7a77524198 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-app-backend +## 0.3.44-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/types@1.0.2 + +## 0.3.44-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/types@1.0.2 + ## 0.3.44-next.0 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 79a9c70ca5..c244f8272c 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-backend", "description": "A Backstage backend plugin that serves the Backstage frontend app", - "version": "0.3.44-next.0", + "version": "0.3.44-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-backend/src/lib/assets/StaticAssetsStore.test.ts b/plugins/app-backend/src/lib/assets/StaticAssetsStore.test.ts index 3d0973e18c..8a0935d4e3 100644 --- a/plugins/app-backend/src/lib/assets/StaticAssetsStore.test.ts +++ b/plugins/app-backend/src/lib/assets/StaticAssetsStore.test.ts @@ -33,6 +33,8 @@ function createDatabaseManager( }; } +jest.setTimeout(60_000); + describe('StaticAssetsStore', () => { const databases = TestDatabases.create({ ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], @@ -78,7 +80,6 @@ describe('StaticAssetsStore', () => { store.getAsset('does-not-exist.txt'), ).resolves.toBeUndefined(); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -130,7 +131,6 @@ describe('StaticAssetsStore', () => { const sameBar = await store.getAsset('bar'); expect(oldBar!.lastModifiedAt).toEqual(sameBar!.lastModifiedAt); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -172,6 +172,5 @@ describe('StaticAssetsStore', () => { await expect(store.getAsset('new')).resolves.toBeDefined(); await expect(store.getAsset('old')).resolves.toBeUndefined(); }, - 60_000, ); }); diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 3a68d5a495..5f31bc9253 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-auth-backend +## 0.18.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## 0.18.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + ## 0.18.2-next.0 ### Patch Changes diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md index 7515083c09..80db2e0b71 100644 --- a/plugins/auth-backend/api-report.md +++ b/plugins/auth-backend/api-report.md @@ -229,6 +229,12 @@ export const defaultAuthProviderFactories: { [providerId: string]: AuthProviderFactory; }; +// @public (undocumented) +export type EasyAuthResult = { + fullProfile: Profile; + accessToken?: string; +}; + // @public (undocumented) export const encodeState: (state: OAuthState) => string; @@ -641,7 +647,10 @@ export const providers: Readonly<{ } | undefined, ) => AuthProviderFactory; - resolvers: never; + resolvers: Readonly<{ + emailLocalPartMatchingUserEntityName: () => SignInResolver; + emailMatchingUserEntityProfileEmail: () => SignInResolver; + }>; }>; okta: Readonly<{ create: ( @@ -694,6 +703,19 @@ export const providers: Readonly<{ nameIdMatchingUserEntityName(): SignInResolver; }>; }>; + easyAuth: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn: { + resolver: SignInResolver; + }; + } + | undefined, + ) => AuthProviderFactory; + resolvers: never; + }>; }>; // @public (undocumented) diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 83a9a55906..38497f5d6a 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend", "description": "A Backstage backend plugin that handles authentication", - "version": "0.18.2-next.0", + "version": "0.18.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -78,7 +78,6 @@ "devDependencies": { "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", - "@backstage/test-utils": "workspace:^", "@types/body-parser": "^1.19.0", "@types/cookie-parser": "^1.4.2", "@types/express-session": "^1.17.2", diff --git a/plugins/auth-backend/src/providers/azure-easyauth/index.ts b/plugins/auth-backend/src/providers/azure-easyauth/index.ts index 698092d73f..73abde5f37 100644 --- a/plugins/auth-backend/src/providers/azure-easyauth/index.ts +++ b/plugins/auth-backend/src/providers/azure-easyauth/index.ts @@ -15,4 +15,4 @@ */ export { easyAuth } from './provider'; -export type { EasyAuthResponse } from './provider'; +export type { EasyAuthResult } from './provider'; diff --git a/plugins/auth-backend/src/providers/azure-easyauth/provider.ts b/plugins/auth-backend/src/providers/azure-easyauth/provider.ts index 405ca9ed59..7da069f6ae 100644 --- a/plugins/auth-backend/src/providers/azure-easyauth/provider.ts +++ b/plugins/auth-backend/src/providers/azure-easyauth/provider.ts @@ -38,6 +38,7 @@ type Options = { resolverContext: AuthResolverContext; }; +/** @public */ export type EasyAuthResult = { fullProfile: Profile; accessToken?: string; diff --git a/plugins/auth-backend/src/providers/bitbucketServer/provider.test.ts b/plugins/auth-backend/src/providers/bitbucketServer/provider.test.ts index fc48cdbe8b..f31d653b99 100644 --- a/plugins/auth-backend/src/providers/bitbucketServer/provider.test.ts +++ b/plugins/auth-backend/src/providers/bitbucketServer/provider.test.ts @@ -23,7 +23,7 @@ import { BitbucketServerOAuthResult, } from './provider'; import { setupServer } from 'msw/node'; -import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { rest } from 'msw'; jest.mock('../../lib/passport/PassportStrategyHelper', () => { diff --git a/plugins/auth-backend/src/providers/index.ts b/plugins/auth-backend/src/providers/index.ts index a922065fd8..8173a7fbc3 100644 --- a/plugins/auth-backend/src/providers/index.ts +++ b/plugins/auth-backend/src/providers/index.ts @@ -15,6 +15,7 @@ */ export type { AwsAlbResult } from './aws-alb'; +export type { EasyAuthResult } from './azure-easyauth'; export type { BitbucketOAuthResult, BitbucketPassportProfile, diff --git a/plugins/auth-backend/src/providers/microsoft/__testUtils__/fake.test.ts b/plugins/auth-backend/src/providers/microsoft/__testUtils__/fake.test.ts new file mode 100644 index 0000000000..dee37f0f6b --- /dev/null +++ b/plugins/auth-backend/src/providers/microsoft/__testUtils__/fake.test.ts @@ -0,0 +1,90 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { FakeMicrosoftAPI } from './fake'; + +describe('FakeMicrosoftAPI', () => { + const api = new FakeMicrosoftAPI(); + + describe('#token', () => { + it('exchanges auth codes', () => { + const { access_token } = api.token( + new URLSearchParams({ + grant_type: 'authorization_code', + code: api.generateAuthCode('User.Read'), + }), + ); + + expect(api.tokenHasScope(access_token, 'User.Read')).toBe(true); + }); + + it('supports scopes for the first requested audience only', () => { + const { access_token } = api.token( + new URLSearchParams({ + grant_type: 'authorization_code', + code: api.generateAuthCode('someaudience/somescope User.Read'), + }), + ); + + expect(api.tokenHasScope(access_token, 'User.Read')).toBe(false); + }); + + it('special openid scopes do not count towards the 1-audience limit', () => { + const { access_token } = api.token( + new URLSearchParams({ + grant_type: 'authorization_code', + code: api.generateAuthCode('openid offline_access User.Read'), + }), + ); + + expect(api.tokenHasScope(access_token, 'User.Read')).toBe(true); + }); + + it('refreshes tokens', () => { + const { access_token } = api.token( + new URLSearchParams({ + grant_type: 'refresh_token', + refresh_token: api.generateRefreshToken( + 'email openid profile User.Read', + ), + }), + ); + + expect( + api.tokenHasScope(access_token, 'email openid profile User.Read'), + ).toBe(true); + }); + it('requires `openid` scope for ID token', () => { + const { id_token } = api.token( + new URLSearchParams({ + grant_type: 'authorization_code', + code: api.generateAuthCode('User.Read'), + }), + ); + + expect(id_token).toBeUndefined(); + }); + it('requires `offline_access` scope for refresh token', () => { + const { refresh_token } = api.token( + new URLSearchParams({ + grant_type: 'authorization_code', + code: api.generateAuthCode('User.Read'), + }), + ); + + expect(refresh_token).toBeUndefined(); + }); + }); +}); diff --git a/plugins/auth-backend/src/providers/microsoft/__testUtils__/fake.ts b/plugins/auth-backend/src/providers/microsoft/__testUtils__/fake.ts new file mode 100644 index 0000000000..9b3ca09c57 --- /dev/null +++ b/plugins/auth-backend/src/providers/microsoft/__testUtils__/fake.ts @@ -0,0 +1,126 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { decodeJwt } from 'jose'; + +type Claims = { aud: string; scp: string }; + +export class FakeMicrosoftAPI { + generateAccessToken(scope: string): string { + return this.tokenWithClaims(this.allClaimsForScope(scope)).access_token; + } + generateAuthCode(scope: string): string { + return this.encodeClaims(this.allClaimsForScope(scope)); + } + generateRefreshToken(scope: string): string { + return this.encodeClaims(this.allClaimsForScope(scope)); + } + token(formData: URLSearchParams): { + access_token: string; + scope: string; + refresh_token?: string; + id_token?: string; + } { + const scopeParameter = formData.get('scope'); + const claims = + (scopeParameter && this.allClaimsForScope(scopeParameter)) ?? + formData.get('grant_type') === 'refresh_token' + ? this.decodeClaims(formData.get('refresh_token')!) + : this.decodeClaims(formData.get('code')!); + return { + ...this.tokenWithClaims(claims), + ...(this.hasScope(claims, 'offline_access') && { + refresh_token: this.encodeClaims(claims), + }), + ...(this.hasScope(claims, 'openid') && { + id_token: 'header.e30K.microsoft', + }), + }; + } + tokenHasScope(token: string, scope: string): boolean { + const { aud, scp } = decodeJwt(token); + return this.hasScope({ aud: aud as string, scp: scp as string }, scope); + } + private tokenWithClaims(claims: Claims): { + access_token: string; + scope: string; + } { + const filteredClaims = { + ...claims, + scp: claims.scp + .split(' ') + .filter(s => s !== 'offline_access') + .join(' '), + }; + return { + access_token: `header.${Buffer.from( + JSON.stringify(filteredClaims), + ).toString('base64')}.signature`, + scope: this.scopeFromClaims(filteredClaims), + }; + } + private allClaimsForScope(scope: string): Claims { + const scopes = scope.split(' ').map(this.parseScope); + const firstAudience = scopes + .map(({ aud }) => aud) + .find(aud => aud !== 'openid'); + return { + aud: firstAudience ?? '00000003-0000-0000-c000-000000000000', + scp: scopes + .filter(({ aud }) => aud === 'openid' || aud === firstAudience) + .map(({ scp }) => scp) + .join(' '), + }; + } + // auth codes and refresh tokens in this fake system are base64-encoded JSON + // strings of claims + private encodeClaims(claims: Claims): string { + return Buffer.from(JSON.stringify(claims)).toString('base64'); + } + private decodeClaims(encoded: string): Claims { + return JSON.parse(Buffer.from(encoded, 'base64').toString()); + } + private hasScope(claims: Claims, scope: string): boolean { + return this.scopeFromClaims(claims).includes(scope); + } + private parseScope(s: string): Claims { + if (s.includes('/')) { + const [aud, scp] = s.split('/'); + return { aud, scp }; + } + switch (s) { + case 'email': + case 'openid': + case 'offline_access': + case 'profile': { + return { aud: 'openid', scp: s }; + } + default: + return { aud: '00000003-0000-0000-c000-000000000000', scp: s }; + } + } + private scopeFromClaims(claims: Claims): string { + return claims.scp + .split(' ') + .map(this.parseScope) + .map(({ aud, scp }) => + aud === 'openid' || + claims.aud === '00000003-0000-0000-c000-000000000000' + ? scp + : `${claims.aud}/${scp}`, + ) + .join(' '); + } +} diff --git a/plugins/auth-backend/src/providers/microsoft/provider.test.ts b/plugins/auth-backend/src/providers/microsoft/provider.test.ts index e4e919004c..6f8df2d4df 100644 --- a/plugins/auth-backend/src/providers/microsoft/provider.test.ts +++ b/plugins/auth-backend/src/providers/microsoft/provider.test.ts @@ -14,145 +14,423 @@ * limitations under the License. */ -import { MicrosoftAuthProvider } from './provider'; -import * as helpers from '../../lib/passport/PassportStrategyHelper'; -import { OAuthResult } from '../../lib/oauth'; +import { microsoft } from './provider'; import { getVoidLogger } from '@backstage/backend-common'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { ConfigReader } from '@backstage/config'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { AuthResolverContext } from '../types'; +import { AuthProviderRouteHandlers, AuthResolverContext } from '../types'; +import express from 'express'; +import crypto from 'crypto'; +import { FakeMicrosoftAPI } from './__testUtils__/fake'; -jest.mock('../../lib/passport/PassportStrategyHelper', () => { - return { - executeFrameHandlerStrategy: jest.fn(), - }; -}); +describe('MicrosoftAuthProvider', () => { + const nonce = 'AAAAAAAAAAAAAAAAAAAAAA=='; // 16 bytes of zeros in base64 + const state = Buffer.from( + `nonce=${encodeURIComponent(nonce)}&env=development`, + ).toString('hex'); -const mockFrameHandler = jest.spyOn( - helpers, - 'executeFrameHandlerStrategy', -) as unknown as jest.MockedFunction< - () => Promise<{ result: OAuthResult; privateInfo: any }> ->; + const server = setupServer(); + const microsoftApi = new FakeMicrosoftAPI(); + let provider: AuthProviderRouteHandlers; + let response: jest.Mocked; -const mockResult = { - result: { - fullProfile: { - emails: [ - { - type: 'work', - value: 'conrad@example.com', - }, - ], - displayName: 'Conrad', - name: { - familyName: 'Ribas', - givenName: 'Francisco', + setupRequestMockHandlers(server); + + beforeEach(() => { + provider = microsoft.create({ + signIn: { + resolver: microsoft.resolvers.emailMatchingUserEntityAnnotation(), }, - id: 'conrad', - provider: 'microsoft', - photos: [ - { - value: 'some-data', + })({ + providerId: 'microsoft', + globalConfig: { + baseUrl: 'http://backstage.test/api/auth', + appUrl: 'http://backstage.test', + isOriginAllowed: _ => true, + }, + config: new ConfigReader({ + development: { + tenantId: 'tenantId', + clientId: 'clientId', + clientSecret: 'clientSecret', }, - ], - }, - params: { - id_token: 'idToken', - scope: 'scope', - expires_in: 123, - }, - accessToken: 'accessToken', - }, - privateInfo: { - refreshToken: 'wacka', - }, -}; + }), + logger: getVoidLogger(), + resolverContext: { + issueToken: jest.fn(), + findCatalogUser: jest.fn(), + signInWithCatalogUser: _ => + Promise.resolve({ + token: 'header.e30K.backstage', + }), + } as AuthResolverContext, + }) as AuthProviderRouteHandlers; -const server = setupServer(); -setupRequestMockHandlers(server); - -const setupHandlers = () => { - server.use( - rest.get( - 'https://graph.microsoft.com/v1.0/me/photos/*', - async (_, res, ctx) => { - const imageBuffer = new Uint8Array([104, 111, 119, 100, 121]).buffer; + server.use( + rest.post( + 'https://login.microsoftonline.com/tenantId/oauth2/v2.0/token', + async (req, res, ctx) => { + return res( + ctx.json({ + ...microsoftApi.token(new URLSearchParams(await req.text())), + token_type: 'Bearer', + expires_in: 123, + ext_expires_in: 123, + }), + ); + }, + ), + rest.get('https://graph.microsoft.com/v1.0/me/', (req, res, ctx) => { + if ( + !microsoftApi.tokenHasScope( + req.headers.get('authorization')!.replace(/^Bearer /, ''), + 'User.Read', + ) + ) { + return res(ctx.status(403)); + } return res( - ctx.set('Content-Length', imageBuffer.byteLength.toString()), - ctx.set('Content-Type', 'image/jpeg'), - ctx.body(imageBuffer), + ctx.json({ + id: 'conrad', + displayName: 'Conrad', + surname: 'Ribas', + givenName: 'Francisco', + mail: 'conrad@example.com', + }), ); - }, - ), - ); -}; - -describe('createMicrosoftProvider', () => { - it('should auth', async () => { - setupHandlers(); - - const provider = new MicrosoftAuthProvider({ - logger: getVoidLogger(), - resolverContext: {} as AuthResolverContext, - authHandler: async ({ fullProfile }) => ({ - profile: { - email: fullProfile.emails![0]!.value, - displayName: fullProfile.displayName, - picture: 'http://microsoft.com/lols', - }, }), - clientId: 'mock', - clientSecret: 'mock', - callbackUrl: 'mock', + rest.get( + 'https://graph.microsoft.com/v1.0/me/photos/*', + async (req, res, ctx) => { + if ( + !microsoftApi.tokenHasScope( + req.headers.get('authorization')!.replace(/^Bearer /, ''), + 'User.Read', + ) + ) { + return res(ctx.status(403)); + } + const imageBuffer = new Uint8Array([104, 111, 119, 100, 121]).buffer; + return res( + ctx.set('Content-Length', imageBuffer.byteLength.toString()), + ctx.set('Content-Type', 'image/jpeg'), + ctx.body(imageBuffer), + ); + }, + ), + ); + response = { + cookie: jest.fn(), + end: jest.fn(), + json: jest.fn(), + setHeader: jest.fn(), + status: jest.fn(), + } as unknown as jest.Mocked; + response.status.mockReturnValue(response); + }); + + describe('#start', () => { + const randomBytes = jest.spyOn( + crypto, + 'randomBytes', + ) as unknown as jest.MockedFunction<(size: number) => Buffer>; + + afterEach(() => { + randomBytes.mockRestore(); }); - mockFrameHandler.mockResolvedValueOnce(mockResult); - const { response } = await provider.handler({} as any); - expect(response).toEqual({ - providerInfo: { - accessToken: 'accessToken', - expiresInSeconds: 123, - idToken: 'idToken', - scope: 'scope', - }, - profile: { - email: 'conrad@example.com', - displayName: 'Conrad', - picture: 'http://microsoft.com/lols', - }, + it('redirects to authorize URL', async () => { + randomBytes.mockReturnValue(Buffer.from(nonce, 'base64')); + + await provider.start( + { + query: { + env: 'development', + scope: 'email openid profile User.Read', + }, + } as unknown as express.Request, + response, + ); + + expect(response.setHeader).toHaveBeenCalledWith( + 'Location', + 'https://login.microsoftonline.com/tenantId/oauth2/v2.0/authorize' + + '?response_type=code' + + `&redirect_uri=${encodeURIComponent( + 'http://backstage.test/api/auth/microsoft/handler/frame', + )}` + + `&scope=${encodeURIComponent('email openid profile User.Read')}` + + `&state=${state}` + + '&client_id=clientId', + ); }); }); - it('should return the base64 encoded photo data of the profile', async () => { - setupHandlers(); - const provider = new MicrosoftAuthProvider({ - logger: getVoidLogger(), - resolverContext: {} as AuthResolverContext, - authHandler: async ({ fullProfile }) => ({ - profile: { - email: fullProfile.emails![0]!.value, - displayName: fullProfile.displayName, - picture: 'http://microsoft.com/lols', - }, - }), - clientId: 'mock', - clientSecret: 'mock', - callbackUrl: 'mock', - // define resolver to return user `info` for photo validation - signInResolver: async (info, _) => { - return { - id: 'user.name', - token: 'token', - info: info, - }; - }, + describe('#handle', () => { + it('returns provider info and profile with photo data', async () => { + await provider.frameHandler( + { + query: { + env: 'development', + code: microsoftApi.generateAuthCode( + 'email openid profile User.Read', + ), + state, + }, + cookies: { + 'microsoft-nonce': nonce, + }, + } as unknown as express.Request, + response, + ); + + expect(response.end).toHaveBeenCalledWith( + expect.stringContaining( + encodeURIComponent( + JSON.stringify({ + type: 'authorization_response', + response: { + providerInfo: { + accessToken: microsoftApi.generateAccessToken( + 'email openid profile User.Read', + ), + scope: 'email openid profile User.Read', + expiresInSeconds: 123, + idToken: 'header.e30K.microsoft', + }, + profile: { + email: 'conrad@example.com', + picture: 'data:image/jpeg;base64,aG93ZHk=', + displayName: 'Conrad', + }, + backstageIdentity: { + token: 'header.e30K.backstage', + identity: { type: 'user', ownershipEntityRefs: [] }, + }, + }, + }), + ), + ), + ); + }); + + it('returns access token for non-microsoft graph scope', async () => { + await provider.frameHandler( + { + query: { + env: 'development', + code: microsoftApi.generateAuthCode('aks-audience/user.read'), + state, + }, + cookies: { + 'microsoft-nonce': nonce, + }, + } as unknown as express.Request, + response, + ); + + expect(response.end).toHaveBeenCalledWith( + expect.stringContaining( + encodeURIComponent( + JSON.stringify({ + type: 'authorization_response', + response: { + providerInfo: { + accessToken: microsoftApi.generateAccessToken( + 'aks-audience/user.read', + ), + scope: 'aks-audience/user.read', + expiresInSeconds: 123, + }, + profile: {}, + }, + }), + ), + ), + ); + }); + + it('sets refresh token', async () => { + await provider.frameHandler( + { + query: { + env: 'development', + code: microsoftApi.generateAuthCode( + 'email offline_access openid profile User.Read', + ), + state, + }, + cookies: { + 'microsoft-nonce': nonce, + }, + } as unknown as express.Request, + response, + ); + + expect(response.cookie).toHaveBeenCalledWith( + 'microsoft-refresh-token', + microsoftApi.generateRefreshToken( + 'email offline_access openid profile User.Read', + ), + { + domain: 'backstage.test', + httpOnly: true, + maxAge: 86400000000, + path: '/api/auth/microsoft', + sameSite: 'lax', + secure: false, + }, + ); + }); + + it('omits photo data when fetching it fails', async () => { + server.use( + rest.get('https://graph.microsoft.com/v1.0/me/photos/*', (_, res) => + res.networkError('remote hung up'), + ), + ); + + await provider.frameHandler( + { + query: { + env: 'development', + code: microsoftApi.generateAuthCode( + 'email openid profile User.Read', + ), + state, + }, + cookies: { + 'microsoft-nonce': nonce, + }, + } as unknown as express.Request, + response, + ); + + expect(response.end).toHaveBeenCalledWith( + expect.stringContaining( + encodeURIComponent( + JSON.stringify({ + type: 'authorization_response', + response: { + providerInfo: { + accessToken: microsoftApi.generateAccessToken( + 'email openid profile User.Read', + ), + scope: 'email openid profile User.Read', + expiresInSeconds: 123, + idToken: 'header.e30K.microsoft', + }, + profile: { + email: 'conrad@example.com', + displayName: 'Conrad', + }, + backstageIdentity: { + token: 'header.e30K.backstage', + identity: { type: 'user', ownershipEntityRefs: [] }, + }, + }, + }), + ), + ), + ); + }); + }); + + describe('#refresh', () => { + it('returns provider info and profile with photo data', async () => { + await provider.refresh!( + { + query: { + env: 'development', + scope: 'email openid profile User.Read', + }, + header: jest.fn(_ => 'XMLHttpRequest'), + cookies: { + 'microsoft-refresh-token': microsoftApi.generateRefreshToken( + 'email openid profile User.Read', + ), + }, + get: jest.fn(), + } as unknown as express.Request, + response, + ); + + expect(response.json).toHaveBeenCalledWith( + expect.objectContaining({ + providerInfo: { + accessToken: microsoftApi.generateAccessToken( + 'email openid profile User.Read', + ), + scope: 'email openid profile User.Read', + expiresInSeconds: 123, + idToken: 'header.e30K.microsoft', + }, + profile: { + email: 'conrad@example.com', + picture: 'data:image/jpeg;base64,aG93ZHk=', + displayName: 'Conrad', + }, + }), + ); + }); + + it('returns access token for non-microsoft graph scope', async () => { + await provider.refresh!( + { + query: { + env: 'development', + scope: 'aks-audience/user.read', + }, + header: jest.fn(_ => 'XMLHttpRequest'), + cookies: { + 'microsoft-refresh-token': microsoftApi.generateRefreshToken( + 'aks-audience/user.read', + ), + }, + get: jest.fn(), + } as unknown as express.Request, + response, + ); + + expect(response.json).toHaveBeenCalledWith({ + providerInfo: { + accessToken: microsoftApi.generateAccessToken( + 'aks-audience/user.read', + ), + expiresInSeconds: 123, + scope: 'aks-audience/user.read', + }, + profile: {}, + }); + }); + + it('returns backstage identity', async () => { + await provider.refresh!( + { + query: { + env: 'development', + scope: 'email openid profile User.Read', + }, + header: jest.fn(_ => 'XMLHttpRequest'), + cookies: { + 'microsoft-refresh-token': microsoftApi.generateRefreshToken( + 'email openid profile User.Read', + ), + }, + get: jest.fn(), + } as unknown as express.Request, + response, + ); + + expect(response.json).toHaveBeenCalledWith( + expect.objectContaining({ + backstageIdentity: expect.objectContaining({ + token: 'header.e30K.backstage', + }), + }), + ); }); - mockFrameHandler.mockResolvedValueOnce(mockResult); - const { response } = await provider.handler({} as any); - const overloadedIdentity = response.backstageIdentity as any; - const photo = overloadedIdentity.info.result.fullProfile.photos[0]; - expect(photo.value).toEqual('data:image/jpeg;base64,aG93ZHk='); }); }); diff --git a/plugins/auth-backend/src/providers/microsoft/provider.ts b/plugins/auth-backend/src/providers/microsoft/provider.ts index 9b14a3c91b..5d02b7ef61 100644 --- a/plugins/auth-backend/src/providers/microsoft/provider.ts +++ b/plugins/auth-backend/src/providers/microsoft/provider.ts @@ -49,6 +49,8 @@ import { } from '../resolvers'; import { Logger } from 'winston'; import fetch from 'node-fetch'; +import { decodeJwt } from 'jose'; +import { Profile as PassportProfile } from 'passport'; const BACKSTAGE_SESSION_EXPIRATION = 3600; @@ -86,6 +88,12 @@ export class MicrosoftAuthProvider implements OAuthHandlers { authorizationURL: options.authorizationUrl, tokenURL: options.tokenUrl, passReqToCallback: false, + skipUserProfile: ( + accessToken: string, + done: (err: unknown, skip: boolean) => void, + ) => { + done(null, this.skipUserProfile(accessToken)); + }, }, ( accessToken: any, @@ -99,6 +107,17 @@ export class MicrosoftAuthProvider implements OAuthHandlers { ); } + private skipUserProfile = (accessToken: string): boolean => { + const { aud, scp } = decodeJwt(accessToken); + const hasGraphReadScope = + aud === '00000003-0000-0000-c000-000000000000' && + (scp as string) + .split(' ') + .map(s => s.toLowerCase()) + .includes('user.read'); + return !hasGraphReadScope; + }; + async start(req: OAuthStartRequest): Promise { return await executeRedirectStrategy(req, this._strategy, { scope: req.scope, @@ -126,53 +145,62 @@ export class MicrosoftAuthProvider implements OAuthHandlers { req.scope, ); - const fullProfile = await executeFetchUserProfileStrategy( - this._strategy, - accessToken, - ); - return { response: await this.handleResult({ - fullProfile, params, accessToken, + ...(!this.skipUserProfile(accessToken) && { + fullProfile: await executeFetchUserProfileStrategy( + this._strategy, + accessToken, + ), + }), }), refreshToken, }; } - private async handleResult(result: OAuthResult) { - const photo = await this.getUserPhoto(result.accessToken); - result.fullProfile.photos = photo ? [{ value: photo }] : undefined; - - const { profile } = await this.authHandler(result, this.resolverContext); + private async handleResult(result: { + fullProfile?: PassportProfile; + params: { + id_token?: string; + scope: string; + expires_in: number; + }; + accessToken: string; + refreshToken?: string; + }): Promise { + let profile = {}; + if (result.fullProfile) { + const photo = await this.getUserPhoto(result.accessToken); + result.fullProfile.photos = photo ? [{ value: photo }] : undefined; + ({ profile } = await this.authHandler( + result as OAuthResult, + this.resolverContext, + )); + } const expiresInSeconds = result.params.expires_in === undefined ? BACKSTAGE_SESSION_EXPIRATION : Math.min(result.params.expires_in, BACKSTAGE_SESSION_EXPIRATION); - const response: OAuthResponse = { + return { providerInfo: { - idToken: result.params.id_token, accessToken: result.accessToken, scope: result.params.scope, expiresInSeconds, + ...{ idToken: result.params.id_token }, }, profile, + ...(result.fullProfile && + this.signInResolver && { + backstageIdentity: await this.signInResolver( + { result: result as OAuthResult, profile }, + this.resolverContext, + ), + }), }; - - if (this.signInResolver) { - response.backstageIdentity = await this.signInResolver( - { - result, - profile, - }, - this.resolverContext, - ); - } - - return response; } private async getUserPhoto(accessToken: string): Promise { @@ -236,7 +264,7 @@ export const microsoft = createAuthProviderIntegration({ const authHandler: AuthHandler = options?.authHandler ? options.authHandler : async ({ fullProfile, params }) => ({ - profile: makeProfileInfo(fullProfile, params.id_token), + profile: makeProfileInfo(fullProfile ?? {}, params.id_token), }); const provider = new MicrosoftAuthProvider({ diff --git a/plugins/auth-backend/src/providers/oidc/provider.ts b/plugins/auth-backend/src/providers/oidc/provider.ts index bce8ba843b..a5196f0930 100644 --- a/plugins/auth-backend/src/providers/oidc/provider.ts +++ b/plugins/auth-backend/src/providers/oidc/provider.ts @@ -44,6 +44,10 @@ import { SignInResolver, } from '../types'; import { createAuthProviderIntegration } from '../createAuthProviderIntegration'; +import { + commonByEmailLocalPartResolver, + commonByEmailResolver, +} from '../resolvers'; type PrivateInfo = { refreshToken?: string; @@ -255,4 +259,14 @@ export const oidc = createAuthProviderIntegration({ }); }); }, + resolvers: { + /** + * Looks up the user by matching their email local part to the entity name. + */ + emailLocalPartMatchingUserEntityName: () => commonByEmailLocalPartResolver, + /** + * Looks up the user by matching their email to the entity email. + */ + emailMatchingUserEntityProfileEmail: () => commonByEmailResolver, + }, }); diff --git a/plugins/auth-backend/src/providers/providers.ts b/plugins/auth-backend/src/providers/providers.ts index aa630b7481..36a24f4f6c 100644 --- a/plugins/auth-backend/src/providers/providers.ts +++ b/plugins/auth-backend/src/providers/providers.ts @@ -32,6 +32,7 @@ import { onelogin } from './onelogin'; import { saml } from './saml'; import { AuthProviderFactory } from './types'; import { bitbucketServer } from './bitbucketServer'; +import { easyAuth } from './azure-easyauth'; /** * All built-in auth provider integrations. @@ -56,6 +57,7 @@ export const providers = Object.freeze({ okta, onelogin, saml, + easyAuth, }); /** @@ -73,6 +75,7 @@ export const defaultAuthProviderFactories: { okta: okta.create(), auth0: auth0.create(), microsoft: microsoft.create(), + easyAuth: easyAuth.create(), oauth2: oauth2.create(), oidc: oidc.create(), onelogin: onelogin.create(), diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 210658c09d..9dde123f84 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-auth-node +## 0.2.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.2.13-next.0 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 6e3a74c66d..3c5003793b 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.2.13-next.0", + "version": "0.2.13-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index 6aae0be627..5102c3c787 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-azure-devops-backend +## 0.3.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + +## 0.3.23-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.3.23-next.0 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index dcafd05680..dadb20d3e7 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.3.23-next.0", + "version": "0.3.23-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index de9bb877d4..6f5add94fa 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-azure-devops +## 0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-azure-devops-common@0.3.0 + +## 0.2.8-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.2.8-next.0 ### Patch Changes diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 40104c5036..fcd8a960f8 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.2.8-next.0", + "version": "0.2.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,6 +44,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -51,10 +52,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index 5fda3502c5..38fe8f8478 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-azure-sites-backend +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index 77b6b3091c..fbfd3b2426 100644 --- a/plugins/azure-sites-backend/package.json +++ b/plugins/azure-sites-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites-backend", - "version": "0.1.6-next.0", + "version": "0.1.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites/CHANGELOG.md b/plugins/azure-sites/CHANGELOG.md index 9c4b55e67f..8fddf78af9 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-azure-sites +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-azure-sites-common@0.1.0 + +## 0.1.6-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index 6c8acb0fda..050a854bab 100644 --- a/plugins/azure-sites/package.json +++ b/plugins/azure-sites/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites", - "version": "0.1.6-next.0", + "version": "0.1.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -45,17 +45,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 88fb467687..ae567184a3 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-badges-backend +## 0.1.38-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.1.38-next.0 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index 15caf0ec10..7db6655c28 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.1.38-next.0", + "version": "0.1.38-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index da109890b7..d60a754399 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-badges +## 0.2.41-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.2.41-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.2.41-next.0 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index 51ed87a34a..f0ce91bbf0 100644 --- a/plugins/badges/package.json +++ b/plugins/badges/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges", "description": "A Backstage plugin that generates README badges for your entities", - "version": "0.2.41-next.0", + "version": "0.2.41-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,6 +42,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -49,10 +50,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index da7151291a..d2fe3dd640 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-bazaar-backend +## 0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + ## 0.2.7-next.0 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index 78ddc51153..3c417dc7aa 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.2.7-next.0", + "version": "0.2.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts b/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts index be4f82f580..8978679ff4 100644 --- a/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts +++ b/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts @@ -31,6 +31,8 @@ const bazaarProject: any = { responsible: 'r', }; +jest.setTimeout(60_000); + describe('DatabaseHandler', () => { const databases = TestDatabases.create({ ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], @@ -96,6 +98,5 @@ describe('DatabaseHandler', () => { res[0].members_count === '1' || res[0].members_count === 1, ).toBeTruthy(); }, - 60_000, ); }); diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index 139a8af90c..a272608a74 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-bazaar +## 0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.6-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog@1.10.0-next.2 + +## 0.2.7-next.1 + +### Patch Changes + +- 656914bb0ad: Added the `fullWidth` and `fullHeight` optional properties to the `BazaarPage`, + to replicate the styling options available on the `BazaarOverviewCard`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/cli@0.22.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-catalog@1.10.0-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.2.7-next.0 ### Patch Changes diff --git a/plugins/bazaar/README.md b/plugins/bazaar/README.md index dbaed74b3b..bd4589f2d3 100644 --- a/plugins/bazaar/README.md +++ b/plugins/bazaar/README.md @@ -39,6 +39,8 @@ const routes = ( ``` +`BazaarPage` can be given the optional properties `fullHeight` and `fullWidth` which are used to adjust the cards styling to fit more or less on the page as required (both default to `true`). + Add a **Bazaar icon** to the Sidebar to easily access the Bazaar. In `packages/app/src/components/Root.tsx` add: ```diff diff --git a/plugins/bazaar/api-report.md b/plugins/bazaar/api-report.md index f4104258e7..11ce735bf5 100644 --- a/plugins/bazaar/api-report.md +++ b/plugins/bazaar/api-report.md @@ -30,6 +30,8 @@ export const BazaarPage: (props: BazaarPageProps) => JSX.Element; export type BazaarPageProps = { title?: string; subtitle?: string; + fullWidth?: boolean; + fullHeight?: boolean; }; // @public (undocumented) @@ -53,7 +55,13 @@ export const isBazaarAvailable: ( ) => Promise; // @public (undocumented) -export const SortView: () => JSX.Element; +export const SortView: (props: SortViewProps) => JSX.Element; + +// @public (undocumented) +export type SortViewProps = { + fullWidth?: boolean; + fullHeight?: boolean; +}; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index ef455587da..34e969ecbe 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.7-next.0", + "version": "0.2.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,12 +43,15 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@testing-library/jest-dom": "^5.10.1", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5" }, "files": [ diff --git a/plugins/bazaar/src/components/HomePage/HomePage.tsx b/plugins/bazaar/src/components/HomePage/HomePage.tsx index 73a8cd7922..98ee6a5196 100644 --- a/plugins/bazaar/src/components/HomePage/HomePage.tsx +++ b/plugins/bazaar/src/components/HomePage/HomePage.tsx @@ -23,16 +23,18 @@ import { About } from '../About'; export type HomePageProps = { title?: string; subtitle?: string; + fullWidth?: boolean; + fullHeight?: boolean; }; export const HomePage = (props: HomePageProps) => { - const { title, subtitle } = props; + const { title, subtitle, fullWidth, fullHeight } = props; const tabContent = [ { path: '/', title: 'Home', - children: , + children: , }, { path: '/about', diff --git a/plugins/bazaar/src/components/SortView/SortView.tsx b/plugins/bazaar/src/components/SortView/SortView.tsx index b3e592fc6f..46f4c64c42 100644 --- a/plugins/bazaar/src/components/SortView/SortView.tsx +++ b/plugins/bazaar/src/components/SortView/SortView.tsx @@ -67,7 +67,14 @@ const getUnlinkedCatalogEntities = ( }; /** @public */ -export const SortView = () => { +export type SortViewProps = { + fullWidth?: boolean; + fullHeight?: boolean; +}; + +/** @public */ +export const SortView = (props: SortViewProps) => { + const { fullWidth = true, fullHeight = true } = props; const bazaarApi = useApi(bazaarApiRef); const catalogApi = useApi(catalogApiRef); const classes = useStyles(); @@ -199,7 +206,8 @@ export const SortView = () => { bazaarProjects={getSearchResults() || []} fetchBazaarProjects={fetchBazaarProjects} catalogEntities={unlinkedCatalogEntities || []} - height="large" + gridSize={fullWidth ? 2 : 4} + height={fullHeight ? 'large' : 'small'} /> diff --git a/plugins/bazaar/src/components/SortView/index.ts b/plugins/bazaar/src/components/SortView/index.ts index 086c7c29d1..b40b2955b5 100644 --- a/plugins/bazaar/src/components/SortView/index.ts +++ b/plugins/bazaar/src/components/SortView/index.ts @@ -15,3 +15,4 @@ */ export { SortView } from './SortView'; +export type { SortViewProps } from './SortView'; diff --git a/plugins/bazaar/src/index.ts b/plugins/bazaar/src/index.ts index 585bab1789..8473cc548c 100644 --- a/plugins/bazaar/src/index.ts +++ b/plugins/bazaar/src/index.ts @@ -20,4 +20,5 @@ export { BazaarOverviewCard } from './components/BazaarOverviewCard'; export type { BazaarOverviewCardProps } from './components/BazaarOverviewCard'; export { EntityBazaarInfoCard } from './components/EntityBazaarInfoCard'; export { SortView } from './components/SortView'; +export type { SortViewProps } from './components/SortView'; export type { HomePageProps as BazaarPageProps } from './components/HomePage'; diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index faeeca7d48..85591e255d 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + ## 0.2.4 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index c5cf434a60..f75fff8858 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", "description": "Common functionalities for bitbucket-cloud plugins", - "version": "0.2.4", + "version": "0.2.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index 4a92237aaa..5c6dcdccec 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-bitrise +## 0.1.44-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.1.44-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.44-next.0 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index 9cdbeda3cd..b6c37d0cb8 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitrise", "description": "A Backstage plugin that integrates towards Bitrise", - "version": "0.1.44-next.0", + "version": "0.1.44-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,20 +36,24 @@ "luxon": "^3.0.0", "qs": "^6.9.6", "react-use": "^17.2.4", - "recharts": "^2.0.0" + "recharts": "^2.5.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "@types/recharts": "^1.8.15", "msw": "^1.0.0" }, diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 1aab4dac82..6058a58ff4 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.1.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + +## 0.1.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + ## 0.1.18-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 0380c59585..bb8226421c 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", "description": "A Backstage catalog backend module that helps integrate towards AWS", - "version": "0.1.18-next.0", + "version": "0.1.18-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 3a7d09070f..bf9c7bc1d4 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.15-next.2 + +### Patch Changes + +- 62a725e3a94: Use the `LocationSpec` type from the `catalog-common` package in place of the deprecated `LocationSpec` from the `catalog-node` package. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 0.1.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/api-report.md b/plugins/catalog-backend-module-azure/api-report.md index a1b9d706a9..596ebbf6cf 100644 --- a/plugins/catalog-backend-module-azure/api-report.md +++ b/plugins/catalog-backend-module-azure/api-report.md @@ -8,7 +8,7 @@ import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; import { EntityProvider } from '@backstage/plugin-catalog-node'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { ScmIntegrationRegistry } from '@backstage/integration'; diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 4ed831fcfd..a1ed6ef5aa 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", "description": "A Backstage catalog backend module that helps integrate towards Azure", - "version": "0.1.15-next.0", + "version": "0.1.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -52,6 +52,7 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "lodash": "^4.17.21", diff --git a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts index 0a1ec1e3cf..4a8e1d4537 100644 --- a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts +++ b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts @@ -16,7 +16,7 @@ import { getVoidLogger } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { AzureDevOpsDiscoveryProcessor, parseUrl, diff --git a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts index fde59046ef..bad6067dc3 100644 --- a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts @@ -22,9 +22,9 @@ import { import { CatalogProcessor, CatalogProcessorEmit, - LocationSpec, processingResult, } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { codeSearch } from '../lib'; diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts index 6ad4e9ae0b..5abd23ce00 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts @@ -20,9 +20,9 @@ import { AzureIntegration, ScmIntegrations } from '@backstage/integration'; import { EntityProvider, EntityProviderConnection, - LocationSpec, locationSpecToLocationEntity, } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { readAzureDevOpsConfigs } from './config'; import { Logger } from 'winston'; import { AzureDevOpsConfig } from './types'; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 4a289a393f..f984b900c4 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + ## 0.1.11-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 6e9aed31be..b234b5da4f 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", - "version": "0.1.11-next.0", + "version": "0.1.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 12e3d2e7d8..442ce64608 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 0.1.9-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 9b680a80ca..71be3ffa1a 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.1.9-next.0", + "version": "0.1.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index c10530f41a..22c721846d 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 0.2.11-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index 92c0adda4a..f00a8e0622 100644 --- a/plugins/catalog-backend-module-bitbucket/package.json +++ b/plugins/catalog-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket", - "version": "0.2.11-next.0", + "version": "0.2.11-next.2", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 98f0959dfd..94f73e33c6 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.1.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 0.1.12-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 3d66f715cc..6dd5c9e094 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.1.12-next.0", + "version": "0.1.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 44760980cb..3703fd1d4f 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,43 @@ # @backstage/plugin-catalog-backend-module-github +## 0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + ## 0.2.7-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index ba7233e70f..b202086e77 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github", "description": "A Backstage catalog backend module that helps integrate towards GitHub", - "version": "0.2.7-next.0", + "version": "0.2.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 02a274469d..e2e09b0fa7 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 0.2.0-next.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 3bdef6958d..2294745a0e 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", "description": "A Backstage catalog backend module that helps integrate towards GitLab", - "version": "0.2.0-next.0", + "version": "0.2.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 5bf522c41b..478bc1f167 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.3.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 66e939dbe3..f0a576cff4 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.3.1-next.0", + "version": "0.3.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index a89c835ef2..d2484c8a38 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.5.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 0.5.11-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 6986f7a84a..17d061498f 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend module that helps integrate towards LDAP", - "version": "0.5.11-next.0", + "version": "0.5.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 9eed88aa13..ca44edf735 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 0.5.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 15f272d48f..28e3a82e8e 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", - "version": "0.5.3-next.0", + "version": "0.5.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 680e86263f..484546af43 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index fd4a8fef4d..268d26ab4d 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", - "version": "0.1.10-next.0", + "version": "0.1.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index 50c805985e..51352842f9 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index f3df2dfdc8..6e4ad500f3 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", - "version": "0.1.1-next.0", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index e450baf77b..d3f7622277 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,52 @@ # @backstage/plugin-catalog-backend +## 1.8.1-next.2 + +### Patch Changes + +- 62a725e3a94: Use the `LocationSpec` type from the `catalog-common` package in place of the deprecated `LocationSpec` from the `catalog-node` package. +- c36b89f2af3: Fixed bug in the `DefaultCatalogProcessingEngine` where entities that contained multiple different types of relations for the same source entity would not properly trigger stitching for that source entity. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 1.8.1-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- c4b846359c0: Allow replacement of the BuiltinKindsEntityProcessor which enables customization of schema validation and connections emitted. +- 01ae205352e: Collator factories instantiated in new backend system modules and now marked as deprecated. Will be continued to be exported publicly until the new backend system is fully rolled out. +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.0 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 1.8.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend/alpha-api-report.md b/plugins/catalog-backend/alpha-api-report.md index df3e809ade..8fd0eb571f 100644 --- a/plugins/catalog-backend/alpha-api-report.md +++ b/plugins/catalog-backend/alpha-api-report.md @@ -79,9 +79,7 @@ export const catalogPlugin: () => BackendFeature; // @alpha export const createCatalogConditionalDecision: ( permission: ResourcePermission<'catalog-entity'>, - conditions: PermissionCriteria< - PermissionCondition<'catalog-entity', PermissionRuleParams> - >, + conditions: PermissionCriteria>, ) => ConditionalPolicyDecision; // @alpha diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 6bd5313e7d..db9e1845fe 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend", "description": "The Backstage backend plugin that provides the Backstage catalog", - "version": "1.8.1-next.0", + "version": "1.8.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/src/database/DefaultCatalogDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultCatalogDatabase.test.ts index 827ab58ebe..bcc20816a4 100644 --- a/plugins/catalog-backend/src/database/DefaultCatalogDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultCatalogDatabase.test.ts @@ -21,6 +21,8 @@ import { DefaultCatalogDatabase } from './DefaultCatalogDatabase'; import { applyDatabaseMigrations } from './migrations'; import { DbRefreshStateReferencesRow, DbRefreshStateRow } from './tables'; +jest.setTimeout(60_000); + describe('DefaultCatalogDatabase', () => { const defaultLogger = getVoidLogger(); const databases = TestDatabases.create({ @@ -105,7 +107,6 @@ describe('DefaultCatalogDatabase', () => { 'location:default/root-2', ]); }, - 60_000, ); }); }); diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index 540c93ef13..db5153a8ba 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -33,6 +33,8 @@ import { createRandomProcessingInterval } from '../processing/refresh'; import { timestampToDateTime } from './conversion'; import { generateStableHash } from './util'; +jest.setTimeout(60_000); + describe('DefaultProcessingDatabase', () => { const defaultLogger = getVoidLogger(); const databases = TestDatabases.create({ @@ -106,7 +108,6 @@ describe('DefaultProcessingDatabase', () => { ); }); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -153,7 +154,6 @@ describe('DefaultProcessingDatabase', () => { ), ); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -193,7 +193,6 @@ describe('DefaultProcessingDatabase', () => { expect(entities[0].errors).toEqual("['something broke']"); expect(entities[0].location_key).toEqual('key'); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -279,7 +278,6 @@ describe('DefaultProcessingDatabase', () => { }, ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -328,7 +326,6 @@ describe('DefaultProcessingDatabase', () => { expect(refreshStateEntries).toHaveLength(1); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -478,7 +475,6 @@ describe('DefaultProcessingDatabase', () => { } }); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -583,7 +579,6 @@ describe('DefaultProcessingDatabase', () => { expect(entities2.length).toBe(1); expect(entities2[0].cache).toEqual('{}'); }, - 60_000, ); }); @@ -636,7 +631,6 @@ describe('DefaultProcessingDatabase', () => { ).resolves.toEqual({ items: [] }); }); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -672,7 +666,6 @@ describe('DefaultProcessingDatabase', () => { const nextUpdateDiff = nextUpdate.diff(now, 'seconds'); expect(nextUpdateDiff.seconds).toBeGreaterThanOrEqual(90); }, - 60_000, ); }); diff --git a/plugins/catalog-backend/src/database/DefaultProviderDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProviderDatabase.test.ts index 09bec187fa..19093b542b 100644 --- a/plugins/catalog-backend/src/database/DefaultProviderDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProviderDatabase.test.ts @@ -24,6 +24,8 @@ import { DefaultProviderDatabase } from './DefaultProviderDatabase'; import { applyDatabaseMigrations } from './migrations'; import { DbRefreshStateReferencesRow, DbRefreshStateRow } from './tables'; +jest.setTimeout(60_000); + describe('DefaultProviderDatabase', () => { const defaultLogger = getVoidLogger(); const databases = TestDatabases.create({ @@ -184,7 +186,6 @@ describe('DefaultProviderDatabase', () => { ), ).toBeTruthy(); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -321,7 +322,6 @@ describe('DefaultProviderDatabase', () => { ), ).toBeFalsy(); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -392,7 +392,6 @@ describe('DefaultProviderDatabase', () => { ), ).toBeTruthy(); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -443,7 +442,6 @@ describe('DefaultProviderDatabase', () => { }), ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -493,7 +491,6 @@ describe('DefaultProviderDatabase', () => { ), ).toBeFalsy(); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -560,7 +557,6 @@ describe('DefaultProviderDatabase', () => { }), ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -688,7 +684,6 @@ describe('DefaultProviderDatabase', () => { }, ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -743,7 +738,6 @@ describe('DefaultProviderDatabase', () => { ]), ); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -777,7 +771,6 @@ describe('DefaultProviderDatabase', () => { const state = await knex('refresh_state').select(); expect(state).toEqual([]); }, - 60_000, ); }); }); diff --git a/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts b/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts index 8ab94df64a..e3cc813c96 100644 --- a/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts +++ b/plugins/catalog-backend/src/database/operations/provider/deleteWithEagerPruningOfChildren.test.ts @@ -21,6 +21,8 @@ import { applyDatabaseMigrations } from '../../migrations'; import { DbRefreshStateReferencesRow, DbRefreshStateRow } from '../../tables'; import { deleteWithEagerPruningOfChildren } from './deleteWithEagerPruningOfChildren'; +jest.setTimeout(60_000); + describe('deleteWithEagerPruningOfChildren', () => { const databases = TestDatabases.create({ ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], @@ -111,7 +113,6 @@ describe('deleteWithEagerPruningOfChildren', () => { await run(knex, { sourceKey: 'P1', entityRefs: ['E1', 'E3'] }); await expect(remainingEntities(knex)).resolves.toEqual(['E4', 'E5']); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -141,7 +142,6 @@ describe('deleteWithEagerPruningOfChildren', () => { await run(knex, { sourceKey: 'P1', entityRefs: ['E1'] }); await expect(remainingEntities(knex)).resolves.toEqual(['E2']); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -170,7 +170,6 @@ describe('deleteWithEagerPruningOfChildren', () => { await run(knex, { sourceKey: 'P1', entityRefs: ['E1'] }); await expect(remainingEntities(knex)).resolves.toEqual(['E2', 'E3']); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -199,7 +198,6 @@ describe('deleteWithEagerPruningOfChildren', () => { await run(knex, { sourceKey: 'P1', entityRefs: ['E1'] }); await expect(remainingEntities(knex)).resolves.toEqual(['E2', 'E3']); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -240,7 +238,6 @@ describe('deleteWithEagerPruningOfChildren', () => { await run(knex, { sourceKey: 'P1', entityRefs: ['E3'] }); await expect(remainingEntities(knex)).resolves.toEqual([]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -273,6 +270,5 @@ describe('deleteWithEagerPruningOfChildren', () => { 'E4', ]); }, - 60_000, ); }); diff --git a/plugins/catalog-backend/src/migrations.test.ts b/plugins/catalog-backend/src/migrations.test.ts index 33f88e9aa7..779d2582bd 100644 --- a/plugins/catalog-backend/src/migrations.test.ts +++ b/plugins/catalog-backend/src/migrations.test.ts @@ -39,6 +39,8 @@ async function migrateUntilBefore(knex: Knex, target: string): Promise { } } +jest.setTimeout(60_000); + describe('migrations', () => { const databases = TestDatabases.create({ ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], @@ -159,7 +161,6 @@ describe('migrations', () => { await knex.destroy(); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -237,6 +238,5 @@ describe('migrations', () => { await knex.destroy(); }, - 60_000, ); }); diff --git a/plugins/catalog-backend/src/modules/core/AnnotateLocationEntityProcessor.test.ts b/plugins/catalog-backend/src/modules/core/AnnotateLocationEntityProcessor.test.ts index 228429c647..66b6300df9 100644 --- a/plugins/catalog-backend/src/modules/core/AnnotateLocationEntityProcessor.test.ts +++ b/plugins/catalog-backend/src/modules/core/AnnotateLocationEntityProcessor.test.ts @@ -17,7 +17,7 @@ import { Entity } from '@backstage/catalog-model'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { AnnotateLocationEntityProcessor } from './AnnotateLocationEntityProcessor'; describe('AnnotateLocationEntityProcessor', () => { diff --git a/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts b/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts index 6154d82330..bafac6e3ac 100644 --- a/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts +++ b/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts @@ -16,7 +16,7 @@ import { Entity } from '@backstage/catalog-model'; import { ConfigReader } from '@backstage/config'; import { AnnotateScmSlugEntityProcessor } from './AnnotateScmSlugEntityProcessor'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; describe('AnnotateScmSlugEntityProcessor', () => { describe('github', () => { diff --git a/plugins/catalog-backend/src/modules/core/DefaultLocationStore.test.ts b/plugins/catalog-backend/src/modules/core/DefaultLocationStore.test.ts index 9a957f8838..fca7faacf8 100644 --- a/plugins/catalog-backend/src/modules/core/DefaultLocationStore.test.ts +++ b/plugins/catalog-backend/src/modules/core/DefaultLocationStore.test.ts @@ -13,11 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; import { v4 as uuid } from 'uuid'; import { applyDatabaseMigrations } from '../../database/migrations'; import { DefaultLocationStore } from './DefaultLocationStore'; +jest.setTimeout(60_000); + describe('DefaultLocationStore', () => { const databases = TestDatabases.create({ ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], @@ -42,7 +45,6 @@ describe('DefaultLocationStore', () => { entities: [], }); }, - 60_000, ); describe('listLocations', () => { @@ -52,7 +54,6 @@ describe('DefaultLocationStore', () => { const { store } = await createLocationStore(databaseId); expect(await store.listLocations()).toEqual([]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -77,7 +78,6 @@ describe('DefaultLocationStore', () => { ]), ); }, - 60_000, ); }); @@ -96,7 +96,6 @@ describe('DefaultLocationStore', () => { new RegExp(`Location ${spec.type}:${spec.target} already exists`), ); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -127,7 +126,6 @@ describe('DefaultLocationStore', () => { ]), }); }, - 60_000, ); }); @@ -141,7 +139,6 @@ describe('DefaultLocationStore', () => { new RegExp(`Found no location with ID ${id}`), ); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -175,7 +172,6 @@ describe('DefaultLocationStore', () => { ], }); }, - 60_000, ); }); }); diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts index a358f1d07e..3002218d89 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts @@ -452,4 +452,247 @@ describe('DefaultCatalogProcessingEngine', () => { ); await engine.stop(); }); + + it('should not stitch sources entities when relations are the same', async () => { + const engine = new DefaultCatalogProcessingEngine( + getVoidLogger(), + db, + orchestrator, + stitcher, + () => hash, + 100, + ); + + db.transaction.mockImplementation(cb => cb((() => {}) as any)); + + const entity = { + apiVersion: '1', + kind: 'k', + metadata: { name: 'me', namespace: 'ns' }, + }; + const processableEntity = { + entityRef: 'foo', + id: '1', + unprocessedEntity: entity, + resultHash: '', + state: [] as any, + nextUpdateAt: DateTime.now(), + lastDiscoveryAt: DateTime.now(), + }; + + db.listParents.mockResolvedValue({ entityRefs: [] }); + db.getProcessableEntities.mockResolvedValueOnce({ + items: [processableEntity], + }); + db.updateProcessedEntity.mockImplementationOnce(async () => ({ + previous: { + relations: [ + { + originating_entity_id: '', + type: 't', + source_entity_ref: 'k:ns/other1', + target_entity_ref: 'k:ns/me', + }, + { + originating_entity_id: '', + type: 't', + source_entity_ref: 'k:ns/other2', + target_entity_ref: 'k:ns/me', + }, + ], + }, + })); + + orchestrator.process.mockResolvedValueOnce({ + ok: true, + completedEntity: entity, + relations: [ + { + type: 't', + source: { kind: 'k', namespace: 'ns', name: 'other1' }, + target: { kind: 'k', namespace: 'ns', name: 'me' }, + }, + { + type: 't', + source: { kind: 'k', namespace: 'ns', name: 'other2' }, + target: { kind: 'k', namespace: 'ns', name: 'me' }, + }, + ], + errors: [], + deferredEntities: [], + state: {}, + refreshKeys: [], + }); + + await engine.start(); + await waitForExpect(() => { + expect(stitcher.stitch).toHaveBeenCalledTimes(1); + }); + expect([...stitcher.stitch.mock.calls[0][0]]).toEqual( + expect.arrayContaining(['k:ns/me']), + ); + await engine.stop(); + }); + + it('should stitch sources entities when new relation of different type added', async () => { + const engine = new DefaultCatalogProcessingEngine( + getVoidLogger(), + db, + orchestrator, + stitcher, + () => hash, + 100, + ); + + db.transaction.mockImplementation(cb => cb((() => {}) as any)); + + const entity = { + apiVersion: '1', + kind: 'k', + metadata: { name: 'me', namespace: 'ns' }, + }; + const processableEntity = { + entityRef: 'foo', + id: '1', + unprocessedEntity: entity, + resultHash: '', + state: [] as any, + nextUpdateAt: DateTime.now(), + lastDiscoveryAt: DateTime.now(), + }; + + db.listParents.mockResolvedValue({ entityRefs: [] }); + db.getProcessableEntities.mockResolvedValueOnce({ + items: [processableEntity], + }); + db.updateProcessedEntity.mockImplementationOnce(async () => ({ + previous: { + relations: [ + { + originating_entity_id: '', + type: 't', + source_entity_ref: 'k:ns/other1', + target_entity_ref: 'k:ns/me', + }, + { + originating_entity_id: '', + type: 't', + source_entity_ref: 'k:ns/other2', + target_entity_ref: 'k:ns/me', + }, + ], + }, + })); + + orchestrator.process.mockResolvedValueOnce({ + ok: true, + completedEntity: entity, + relations: [ + { + type: 't', + source: { kind: 'k', namespace: 'ns', name: 'other1' }, + target: { kind: 'k', namespace: 'ns', name: 'me' }, + }, + { + type: 't', + source: { kind: 'k', namespace: 'ns', name: 'other2' }, + target: { kind: 'k', namespace: 'ns', name: 'me' }, + }, + { + type: 'u', + source: { kind: 'k', namespace: 'ns', name: 'other2' }, + target: { kind: 'k', namespace: 'ns', name: 'me' }, + }, + ], + errors: [], + deferredEntities: [], + state: {}, + refreshKeys: [], + }); + + await engine.start(); + await waitForExpect(() => { + expect(stitcher.stitch).toHaveBeenCalledTimes(1); + }); + expect([...stitcher.stitch.mock.calls[0][0]]).toEqual( + expect.arrayContaining(['k:ns/me', 'k:ns/other2']), + ); + await engine.stop(); + }); + + it('should stitch sources entities when relation is removed', async () => { + const engine = new DefaultCatalogProcessingEngine( + getVoidLogger(), + db, + orchestrator, + stitcher, + () => hash, + 100, + ); + + db.transaction.mockImplementation(cb => cb((() => {}) as any)); + + const entity = { + apiVersion: '1', + kind: 'k', + metadata: { name: 'me', namespace: 'ns' }, + }; + const processableEntity = { + entityRef: 'foo', + id: '1', + unprocessedEntity: entity, + resultHash: '', + state: [] as any, + nextUpdateAt: DateTime.now(), + lastDiscoveryAt: DateTime.now(), + }; + + db.listParents.mockResolvedValue({ entityRefs: [] }); + db.getProcessableEntities.mockResolvedValueOnce({ + items: [processableEntity], + }); + db.updateProcessedEntity.mockImplementationOnce(async () => ({ + previous: { + relations: [ + { + originating_entity_id: '', + type: 't', + source_entity_ref: 'k:ns/other1', + target_entity_ref: 'k:ns/me', + }, + { + originating_entity_id: '', + type: 't', + source_entity_ref: 'k:ns/other2', + target_entity_ref: 'k:ns/me', + }, + ], + }, + })); + + orchestrator.process.mockResolvedValueOnce({ + ok: true, + completedEntity: entity, + relations: [ + { + type: 't', + source: { kind: 'k', namespace: 'ns', name: 'other1' }, + target: { kind: 'k', namespace: 'ns', name: 'me' }, + }, + ], + errors: [], + deferredEntities: [], + state: {}, + refreshKeys: [], + }); + + await engine.start(); + await waitForExpect(() => { + expect(stitcher.stitch).toHaveBeenCalledTimes(1); + }); + expect([...stitcher.stitch.mock.calls[0][0]]).toEqual( + expect.arrayContaining(['k:ns/me', 'k:ns/other2']), + ); + await engine.stop(); + }); }); diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts index c8f159b195..8457381ccd 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts @@ -199,7 +199,7 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { } result.completedEntity.metadata.uid = id; - let oldRelationSources: Set; + let oldRelationSources: Map; await this.processingDatabase.transaction(async tx => { const { previous } = await this.processingDatabase.updateProcessedEntity(tx, { @@ -212,28 +212,32 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { locationKey, refreshKeys: result.refreshKeys, }); - oldRelationSources = new Set( - previous.relations.map(r => r.source_entity_ref), + oldRelationSources = new Map( + previous.relations.map(r => [ + `${r.source_entity_ref}:${r.type}`, + r.source_entity_ref, + ]), ); }); - const newRelationSources = new Set( - result.relations.map(relation => - stringifyEntityRef(relation.source), - ), + const newRelationSources = new Map( + result.relations.map(relation => { + const sourceEntityRef = stringifyEntityRef(relation.source); + return [`${sourceEntityRef}:${relation.type}`, sourceEntityRef]; + }), ); const setOfThingsToStitch = new Set([ stringifyEntityRef(result.completedEntity), ]); - newRelationSources.forEach(r => { - if (!oldRelationSources.has(r)) { - setOfThingsToStitch.add(r); + newRelationSources.forEach((sourceEntityRef, uniqueKey) => { + if (!oldRelationSources.has(uniqueKey)) { + setOfThingsToStitch.add(sourceEntityRef); } }); - oldRelationSources!.forEach(r => { - if (!newRelationSources.has(r)) { - setOfThingsToStitch.add(r); + oldRelationSources!.forEach((sourceEntityRef, uniqueKey) => { + if (!newRelationSources.has(uniqueKey)) { + setOfThingsToStitch.add(sourceEntityRef); } }); diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 25cdc8d826..08ae295834 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -35,6 +35,8 @@ import { buildEntitySearch } from '../stitching/buildEntitySearch'; import { DefaultEntitiesCatalog } from './DefaultEntitiesCatalog'; import { EntitiesRequest } from '../catalog/types'; +jest.setTimeout(60_000); + describe('DefaultEntitiesCatalog', () => { let knex: Knex; @@ -184,7 +186,6 @@ describe('DefaultEntitiesCatalog', () => { ]), ); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -200,7 +201,6 @@ describe('DefaultEntitiesCatalog', () => { catalog.entityAncestry('k:default/root'), ).rejects.toThrow('No such entity k:default/root'); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -273,7 +273,6 @@ describe('DefaultEntitiesCatalog', () => { ]), ); }, - 60_000, ); }); @@ -313,7 +312,6 @@ describe('DefaultEntitiesCatalog', () => { expect(entities.length).toBe(1); expect(entities[0]).toEqual(entity2); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -353,7 +351,6 @@ describe('DefaultEntitiesCatalog', () => { expect(entities.length).toBe(1); expect(entities[0]).toEqual(entity1); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -427,7 +424,6 @@ describe('DefaultEntitiesCatalog', () => { expect(entities).toContainEqual(entity2); expect(entities).toContainEqual(entity4); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -473,7 +469,6 @@ describe('DefaultEntitiesCatalog', () => { expect(entities.length).toBe(1); expect(entities).toContainEqual(entity1); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -510,7 +505,6 @@ describe('DefaultEntitiesCatalog', () => { expect(entities.length).toBe(0); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -569,7 +563,6 @@ describe('DefaultEntitiesCatalog', () => { }, ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -665,7 +658,6 @@ describe('DefaultEntitiesCatalog', () => { }), ).resolves.toEqual(['n4', 'n3', 'n1', 'n2']); }, - 60_000, ); }); @@ -722,7 +714,6 @@ describe('DefaultEntitiesCatalog', () => { 'k:default/two', ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -767,7 +758,6 @@ describe('DefaultEntitiesCatalog', () => { null, ]); }, - 60_000, ); }); @@ -1617,7 +1607,6 @@ describe('DefaultEntitiesCatalog', () => { new Set(['k:default/unrelated1', 'k:default/unrelated2']), ); }, - 60_000, ); }); @@ -1660,7 +1649,6 @@ describe('DefaultEntitiesCatalog', () => { }, }); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -1711,7 +1699,6 @@ describe('DefaultEntitiesCatalog', () => { }, }); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -1757,7 +1744,6 @@ describe('DefaultEntitiesCatalog', () => { }, }); }, - 60_000, ); }); }); diff --git a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts index eafa0b0c14..85cec596ce 100644 --- a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts +++ b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts @@ -34,6 +34,8 @@ import { EntityProcessingRequest } from '../processing/types'; import { Stitcher } from '../stitching/Stitcher'; import { DefaultRefreshService } from './DefaultRefreshService'; +jest.setTimeout(60_000); + describe('DefaultRefreshService', () => { const defaultLogger = getVoidLogger(); const databases = TestDatabases.create({ @@ -221,7 +223,6 @@ describe('DefaultRefreshService', () => { await engine.stop(); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -275,7 +276,6 @@ describe('DefaultRefreshService', () => { await engine.stop(); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -337,6 +337,5 @@ describe('DefaultRefreshService', () => { await engine.stop(); }, - 60_000, ); }); diff --git a/plugins/catalog-backend/src/stitching/Stitcher.test.ts b/plugins/catalog-backend/src/stitching/Stitcher.test.ts index 729793a8d7..1efcb01a3c 100644 --- a/plugins/catalog-backend/src/stitching/Stitcher.test.ts +++ b/plugins/catalog-backend/src/stitching/Stitcher.test.ts @@ -27,6 +27,8 @@ import { } from '../database/tables'; import { Stitcher } from './Stitcher'; +jest.setTimeout(60_000); + describe('Stitcher', () => { const databases = TestDatabases.create({ ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], @@ -267,6 +269,5 @@ describe('Stitcher', () => { ]), ); }, - 60_000, ); }); diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index 37862d47bd..5ec8bafb7a 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-common +## 1.0.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 1.0.12 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index aa7f26f4df..040c6ebf2a 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-common", "description": "Common functionalities for the catalog plugin", - "version": "1.0.12", + "version": "1.0.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md index b71628d43c..509f90ec66 100644 --- a/plugins/catalog-customized/CHANGELOG.md +++ b/plugins/catalog-customized/CHANGELOG.md @@ -1,5 +1,21 @@ # @internal/plugin-catalog-customized +## 0.0.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/plugin-catalog@1.10.0-next.2 + +## 0.0.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-catalog@1.10.0-next.1 + ## 0.0.9-next.0 ### Patch Changes diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json index 0cca05de5a..595bdcf737 100644 --- a/plugins/catalog-customized/package.json +++ b/plugins/catalog-customized/package.json @@ -1,7 +1,7 @@ { "name": "@internal/plugin-catalog-customized", "description": "The internal Backstage Customizable plugin for browsing the Backstage catalog", - "version": "0.0.9-next.0", + "version": "0.0.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,7 +40,9 @@ "@types/react": "^16.13.1 || ^17.0.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "files": [ "dist" diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 5975f7d319..c55bb73225 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-catalog-graph +## 0.2.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.2.29-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + ## 0.2.29-next.0 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index f5cc5f7619..49d157c0d3 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.2.29-next.0", + "version": "0.2.29-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,6 +31,7 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "classnames": "^2.3.1", "lodash": "^4.17.15", "p-limit": "^3.1.0", @@ -38,8 +39,8 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -49,6 +50,7 @@ "@backstage/plugin-catalog": "workspace:^", "@backstage/test-utils": "workspace:^", "@backstage/types": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/catalog-graphql/CHANGELOG.md b/plugins/catalog-graphql/CHANGELOG.md index 041191fcef..39a4340b69 100644 --- a/plugins/catalog-graphql/CHANGELOG.md +++ b/plugins/catalog-graphql/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-graphql +## 0.3.20-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.3.20-next.0 ### Patch Changes diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 11b899f528..f5403b77f5 100644 --- a/plugins/catalog-graphql/package.json +++ b/plugins/catalog-graphql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-graphql", "description": "An experimental Backstage catalog GraphQL module", - "version": "0.3.20-next.0", + "version": "0.3.20-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -46,6 +46,11 @@ "node-fetch": "^2.6.7", "winston": "^3.2.1" }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/test-utils": "workspace:^", @@ -54,6 +59,7 @@ "@graphql-codegen/typescript": "^3.0.0", "@graphql-codegen/typescript-resolvers": "^3.0.0", "@graphql-tools/schema": "^9.0.0", + "@types/react": "^16.13.1 || ^17.0.0", "msw": "^1.0.0" }, "files": [ diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 2298180278..1ea63d5de6 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-catalog-import +## 0.9.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## 0.9.7-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.13-next.0 + ## 0.9.7-next.0 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index d27a6118bd..9fc9198d0f 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-import", "description": "A Backstage plugin the helps you import entities into your catalog", - "version": "0.9.7-next.0", + "version": "0.9.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -46,6 +46,7 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", + "@types/react": "^16.13.1 || ^17.0.0", "git-url-parse": "^13.0.0", "js-base64": "^3.6.0", "lodash": "^4.17.21", @@ -54,8 +55,8 @@ "yaml": "^2.0.0" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -63,6 +64,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index e38a38d596..60912f8b1b 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog-node +## 1.3.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + +## 1.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + ## 1.3.5-next.0 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 31b7032462..eb1c151904 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-node", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", - "version": "1.3.5-next.0", + "version": "1.3.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index f7a96b5f07..8ab5aa53ec 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-catalog-react +## 1.4.1-next.2 + +### Patch Changes + +- 81bee24c5de: Fixed bug in catalog filters where you could not click on the text to select a value. +- 2898b6c8d52: Minor type tweaks for TypeScript 5.0 +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-permission-react@0.4.12-next.1 + +## 1.4.1-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + ## 1.4.1-next.0 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 166da09118..8aed25949f 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-react", "description": "A frontend library that helps other Backstage plugins interact with the catalog", - "version": "1.4.1-next.0", + "version": "1.4.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -60,6 +60,7 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "classnames": "^2.2.6", "jwt-decode": "^3.1.0", "lodash": "^4.17.21", @@ -70,8 +71,8 @@ "zen-observable": "^0.10.0" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -80,6 +81,7 @@ "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-scaffolder-common": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx index b81d681e6d..15e44baf20 100644 --- a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx +++ b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx @@ -114,8 +114,9 @@ export function EntityAutocompletePicker< } as Partial); }, [name, shouldAddFilter, selectedOptions, Filter, updateFilters]); + const filter = filters[name]; if ( - (filters[name] && !('values' in filters[name])) || + (filter && typeof filter === 'object' && !('values' in filter)) || !availableOptions.length ) { return null; diff --git a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePickerOption.tsx b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePickerOption.tsx index 51b57257a9..8c218a352c 100644 --- a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePickerOption.tsx +++ b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePickerOption.tsx @@ -40,6 +40,7 @@ export const EntityAutocompletePickerOption = memo((props: Props) => { } label={label} + onClick={event => event.preventDefault()} /> ); }); diff --git a/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.tsx b/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.tsx index 29002564ca..dd107b2673 100644 --- a/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.tsx +++ b/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.tsx @@ -120,6 +120,7 @@ export const EntityLifecyclePicker = (props: { initialFilter?: string[] }) => { checked={selected} /> } + onClick={event => event.preventDefault()} label={option} /> )} diff --git a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx index c8a6c64dd6..185de3535a 100644 --- a/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx +++ b/plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx @@ -121,6 +121,7 @@ export const EntityOwnerPicker = () => { checked={selected} /> } + onClick={event => event.preventDefault()} label={option} /> )} diff --git a/plugins/catalog-react/src/components/EntityProcessingStatusPicker/EntityProcessingStatusPicker.tsx b/plugins/catalog-react/src/components/EntityProcessingStatusPicker/EntityProcessingStatusPicker.tsx index db48534bc0..01a6e0188d 100644 --- a/plugins/catalog-react/src/components/EntityProcessingStatusPicker/EntityProcessingStatusPicker.tsx +++ b/plugins/catalog-react/src/components/EntityProcessingStatusPicker/EntityProcessingStatusPicker.tsx @@ -91,6 +91,7 @@ export const EntityProcessingStatusPicker = () => { checked={selected} /> } + onClick={event => event.preventDefault()} label={option} /> )} diff --git a/plugins/catalog-react/src/components/EntityRefLink/FetchedEntityRefLinks.tsx b/plugins/catalog-react/src/components/EntityRefLink/FetchedEntityRefLinks.tsx index ea4a32b511..d8f013d50c 100644 --- a/plugins/catalog-react/src/components/EntityRefLink/FetchedEntityRefLinks.tsx +++ b/plugins/catalog-react/src/components/EntityRefLink/FetchedEntityRefLinks.tsx @@ -57,11 +57,14 @@ export function FetchedEntityRefLinks< error, } = useAsync(async () => { const refs = entityRefs.reduce((acc, current) => { - return 'metadata' in current ? acc : [...acc, parseEntityRef(current)]; + if (typeof current === 'object' && 'metadata' in current) { + return acc; + } + return [...acc, parseEntityRef(current)]; }, new Array()); const pureEntities = entityRefs.filter( - ref => 'metadata' in ref, + ref => typeof ref === 'object' && 'metadata' in ref, ) as Array; return refs.length > 0 diff --git a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx index a2b680c02e..4173724ef5 100644 --- a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx +++ b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx @@ -161,8 +161,9 @@ export const EntityListProvider = ( const queryParams = Object.keys(requestedFilters).reduce( (params, key) => { - const filter: EntityFilter | undefined = - requestedFilters[key as keyof EntityFilters]; + const filter = requestedFilters[key as keyof EntityFilters] as + | EntityFilter + | undefined; if (filter?.toQueryValue) { params[key] = filter.toQueryValue(); } diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index d7cd7cbe3a..c3e006f817 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-catalog +## 1.10.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## 1.10.0-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 1.10.0-next.0 ### Minor Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 49242b8724..7e16e90c66 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.10.0-next.0", + "version": "1.10.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -47,6 +47,7 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "history": "^5.0.0", "lodash": "^4.17.21", "pluralize": "^8.0.0", @@ -55,8 +56,8 @@ "zen-observable": "^0.10.0" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -65,6 +66,7 @@ "@backstage/dev-utils": "workspace:^", "@backstage/plugin-permission-react": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index f68f624292..6c70dddbc5 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cicd-statistics@0.1.19-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + +## 0.1.13-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-cicd-statistics@0.1.19-next.1 + - @backstage/catalog-model@1.2.1 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 3cef2e0ff7..9b32cab9ce 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.13-next.0", + "version": "0.1.13-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,8 +36,14 @@ "luxon": "^3.0.0", "p-limit": "^4.0.0" }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@types/react": "^16.13.1 || ^17.0.0" }, "files": [ "dist" diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index 86c2579da9..9f34b725c7 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-cicd-statistics +## 0.1.19-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + +## 0.1.19-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/catalog-model@1.2.1 + ## 0.1.19-next.0 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 1a531cbf88..ef0ad6b742 100644 --- a/plugins/cicd-statistics/package.json +++ b/plugins/cicd-statistics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics", "description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)", - "version": "0.1.19-next.0", + "version": "0.1.19-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -49,11 +49,14 @@ "humanize-duration": "^3.27.0", "lodash": "^4.17.21", "luxon": "^3.0.0", + "prop-types": "^15.7.2", "react-use": "^17.3.1", - "recharts": "^2.1.5" + "recharts": "^2.5.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "files": [ "dist" diff --git a/plugins/cicd-statistics/src/charts/logic/daily-summary.ts b/plugins/cicd-statistics/src/charts/logic/daily-summary.ts index 93c7b07c34..f2ccf9d34c 100644 --- a/plugins/cicd-statistics/src/charts/logic/daily-summary.ts +++ b/plugins/cicd-statistics/src/charts/logic/daily-summary.ts @@ -70,10 +70,14 @@ function countTriggersPerDay(builds: ReadonlyArray) { const values = Object.entries(days).map(([epoch, buildsThisDay]) => { const datapoint = Object.fromEntries( triggerReasons - .map(reason => [ - reason, - buildsThisDay.filter(build => build.triggeredBy === reason).length, - ]) + .map( + reason => + [ + reason, + buildsThisDay.filter(build => build.triggeredBy === reason) + .length, + ] as const, + ) .filter(([_type, count]) => count > 0), ) as Omit; diff --git a/plugins/cicd-statistics/src/charts/status-chart.tsx b/plugins/cicd-statistics/src/charts/status-chart.tsx index 7f70d303d5..ffcdcef7dd 100644 --- a/plugins/cicd-statistics/src/charts/status-chart.tsx +++ b/plugins/cicd-statistics/src/charts/status-chart.tsx @@ -109,7 +109,7 @@ export function StatusChart(props: StatusChartProps) { const tooltipFormatter = useMemo(() => { const reasonSet = new Set(analysis.daily.triggerReasons); - return (percentOrCount: number, name: string) => { + return (percentOrCount: number, name: string): [any, any] => { const label = reasonSet.has(name) ? humanTriggerReason(name) : capitalize(name); @@ -118,6 +118,7 @@ export function StatusChart(props: StatusChartProps) { : percentOrCount; return [ + // TODO(Rugvip): Types don't allow returning elements, but it was here before so presumably works {label}: {valueText} , diff --git a/plugins/cicd-statistics/src/components/utils.tsx b/plugins/cicd-statistics/src/components/utils.tsx index e81c0495ad..05bd6bb100 100644 --- a/plugins/cicd-statistics/src/components/utils.tsx +++ b/plugins/cicd-statistics/src/components/utils.tsx @@ -95,8 +95,12 @@ export function tickFormatterY(duration: number) { .replace(/year.*/, 'y'); } -export function tooltipValueFormatter(durationOrCount: number, name: string) { +export function tooltipValueFormatter( + durationOrCount: number, + name: string, +): [any, any] { return [ + // TODO(Rugvip): Types don't allow returning elements, but it was here before so presumably works {capitalize(name)}:{' '} {name.endsWith(' count') diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index 7dc02638c4..10a03abeb8 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-circleci +## 0.3.17-next.2 + +### Patch Changes + +- d14ac997c36: Add hover over CircleCI avatar icon to show user name in builds table +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.3.17-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.3.17-next.0 ### Patch Changes diff --git a/plugins/circleci/README.md b/plugins/circleci/README.md index 014a2a3f99..f468ab37e2 100644 --- a/plugins/circleci/README.md +++ b/plugins/circleci/README.md @@ -74,4 +74,4 @@ spec: ## Limitations - CircleCI has pretty strict rate limits per token, be careful with opened tabs -- CircleCI doesn't provide a way to auth by 3rd party (e.g. GitHub) token, nor by calling their OAuth endpoints, which currently stands in the way of better auth integration with Backstage (https://discuss.circleci.com/t/circleci-api-authorization-with-github-token/5356) +- CircleCI doesn't provide a way to auth by 3rd party (e.g. GitHub) token, nor by calling their OAuth endpoints, which currently stands in the way of better auth integration with Backstage (reference [feature request](https://ideas.circleci.com/api-feature-requests/p/allow-circleci-api-calls-using-github-auth) and [discussion topic](https://discuss.circleci.com/t/circleci-api-authorization-with-github-token/5356)) diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 5f74d66245..2af2455c7b 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-circleci", "description": "A Backstage plugin that integrates towards Circle CI", - "version": "0.3.17-next.0", + "version": "0.3.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -49,6 +49,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -56,11 +57,13 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/humanize-duration": "^3.25.1", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/circleci/src/components/BuildsPage/lib/CITable/CITable.tsx b/plugins/circleci/src/components/BuildsPage/lib/CITable/CITable.tsx index 22f69ac30f..82ee144a24 100644 --- a/plugins/circleci/src/components/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/circleci/src/components/BuildsPage/lib/CITable/CITable.tsx @@ -21,6 +21,7 @@ import { Box, IconButton, makeStyles, + Tooltip, } from '@material-ui/core'; import RetryIcon from '@material-ui/icons/Replay'; import GitHubIcon from '@material-ui/icons/GitHub'; @@ -116,7 +117,13 @@ const SourceInfo = ({ build }: { build: CITableBuildInfo }) => { return ( - + + + {source?.branchName} @@ -217,7 +224,11 @@ const generatedColumns: TableColumn[] = [ - {row?.workflow?.name} + + + + {row?.workflow?.name} + ), }, diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index e1131349cf..f81013384f 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-cloudbuild +## 0.3.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.3.17-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.3.17-next.0 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index 87b76043d2..c9be4a66bc 100644 --- a/plugins/cloudbuild/package.json +++ b/plugins/cloudbuild/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cloudbuild", "description": "A Backstage plugin that integrates towards Google Cloud Build", - "version": "0.3.17-next.0", + "version": "0.3.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -47,6 +47,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -54,10 +55,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index f84df1f4fd..74efa37203 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-code-climate +## 0.1.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.1.17-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.17-next.0 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 1b75d7c59d..6c1bfa7d05 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-code-climate", - "version": "0.1.17-next.0", + "version": "0.1.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,18 +36,21 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/humanize-duration": "^3.27.1", "@types/luxon": "^3.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index 9f498b3687..0850bc86aa 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-code-coverage-backend +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + +## 0.2.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.2.10-next.0 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index dd4dac88c8..5d43e8901f 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.10-next.0", + "version": "0.2.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index dfa39648c7..cd4afbc753 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-code-coverage +## 0.2.10-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.2.10-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.2.10-next.0 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index e09a20355e..ed4901ab10 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.10-next.0", + "version": "0.2.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,10 +37,11 @@ "highlight.js": "^10.6.0", "luxon": "^3.0.0", "react-use": "^17.2.4", - "recharts": "^2.0.0" + "recharts": "^2.5.0" }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -48,11 +49,13 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/highlightjs": "^10.1.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "@types/recharts": "^1.8.15", "cross-fetch": "^3.1.5", "msw": "^1.0.0" diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index f854b3f22d..7ef63f8d1a 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-codescene +## 0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.1.12-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.1.12-next.0 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 3e688063fc..896eadd58e 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.12-next.0", + "version": "0.1.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,6 +35,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -42,10 +43,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "*", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index e4e81e46c0..e39a5a567a 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-config-schema +## 0.1.40-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + +## 0.1.40-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + ## 0.1.40-next.0 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 13222fd55d..5fe740310b 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-config-schema", "description": "A Backstage plugin that lets you browse the configuration schema of your app", - "version": "0.1.40-next.0", + "version": "0.1.40-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,17 +37,21 @@ "zen-observable": "^0.10.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index 8d459fb000..17fccbe7cf 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-cost-insights +## 0.12.6-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-cost-insights-common@0.1.1 + +## 0.12.6-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-cost-insights-common@0.1.1 + ## 0.12.6-next.0 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index aef2c7635e..d9f94f1516 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.12.6-next.0", + "version": "0.12.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,6 +43,7 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/styles": "^4.9.6", + "@types/react": "^16.13.1 || ^17.0.0", "@types/recharts": "^1.8.14", "classnames": "^2.2.6", "history": "^5.0.0", @@ -50,13 +51,13 @@ "pluralize": "^8.0.0", "qs": "^6.9.4", "react-use": "^17.2.4", - "recharts": "^2.0.0", + "recharts": "^2.5.0", "regression": "^2.0.1", "yup": "^0.32.9" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -64,6 +65,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index 46fde4973e..bea873c257 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-dynatrace +## 3.0.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 3.0.1-next.1 + +### Patch Changes + +- 7d75f6d9b8f: chore: Improve API Reference documentation +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 3.0.1-next.0 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index d01e7eafad..9a857f3948 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "3.0.1-next.0", + "version": "3.0.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,17 +38,21 @@ }, "peerDependencies": { "@backstage/plugin-catalog-react": "workspace:^", - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "*", + "@types/react": "^16.13.1 || ^17.0.0", "express": "^4.18.1", "msw": "^1.0.0" }, diff --git a/plugins/entity-feedback-backend/CHANGELOG.md b/plugins/entity-feedback-backend/CHANGELOG.md index f076d9e130..5c077b876c 100644 --- a/plugins/entity-feedback-backend/CHANGELOG.md +++ b/plugins/entity-feedback-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-entity-feedback-backend +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index aa88dea67f..80be69dfd1 100644 --- a/plugins/entity-feedback-backend/package.json +++ b/plugins/entity-feedback-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback-backend", - "version": "0.1.2-next.0", + "version": "0.1.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback/CHANGELOG.md b/plugins/entity-feedback/CHANGELOG.md index 1fa0d920ab..3981d2c91a 100644 --- a/plugins/entity-feedback/CHANGELOG.md +++ b/plugins/entity-feedback/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-entity-feedback +## 0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + +## 0.2.0-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-entity-feedback-common@0.1.1-next.0 + ## 0.2.0-next.0 ### Minor Changes diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json index bac96f561c..a73deb7537 100644 --- a/plugins/entity-feedback/package.json +++ b/plugins/entity-feedback/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback", - "version": "0.2.0-next.0", + "version": "0.2.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,11 +37,12 @@ "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "react-use": "^17.2.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -49,6 +50,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.1", diff --git a/plugins/entity-feedback/src/components/StarredRatingButtons/StarredRatingButtons.tsx b/plugins/entity-feedback/src/components/StarredRatingButtons/StarredRatingButtons.tsx index 51f7da1099..75ad21a658 100644 --- a/plugins/entity-feedback/src/components/StarredRatingButtons/StarredRatingButtons.tsx +++ b/plugins/entity-feedback/src/components/StarredRatingButtons/StarredRatingButtons.tsx @@ -134,7 +134,7 @@ export const StarredRatingButtons = (props: StarredRatingButtonsProps) => { return ( <> {Object.values(FeedbackRatings) - .filter(o => typeof o === 'number') + .filter((o): o is number => typeof o === 'number') .map(starRating => ( { + env.eventBroker.publish({ + topic: 'publish.example', + eventPayload: { message: 'Hello, World!' }, + metadata: {}, + }); +} +``` + +Here is an example of a plugin subscribing to a topic. + +```typescript jsx +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + env.eventBroker.subscribe([ + { + supportsEventTopics: ['publish.example'], + onEvent: async (params: EventParams) => { + env.logger.info(`receieved ${params.topic} event`); + }, + }, + ]); +} +``` + +### Implementing an `EventSubscriber` class + +More complex solutions might need the creation of a class that implements the `EventSubscriber` interface. e.g. + +```typescript jsx +import { EventSubscriber } from "./EventSubscriber"; + +class ExampleSubscriber implements EventSubscriber { + ... + + supportsEventTopics() { + return ['publish.example'] + } + + async onEvent(params: EventParams) { + env.logger.info(`receieved ${params.topic} event`) + } +} +``` + +### Events Backend + +The events backend plugin provides a router to handler http events and publish the http requests onto the event +broker. + +To configure it add a file [`packages/backend/src/plugins/events.ts`](../../packages/backend/src/plugins/events.ts) +to your Backstage project. Additionally, add the events plugin to your backend. @@ -38,54 +117,11 @@ Additionally, add the events plugin to your backend. // [...] + const eventsEnv = useHotMemoize(module, () => createEnv('events')); // [...] -+ apiRouter.use('/events', await events(eventsEnv, [])); ++ apiRouter.use('/events', await events(eventsEnv)); // [...] ``` -### With Event-based Entity Providers - -In case you use event-based `EntityProviders`, -you may need something like the following: - -```diff -// packages/backend/src/index.ts -- apiRouter.use('/events', await events(eventsEnv, [])); -+ apiRouter.use('/events', await events(eventsEnv, eventBasedEntityProviders)); -``` - -as well as a file -[`packages/backend/src/plugins/catalogEventBasedProviders.ts`](../../packages/backend/src/plugins/catalogEventBasedProviders.ts) -which contains event-based entity providers. - -In case you don't have this dependency added yet: - -```bash -# From your Backstage root directory -yarn add --cwd packages/backend @backstage/plugin-events-backend -``` - -```diff -// packages/backend/src/plugins/catalog.ts - import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; -+import { EntityProvider } from '@backstage/plugin-catalog-node'; - import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; - import { Router } from 'express'; - import { PluginEnvironment } from '../types'; - - export default async function createPlugin( - env: PluginEnvironment, -+ providers?: Array, - ): Promise { - const builder = await CatalogBuilder.create(env); - builder.addProcessor(new ScaffolderEntitiesProcessor()); -+ builder.addEntityProvider(providers ?? []); - const { processingEngine, router } = await builder.build(); - await processingEngine.start(); - return router; - } -``` - -## Configuration +#### Configuration In order to create HTTP endpoints to receive events for a certain topic, you need to add them at your configuration: @@ -115,6 +151,34 @@ in combination with suitable event subscribers. However, it is not limited to these use cases. +### Event-based Entity Providers + +You can implement the `EventSubscriber` interface on an `EntityProviders` to allow it to handle events from other plugins e.g. the event backend plugin +mentioned above. + +Assuming you have configured the `eventBroker` into the `PluginEnvironment` you can pass the broker to the entity provider for it to subscribe. + +```diff +// packages/backend/src/plugins/catalog.ts + import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; ++import { DemoEventBasedEntityProvider } from './DemoEventBasedEntityProvider'; + import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; + import { Router } from 'express'; + import { PluginEnvironment } from '../types'; + + export default async function createPlugin( + env: PluginEnvironment, + ): Promise { + const builder = await CatalogBuilder.create(env); + builder.addProcessor(new ScaffolderEntitiesProcessor()); ++ const demoProvider = new DemoEventBasedEntityProvider({ logger: env.logger, topics: ['example'], eventBroker: env.eventBroker }); ++ builder.addEntityProvider(demoProvider); + const { processingEngine, router } = await builder.build(); + await processingEngine.start(); + return router; + } +``` + ## Use Cases ### Custom Event Broker diff --git a/plugins/events-backend/api-report.md b/plugins/events-backend/api-report.md index 7d8ede1979..aeb6f9363d 100644 --- a/plugins/events-backend/api-report.md +++ b/plugins/events-backend/api-report.md @@ -5,12 +5,24 @@ ```ts import { Config } from '@backstage/config'; import { EventBroker } from '@backstage/plugin-events-node'; +import { EventParams } from '@backstage/plugin-events-node'; import { EventPublisher } from '@backstage/plugin-events-node'; import { EventSubscriber } from '@backstage/plugin-events-node'; import express from 'express'; import { HttpPostIngressOptions } from '@backstage/plugin-events-node'; import { Logger } from 'winston'; +// @public +export class DefaultEventBroker implements EventBroker { + constructor(logger: Logger); + // (undocumented) + publish(params: EventParams): Promise; + // (undocumented) + subscribe( + ...subscribers: Array> + ): void; +} + // @public export class EventsBackend { constructor(logger: Logger); diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 7fda105e15..2a32c7af52 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.5-next.0", + "version": "0.2.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/src/index.ts b/plugins/events-backend/src/index.ts index 4645e9a479..be173b677c 100644 --- a/plugins/events-backend/src/index.ts +++ b/plugins/events-backend/src/index.ts @@ -22,3 +22,4 @@ export { EventsBackend } from './service/EventsBackend'; export { HttpPostIngressEventPublisher } from './service/http'; +export { DefaultEventBroker } from './service/DefaultEventBroker'; diff --git a/plugins/events-backend/src/service/InMemoryEventBroker.test.ts b/plugins/events-backend/src/service/DefaultEventBroker.test.ts similarity index 94% rename from plugins/events-backend/src/service/InMemoryEventBroker.test.ts rename to plugins/events-backend/src/service/DefaultEventBroker.test.ts index 861cdda940..99e5f6f72d 100644 --- a/plugins/events-backend/src/service/InMemoryEventBroker.test.ts +++ b/plugins/events-backend/src/service/DefaultEventBroker.test.ts @@ -17,15 +17,15 @@ import { getVoidLogger } from '@backstage/backend-common'; import { TestEventSubscriber } from '@backstage/plugin-events-backend-test-utils'; import { EventParams, EventSubscriber } from '@backstage/plugin-events-node'; -import { InMemoryEventBroker } from './InMemoryEventBroker'; +import { DefaultEventBroker } from './DefaultEventBroker'; const logger = getVoidLogger(); -describe('InMemoryEventBroker', () => { +describe('DefaultEventBroker', () => { it('passes events to interested subscribers', () => { const subscriber1 = new TestEventSubscriber('test1', ['topicA', 'topicB']); const subscriber2 = new TestEventSubscriber('test2', ['topicB', 'topicC']); - const eventBroker = new InMemoryEventBroker(logger); + const eventBroker = new DefaultEventBroker(logger); eventBroker.subscribe(subscriber1); eventBroker.subscribe(subscriber2); @@ -86,7 +86,7 @@ describe('InMemoryEventBroker', () => { })(); const errorSpy = jest.spyOn(logger, 'error'); - const eventBroker = new InMemoryEventBroker(logger); + const eventBroker = new DefaultEventBroker(logger); eventBroker.subscribe(subscriber1); await eventBroker.publish({ topic, eventPayload: '1' }); diff --git a/plugins/events-backend/src/service/InMemoryEventBroker.ts b/plugins/events-backend/src/service/DefaultEventBroker.ts similarity index 92% rename from plugins/events-backend/src/service/InMemoryEventBroker.ts rename to plugins/events-backend/src/service/DefaultEventBroker.ts index 04be01f658..c3824b3e7d 100644 --- a/plugins/events-backend/src/service/InMemoryEventBroker.ts +++ b/plugins/events-backend/src/service/DefaultEventBroker.ts @@ -22,12 +22,14 @@ import { import { Logger } from 'winston'; /** - * In-memory event broker which will pass the event to all registered subscribers + * In process event broker which will pass the event to all registered subscribers * interested in it. * Events will not be persisted in any form. + * + * @public */ // TODO(pjungermann): add prom metrics? (see plugins/catalog-backend/src/util/metrics.ts, etc.) -export class InMemoryEventBroker implements EventBroker { +export class DefaultEventBroker implements EventBroker { constructor(private readonly logger: Logger) {} private readonly subscribers: { diff --git a/plugins/events-backend/src/service/EventsBackend.ts b/plugins/events-backend/src/service/EventsBackend.ts index 77b1b538f7..4415b8703a 100644 --- a/plugins/events-backend/src/service/EventsBackend.ts +++ b/plugins/events-backend/src/service/EventsBackend.ts @@ -20,7 +20,7 @@ import { EventSubscriber, } from '@backstage/plugin-events-node'; import { Logger } from 'winston'; -import { InMemoryEventBroker } from './InMemoryEventBroker'; +import { DefaultEventBroker } from './DefaultEventBroker'; /** * A builder that helps wire up all component parts of the event management. @@ -33,7 +33,7 @@ export class EventsBackend { private subscribers: EventSubscriber[] = []; constructor(logger: Logger) { - this.eventBroker = new InMemoryEventBroker(logger); + this.eventBroker = new DefaultEventBroker(logger); } setEventBroker(eventBroker: EventBroker): EventsBackend { diff --git a/plugins/events-backend/src/service/EventsPlugin.ts b/plugins/events-backend/src/service/EventsPlugin.ts index 1ae038a2ac..07f2b11731 100644 --- a/plugins/events-backend/src/service/EventsPlugin.ts +++ b/plugins/events-backend/src/service/EventsPlugin.ts @@ -29,7 +29,7 @@ import { EventSubscriber, HttpPostIngressOptions, } from '@backstage/plugin-events-node'; -import { InMemoryEventBroker } from './InMemoryEventBroker'; +import { DefaultEventBroker } from './DefaultEventBroker'; import Router from 'express-promise-router'; import { HttpPostIngressEventPublisher } from './http'; @@ -113,7 +113,7 @@ export const eventsPlugin = createBackendPlugin({ router.use(eventsRouter); const eventBroker = - extensionPoint.eventBroker ?? new InMemoryEventBroker(winstonLogger); + extensionPoint.eventBroker ?? new DefaultEventBroker(winstonLogger); eventBroker.subscribe(extensionPoint.subscribers); [extensionPoint.publishers, http] diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index 955ad8c4e0..10ecc60b56 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-events-node +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.2 + +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.1 + ## 0.2.5-next.0 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 930cd439e3..8cb4089ecc 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.5-next.0", + "version": "0.2.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index c0fd1fcb21..49db6f68dc 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @internal/plugin-todo-list-backend +## 1.0.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## 1.0.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + ## 1.0.12-next.0 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index d5a4a116e0..bd8c08ca9e 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.12-next.0", + "version": "1.0.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-common/CHANGELOG.md b/plugins/example-todo-list-common/CHANGELOG.md index 40909ff841..b85adb7de3 100644 --- a/plugins/example-todo-list-common/CHANGELOG.md +++ b/plugins/example-todo-list-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/plugin-todo-list-common +## 1.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + ## 1.0.9 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 7c48939e8b..f6d918ef8c 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-common", - "version": "1.0.9", + "version": "1.0.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 87fc367b86..3fbed55471 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,23 @@ # @internal/plugin-todo-list +## 1.0.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## 1.0.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + ## 1.0.12-next.0 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index 27e05d7144..c0ccb45f5a 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.12-next.0", + "version": "1.0.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,17 +32,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "msw": "^1.0.0" }, "files": [ diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index 950430d91f..da59730432 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-explore-backend +## 0.0.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 0.0.6-next.1 + +### Patch Changes + +- 01ae205352e: Collator factories instantiated in new backend system modules and now marked as deprecated. Will be continued to be exported publicly until the new backend system is fully rolled out. +- Updated dependencies + - @backstage/plugin-search-backend-module-explore@0.1.0-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 0.0.6-next.0 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index 30ab27bf07..9f28f024cd 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.0.6-next.0", + "version": "0.0.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-react/CHANGELOG.md b/plugins/explore-react/CHANGELOG.md index 954492e81e..8ffc709466 100644 --- a/plugins/explore-react/CHANGELOG.md +++ b/plugins/explore-react/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-explore-react +## 0.0.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/plugin-explore-common@0.0.1 + +## 0.0.28-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-explore-common@0.0.1 + ## 0.0.27 ### Patch Changes diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index fbbde21b0f..0808950a00 100644 --- a/plugins/explore-react/package.json +++ b/plugins/explore-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore-react", "description": "A frontend library for Backstage plugins that want to interact with the explore plugin", - "version": "0.0.27", + "version": "0.0.28-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,14 +35,21 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-explore-common": "workspace:^" }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index f5cbde7200..d58e16f49b 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-explore +## 0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.28-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## 0.4.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-explore-react@0.0.28-next.0 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 0.4.2-next.0 ### Patch Changes diff --git a/plugins/explore/README.md b/plugins/explore/README.md index 0bb7258ae6..a1cb273aab 100644 --- a/plugins/explore/README.md +++ b/plugins/explore/README.md @@ -2,7 +2,7 @@ Welcome to the explore plugin! -This plugin helps to visualize the domains and tools in your ecosystem. +This plugin helps to visualize the top level entities like domains, groups and tools in your ecosystem. ## Setup @@ -117,7 +117,10 @@ export const ExplorePage = () => { subtitle="Browse our ecosystem" > - + + + + diff --git a/plugins/explore/api-report.md b/plugins/explore/api-report.md index db89db6503..70ad479841 100644 --- a/plugins/explore/api-report.md +++ b/plugins/explore/api-report.md @@ -32,6 +32,12 @@ export const catalogEntityRouteRef: ExternalRouteRef< true >; +// @public (undocumented) +export const CatalogKindExploreContent: (props: { + title?: string; + kind: string; +}) => JSX.Element; + // @public (undocumented) export const DomainCard: (props: { entity: DomainEntity }) => JSX.Element; diff --git a/plugins/explore/package.json b/plugins/explore/package.json index eb5e1da5b3..8b1d978836 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore", "description": "A Backstage plugin for building an exploration page of your software ecosystem", - "version": "0.4.2-next.0", + "version": "0.4.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -45,12 +45,14 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "classnames": "^2.2.6", + "pluralize": "^8.0.0", "react-use": "^17.2.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -59,6 +61,7 @@ "@backstage/dev-utils": "workspace:^", "@backstage/plugin-catalog": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/explore/src/components/CatalogKindExploreContent/CatalogKindExploreContent.test.tsx b/plugins/explore/src/components/CatalogKindExploreContent/CatalogKindExploreContent.test.tsx new file mode 100644 index 0000000000..4f4f0f034c --- /dev/null +++ b/plugins/explore/src/components/CatalogKindExploreContent/CatalogKindExploreContent.test.tsx @@ -0,0 +1,136 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { DomainEntity } from '@backstage/catalog-model'; +import { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { waitFor } from '@testing-library/react'; +import React from 'react'; +import { CatalogKindExploreContent } from './CatalogKindExploreContent'; + +describe('', () => { + const catalogApi = { + addLocation: jest.fn(), + getEntities: jest.fn(), + getLocationByRef: jest.fn(), + getLocationById: jest.fn(), + removeLocationById: jest.fn(), + removeEntityByUid: jest.fn(), + getEntityByRef: jest.fn(), + refreshEntity: jest.fn(), + getEntityAncestors: jest.fn(), + getEntityFacets: jest.fn(), + validateEntity: jest.fn(), + }; + + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); + + const mountedRoutes = { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + }, + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('renders a grid of domains', async () => { + const entities: DomainEntity[] = [ + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Domain', + metadata: { + name: 'playback', + }, + spec: { + owner: 'guest', + }, + }, + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Domain', + metadata: { + name: 'artists', + }, + spec: { + owner: 'guest', + }, + }, + ]; + catalogApi.getEntities.mockResolvedValue({ items: entities }); + + const { getByText } = await renderInTestApp( + + + , + mountedRoutes, + ); + + await waitFor(() => { + expect(getByText('artists')).toBeInTheDocument(); + expect(getByText('playback')).toBeInTheDocument(); + }); + }); + + it('renders a custom title', async () => { + catalogApi.getEntities.mockResolvedValue({ items: [] }); + + const { getByText } = await renderInTestApp( + + + , + mountedRoutes, + ); + + await waitFor(() => expect(getByText('Our Areas')).toBeInTheDocument()); + }); + + it('renders empty state', async () => { + catalogApi.getEntities.mockResolvedValue({ items: [] }); + + const { getByText } = await renderInTestApp( + + + , + mountedRoutes, + ); + + await waitFor(() => + expect(getByText('No domains to display')).toBeInTheDocument(), + ); + }); + + it('renders a friendly error if it cannot collect domains', async () => { + const catalogError = new Error('Network timeout'); + catalogApi.getEntities.mockRejectedValueOnce(catalogError); + + const { getByText } = await renderInTestApp( + + + , + mountedRoutes, + ); + + await waitFor(() => + expect(getByText(/Could not load domains/)).toBeInTheDocument(), + ); + }); +}); diff --git a/plugins/explore/src/components/CatalogKindExploreContent/CatalogKindExploreContent.tsx b/plugins/explore/src/components/CatalogKindExploreContent/CatalogKindExploreContent.tsx new file mode 100644 index 0000000000..f6f76ce1e0 --- /dev/null +++ b/plugins/explore/src/components/CatalogKindExploreContent/CatalogKindExploreContent.tsx @@ -0,0 +1,108 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Entity } from '@backstage/catalog-model'; +import { catalogApiRef } from '@backstage/plugin-catalog-react'; +import { Button } from '@material-ui/core'; +import React from 'react'; +import useAsync from 'react-use/lib/useAsync'; +import { EntityCard } from '../EntityCard'; +import { + Content, + ContentHeader, + EmptyState, + ItemCardGrid, + Progress, + SupportButton, + WarningPanel, +} from '@backstage/core-components'; +import { useApi } from '@backstage/core-plugin-api'; +import pluralize from 'pluralize'; + +const Body = (props: { kind: string }) => { + const { kind } = props; + const kindPlural = pluralize(kind); + const catalogApi = useApi(catalogApiRef); + const { + value: entities, + loading, + error, + } = useAsync(async () => { + const response = await catalogApi.getEntities({ + filter: { kind }, + }); + return response.items as Entity[]; + }, [kind]); + + if (loading) { + return ; + } + + if (error) { + return ( + + {error.message} + + ); + } + + if (!entities?.length) { + return ( + + Read more + + } + /> + ); + } + + return ( + + {entities.map((entity, index) => ( + + ))} + + ); +}; + +/** @public */ +export const CatalogKindExploreContent = (props: { + title?: string; + kind: string; +}) => { + const { kind, title } = props; + const kindLowercase = kind.toLocaleLowerCase(); + const kindCapitalized = `${kind[0].toLocaleUpperCase()}${kind.substring(1)}`; + return ( + + + + Discover the {pluralize(kindLowercase)} in your ecosystem. + + + + + ); +}; diff --git a/plugins/explore/src/components/CatalogKindExploreContent/index.ts b/plugins/explore/src/components/CatalogKindExploreContent/index.ts new file mode 100644 index 0000000000..af4cafae62 --- /dev/null +++ b/plugins/explore/src/components/CatalogKindExploreContent/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { CatalogKindExploreContent } from './CatalogKindExploreContent'; diff --git a/plugins/explore/src/components/DefaultExplorePage/DefaultExplorePage.tsx b/plugins/explore/src/components/DefaultExplorePage/DefaultExplorePage.tsx index 54beb59619..098f73be2e 100644 --- a/plugins/explore/src/components/DefaultExplorePage/DefaultExplorePage.tsx +++ b/plugins/explore/src/components/DefaultExplorePage/DefaultExplorePage.tsx @@ -15,11 +15,11 @@ */ import React from 'react'; -import { DomainExplorerContent } from '../DomainExplorerContent'; import { ExploreLayout } from '../ExploreLayout'; import { GroupsExplorerContent } from '../GroupsExplorerContent'; import { ToolExplorerContent } from '../ToolExplorerContent'; import { configApiRef, useApi } from '@backstage/core-plugin-api'; +import { CatalogKindExploreContent } from '../CatalogKindExploreContent'; export const DefaultExplorePage = () => { const configApi = useApi(configApiRef); @@ -32,7 +32,7 @@ export const DefaultExplorePage = () => { subtitle="Discover solutions available in your ecosystem" > - + diff --git a/plugins/explore/src/components/DomainExplorerContent/DomainExplorerContent.tsx b/plugins/explore/src/components/DomainExplorerContent/DomainExplorerContent.tsx index 3cfed5b12b..15c0d650cc 100644 --- a/plugins/explore/src/components/DomainExplorerContent/DomainExplorerContent.tsx +++ b/plugins/explore/src/components/DomainExplorerContent/DomainExplorerContent.tsx @@ -19,7 +19,6 @@ import { catalogApiRef } from '@backstage/plugin-catalog-react'; import { Button } from '@material-ui/core'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; -import { DomainCard } from '../DomainCard'; import { Content, ContentHeader, @@ -30,6 +29,7 @@ import { WarningPanel, } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; +import { EntityCard } from '../EntityCard'; const Body = () => { const catalogApi = useApi(catalogApiRef); @@ -78,7 +78,7 @@ const Body = () => { return ( {entities.map((entity, index) => ( - + ))} ); diff --git a/plugins/explore/src/components/EntityCard/EntityCard.test.tsx b/plugins/explore/src/components/EntityCard/EntityCard.test.tsx new file mode 100644 index 0000000000..4b006e347f --- /dev/null +++ b/plugins/explore/src/components/EntityCard/EntityCard.test.tsx @@ -0,0 +1,54 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Entity } from '@backstage/catalog-model'; +import { entityRouteRef } from '@backstage/plugin-catalog-react'; +import { renderInTestApp } from '@backstage/test-utils'; +import React from 'react'; +import { EntityCard } from './EntityCard'; + +describe('', () => { + it('renders an entity card', async () => { + const entity: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Domain', + metadata: { + name: 'artists', + description: 'Everything about artists', + tags: ['a-tag'], + }, + spec: { + owner: 'guest', + }, + }; + const { getByText } = await renderInTestApp( + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + }, + }, + ); + + expect(getByText('artists')).toBeInTheDocument(); + expect(getByText('Everything about artists')).toBeInTheDocument(); + expect(getByText('a-tag')).toBeInTheDocument(); + expect(getByText('Explore').parentElement).toHaveAttribute( + 'href', + '/catalog/default/domain/artists', + ); + }); +}); diff --git a/plugins/explore/src/components/EntityCard/EntityCard.tsx b/plugins/explore/src/components/EntityCard/EntityCard.tsx new file mode 100644 index 0000000000..0a5908df38 --- /dev/null +++ b/plugins/explore/src/components/EntityCard/EntityCard.tsx @@ -0,0 +1,75 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model'; +import { + EntityRefLinks, + entityRouteParams, + getEntityRelations, + entityRouteRef, +} from '@backstage/plugin-catalog-react'; +import { + Box, + Card, + CardActions, + CardContent, + CardMedia, + Chip, +} from '@material-ui/core'; +import React from 'react'; + +import { LinkButton, ItemCardHeader } from '@backstage/core-components'; +import { useRouteRef } from '@backstage/core-plugin-api'; + +/** @public */ +export const EntityCard = (props: { entity: Entity }) => { + const { entity } = props; + + const catalogEntityRoute = useRouteRef(entityRouteRef); + const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY); + const url = catalogEntityRoute(entityRouteParams(entity)); + + const owner = ( + + ); + + return ( + + + + + + {entity.metadata.tags?.length ? ( + + {entity.metadata.tags.map(tag => ( + + ))} + + ) : null} + {entity.metadata.description} + + + + Explore + + + + ); +}; diff --git a/plugins/explore/src/components/EntityCard/index.ts b/plugins/explore/src/components/EntityCard/index.ts new file mode 100644 index 0000000000..be80fb3f8f --- /dev/null +++ b/plugins/explore/src/components/EntityCard/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { EntityCard } from './EntityCard'; diff --git a/plugins/explore/src/components/index.ts b/plugins/explore/src/components/index.ts index f8fba16910..b3aa82bc79 100644 --- a/plugins/explore/src/components/index.ts +++ b/plugins/explore/src/components/index.ts @@ -14,5 +14,6 @@ * limitations under the License. */ -export * from './DomainCard'; +export * from './CatalogKindExploreContent'; export * from './ExploreLayout'; +export * from './DomainCard'; diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index 50440aba5d..1722a03fd1 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-firehydrant +## 0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.2.1-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 2268ca77a1..6974111940 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-firehydrant", "description": "A Backstage plugin that integrates towards FireHydrant", - "version": "0.2.1-next.0", + "version": "0.2.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,17 +35,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index 3cb8c21d6c..36fad5fbc4 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-fossa +## 0.2.49-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.2.49-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.2.49-next.0 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index f7d14a79aa..3219c4529f 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-fossa", "description": "A Backstage plugin that integrates towards FOSSA", - "version": "0.2.49-next.0", + "version": "0.2.49-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -48,17 +48,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "msw": "^1.0.0" }, "files": [ diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index e13f9f04eb..d485153d78 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-gcalendar +## 0.3.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.3.13-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/errors@1.1.5 + ## 0.3.13-next.0 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index 5a0508b41c..e8b4d88d98 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.13-next.0", + "version": "0.3.13-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,18 +40,22 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/dompurify": "^2.3.3", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "@types/sanitize-html": "^2.6.2", "cross-fetch": "^3.1.5", "msw": "^1.0.0" diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md index b952be109f..1b5f508807 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-gcp-projects +## 0.3.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## 0.3.36-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + ## 0.3.36-next.0 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index 516a72cbfa..e280507184 100644 --- a/plugins/gcp-projects/package.json +++ b/plugins/gcp-projects/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gcp-projects", "description": "A Backstage plugin that helps you manage projects in GCP", - "version": "0.3.36-next.0", + "version": "0.3.36-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,6 +43,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -50,10 +51,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index 34e2e430ae..92f33e1d01 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-git-release-manager +## 0.3.30-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## 0.3.30-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + ## 0.3.30-next.0 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index b43ee73925..ea49ff9d3d 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-git-release-manager", "description": "A Backstage plugin that helps you manage releases in git", - "version": "0.3.30-next.0", + "version": "0.3.30-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,14 +31,15 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", + "@types/react": "^16.13.1 || ^17.0.0", "luxon": "^3.0.0", "qs": "^6.10.1", "react-use": "^17.2.4", - "recharts": "^2.0.0" + "recharts": "^2.5.0" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -46,6 +47,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index df186ba39d..d689403ea7 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-github-actions +## 0.5.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## 0.5.17-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.5.17-next.0 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index 78c0f5096a..9d7f52e44f 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.5.17-next.0", + "version": "0.5.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -49,6 +49,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -56,10 +57,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index 47f7e4d86b..3563977d19 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-github-deployments +## 0.1.48-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + +## 0.1.48-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.1.48-next.0 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index e60e3da91a..5fb7e85db8 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-deployments", "description": "A Backstage plugin that integrates towards GitHub Deployments", - "version": "0.1.48-next.0", + "version": "0.1.48-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -39,17 +39,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index affbf603a6..76f6e33fc9 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-github-issues +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## 0.2.6-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.2.6-next.0 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index cac335d9e3..f3a7eb3306 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-github-issues", - "version": "0.2.6-next.0", + "version": "0.2.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,14 +37,16 @@ "react-use": "^17.4.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", - "@spotify/prettier-config": "^14.0.0", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/github-issues/src/components/GithubIssues/IssuesList/IssuesList.tsx b/plugins/github-issues/src/components/GithubIssues/IssuesList/IssuesList.tsx index 27f6375308..0d14e8a7c4 100644 --- a/plugins/github-issues/src/components/GithubIssues/IssuesList/IssuesList.tsx +++ b/plugins/github-issues/src/components/GithubIssues/IssuesList/IssuesList.tsx @@ -73,7 +73,7 @@ export const IssuesList = ({ const filteredRepos = React.useMemo( () => issuesByRepository && activeFilter.length - ? activeFilter.reduce( + ? activeFilter.reduce( (acc, val) => ({ [val]: issuesByRepository[val], ...acc, diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md index 681552a571..c79991926d 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + +## 0.1.11-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.11-next.0 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index 1792a6e98c..3dbf7c60fb 100644 --- a/plugins/github-pull-requests-board/package.json +++ b/plugins/github-pull-requests-board/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-pull-requests-board", "description": "A Backstage plugin that allows you to see all open Pull Requests for all the repositories owned by your team", - "version": "0.1.11-next.0", + "version": "0.1.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -48,10 +48,16 @@ "p-limit": "^4.0.0", "react-use": "^17.2.4" }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", @@ -60,10 +66,6 @@ "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0", - "react-dom": "^16.13.1 || ^17.0.0" - }, "files": [ "dist" ] diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md index 6201080830..1efec0e36d 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-gitops-profiles +## 0.3.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + +## 0.3.35-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/config@1.0.7 + ## 0.3.35-next.0 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index 2208c6d011..749f963215 100644 --- a/plugins/gitops-profiles/package.json +++ b/plugins/gitops-profiles/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gitops-profiles", "description": "A Backstage plugin that helps you manage GitOps profiles", - "version": "0.3.35-next.0", + "version": "0.3.35-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,6 +44,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -51,10 +52,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index 06ca6ecca7..87559fc8b4 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-gocd +## 0.1.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.1.23-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.1.23-next.0 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index a8e2599f3b..b543111f2c 100644 --- a/plugins/gocd/package.json +++ b/plugins/gocd/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gocd", "description": "A Backstage plugin that integrates towards GoCD", - "version": "0.1.23-next.0", + "version": "0.1.23-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,19 +44,23 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/lodash": "^4.14.173", "@types/luxon": "^3.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index 816962b034..2edf5d59b2 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-graphiql +## 0.2.49-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## 0.2.49-next.1 + +### Patch Changes + +- 8b9e8ece403: Allow to pass lazy GraphQL endpoint URL +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + ## 0.2.49-next.0 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index fcdf347ba1..b0c010ff9e 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphiql", "description": "Backstage plugin for browsing GraphQL APIs", - "version": "0.2.49-next.0", + "version": "0.2.49-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -45,6 +45,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -52,11 +53,13 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/codemirror": "^5.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index 1e2f5059eb..8d54ca767e 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-graphql-backend +## 0.1.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-graphql@0.3.20-next.1 + +## 0.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-graphql@0.3.20-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + ## 0.1.34-next.0 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index 736c057a5b..e9a2d2458f 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-backend", "description": "An experimental Backstage backend plugin for GraphQL", - "version": "0.1.34-next.0", + "version": "0.1.34-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphql-voyager/CHANGELOG.md b/plugins/graphql-voyager/CHANGELOG.md index 480e859caa..168bc00df2 100644 --- a/plugins/graphql-voyager/CHANGELOG.md +++ b/plugins/graphql-voyager/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-graphql-voyager +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## 0.1.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index deba02b6a4..a8843d3b99 100644 --- a/plugins/graphql-voyager/package.json +++ b/plugins/graphql-voyager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-voyager", "description": "Backstage plugin for GraphQL Voyager", - "version": "0.1.2-next.0", + "version": "0.1.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,17 +33,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "*", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 0c1e662fef..04f5f1a0b8 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-home +## 0.4.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + +## 0.4.33-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + ## 0.4.33-next.0 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 767ed33557..4610df4d40 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home", "description": "A Backstage plugin that helps you build a home page", - "version": "0.4.33-next.0", + "version": "0.4.33-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,12 +42,13 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "lodash": "^4.17.21", "react-use": "^17.2.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -55,6 +56,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index ae6e292c85..02f77b394a 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-ilert +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.2.6-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.2.6-next.0 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index 67573d1e3a..4e413d6c82 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.6-next.0", + "version": "0.2.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,20 +36,25 @@ "@material-ui/pickers": "^3.3.10", "humanize-duration": "^3.26.0", "luxon": "^3.0.0", + "prop-types": "^15.7.2", "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index 0655d6c189..210bf9c6a1 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-jenkins-backend +## 0.1.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-jenkins-common@0.1.15-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## 0.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-jenkins-common@0.1.15-next.0 + ## 0.1.34-next.0 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 54375b6f30..f92ef37f66 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.1.34-next.0", + "version": "0.1.34-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-common/CHANGELOG.md b/plugins/jenkins-common/CHANGELOG.md index 73be4b306c..c8703352b8 100644 --- a/plugins/jenkins-common/CHANGELOG.md +++ b/plugins/jenkins-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-jenkins-common +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + ## 0.1.14 ### Patch Changes diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index 04cc34b48d..07e1f1958d 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-jenkins-common", - "version": "0.1.14", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index 97bfce2e07..9f135f0ce5 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-jenkins +## 0.7.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-jenkins-common@0.1.15-next.0 + +## 0.7.16-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-jenkins-common@0.1.15-next.0 + ## 0.7.16-next.0 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 23bbcfedcd..1452a1067e 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.7.16-next.0", + "version": "0.7.16-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -48,6 +48,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -55,10 +56,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "@types/testing-library__jest-dom": "^5.9.1", "cross-fetch": "^3.1.5", "msw": "^1.0.0" diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index d844d8339b..e23db68e83 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-kafka-backend +## 0.2.37-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.2.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.2.37-next.0 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index d29ce0fb82..b54bf490f8 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.2.37-next.0", + "version": "0.2.37-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index 324b9ae111..3bbd50a54e 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-kafka +## 0.3.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + +## 0.3.17-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + ## 0.3.17-next.0 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index a39b72c5b9..c117f488d4 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka", "description": "A Backstage plugin that integrates towards Kafka", - "version": "0.3.17-next.0", + "version": "0.3.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,6 +37,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -44,11 +45,13 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "jest-when": "^3.1.0", "msw": "^1.0.0" diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 75a4567b98..a5dc29a247 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-kubernetes-backend +## 0.10.0-next.2 + +### Minor Changes + +- e6c7c850129: Plugins that instantiate the `KubernetesProxy` must now provide a parameter of the type `KubernetesProxyOptions` which includes providing a `KubernetesAuthTranslator`. The `KubernetesBuilder` now builds its own `KubernetesAuthTranslatorMap` that it provides to the `KubernetesProxy`. The `DispatchingKubernetesAuthTranslator` expects a `KubernetesTranslatorMap` to be provided as a parameter. The `KubernetesBuilder` now has a method called `setAuthTranslatorMap` which allows integrators to bring their own `KubernetesAuthTranslator's` to the `KubernetesPlugin`. + +### Patch Changes + +- 76e8f08fa24: fix localKubectlProxy auth provider fetching +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## 0.10.0-next.1 + +### Minor Changes + +- 88fbb3d075a: Add support for the new plugin system to the Kubernetes plugin + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + ## 0.10.0-next.0 ### Minor Changes diff --git a/plugins/kubernetes-backend/alpha-api-report.md b/plugins/kubernetes-backend/alpha-api-report.md new file mode 100644 index 0000000000..f95c1414f3 --- /dev/null +++ b/plugins/kubernetes-backend/alpha-api-report.md @@ -0,0 +1,12 @@ +## API Report File for "@backstage/plugin-kubernetes-backend" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; + +// @alpha +export const kubernetesPlugin: () => BackendFeature; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/kubernetes-backend/api-report.md b/plugins/kubernetes-backend/api-report.md index 0eac98f0a5..7dfb0635bd 100644 --- a/plugins/kubernetes-backend/api-report.md +++ b/plugins/kubernetes-backend/api-report.md @@ -95,6 +95,25 @@ export interface CustomResourcesByEntity extends KubernetesObjectsByEntity { // @public (undocumented) export const DEFAULT_OBJECTS: ObjectToFetch[]; +// @public +export class DispatchingKubernetesAuthTranslator + implements KubernetesAuthTranslator +{ + constructor(options: DispatchingKubernetesAuthTranslatorOptions); + // (undocumented) + decorateClusterDetailsWithAuth( + clusterDetails: ClusterDetails, + auth: KubernetesRequestAuth, + ): Promise; +} + +// @public (undocumented) +export type DispatchingKubernetesAuthTranslatorOptions = { + authTranslatorMap: { + [key: string]: KubernetesAuthTranslator; + }; +}; + // @public (undocumented) export interface FetchResponseWrapper { // (undocumented) @@ -142,24 +161,16 @@ export interface KubernetesAuthTranslator { ): Promise; } -// @public (undocumented) -export class KubernetesAuthTranslatorGenerator { - // (undocumented) - static getKubernetesAuthTranslatorInstance( - authProvider: string, - options: { - logger: Logger; - config: Config; - }, - ): KubernetesAuthTranslator; -} - // @public (undocumented) export class KubernetesBuilder { constructor(env: KubernetesEnvironment); // (undocumented) build(): KubernetesBuilderReturn; // (undocumented) + protected buildAuthTranslatorMap(): { + [key: string]: KubernetesAuthTranslator; + }; + // (undocumented) protected buildClusterSupplier( refreshInterval: Duration, ): KubernetesClustersSupplier; @@ -206,6 +217,10 @@ export class KubernetesBuilder { clusterSupplier: KubernetesClustersSupplier, ): Promise; // (undocumented) + protected getAuthTranslatorMap(): { + [key: string]: KubernetesAuthTranslator; + }; + // (undocumented) protected getClusterSupplier(): KubernetesClustersSupplier; // (undocumented) protected getFetcher(): KubernetesFetcher; @@ -225,6 +240,10 @@ export class KubernetesBuilder { // (undocumented) protected getServiceLocatorMethod(): ServiceLocatorMethod; // (undocumented) + setAuthTranslatorMap(authTranslatorMap: { + [key: string]: KubernetesAuthTranslator; + }): void; + // (undocumented) setClusterSupplier(clusterSupplier?: KubernetesClustersSupplier): this; // (undocumented) setDefaultClusterRefreshInterval(refreshInterval: Duration): this; @@ -247,6 +266,9 @@ export type KubernetesBuilderReturn = Promise<{ proxy: KubernetesProxy; objectsProvider: KubernetesObjectsProvider; serviceLocator: KubernetesServiceLocator; + authTranslatorMap: { + [key: string]: KubernetesAuthTranslator; + }; }>; // @public @@ -333,7 +355,7 @@ export type KubernetesObjectTypes = // @public export class KubernetesProxy { - constructor(logger: Logger, clusterSupplier: KubernetesClustersSupplier); + constructor(options: KubernetesProxyOptions); // (undocumented) createRequestHandler( options: KubernetesProxyCreateRequestHandlerOptions, @@ -345,6 +367,13 @@ export type KubernetesProxyCreateRequestHandlerOptions = { permissionApi: PermissionEvaluator; }; +// @public +export type KubernetesProxyOptions = { + logger: Logger; + clusterSupplier: KubernetesClustersSupplier; + authTranslator: KubernetesAuthTranslator; +}; + // @public export interface KubernetesServiceLocator { // (undocumented) diff --git a/plugins/kubernetes-backend/config.d.ts b/plugins/kubernetes-backend/config.d.ts index d3f197c21e..e9b5878920 100644 --- a/plugins/kubernetes-backend/config.d.ts +++ b/plugins/kubernetes-backend/config.d.ts @@ -21,11 +21,15 @@ export interface Config { | 'services' | 'configmaps' | 'deployments' + | 'limitranges' | 'replicasets' | 'horizontalpodautoscalers' | 'jobs' | 'cronjobs' | 'ingresses' + | 'customresources' + | 'statefulsets' + | 'daemonsets' >; serviceLocatorMethod: { type: 'multiTenant'; @@ -99,11 +103,15 @@ export interface Config { services?: string; configmaps?: string; deployments?: string; + limitranges?: string; replicasets?: string; horizontalpodautoscalers?: string; - cronjobs?: string; jobs?: string; + cronjobs?: string; ingresses?: string; + customresources?: string; + statefulsets?: string; + daemonsets?: string; } & { [pluralKind: string]: string }; }; } diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 796bf9fdeb..3e981f5255 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.10.0-next.0", + "version": "0.10.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,6 +10,21 @@ "main": "dist/index.cjs.js", "types": "dist/index.d.ts" }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, "backstage": { "role": "backend-plugin" }, @@ -39,12 +54,14 @@ "@aws-sdk/signature-v4": "^3.299.0", "@azure/identity": "^2.0.4", "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration-aws-node": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", diff --git a/plugins/kubernetes-backend/src/alpha.ts b/plugins/kubernetes-backend/src/alpha.ts new file mode 100644 index 0000000000..3041a5682c --- /dev/null +++ b/plugins/kubernetes-backend/src/alpha.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { kubernetesPlugin } from './plugin'; diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/DispatchingKubernetesAuthTranslator.test.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/DispatchingKubernetesAuthTranslator.test.ts new file mode 100644 index 0000000000..3132bdef76 --- /dev/null +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/DispatchingKubernetesAuthTranslator.test.ts @@ -0,0 +1,72 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { DispatchingKubernetesAuthTranslator } from './DispatchingKubernetesAuthTranslator'; +import { ClusterDetails } from '../types'; +import { KubernetesRequestAuth } from '@backstage/plugin-kubernetes-common'; +import { KubernetesAuthTranslator } from './types'; + +describe('decorateClusterDetailsWithAuth', () => { + let authTranslator: DispatchingKubernetesAuthTranslator; + let mockTranslator: jest.Mocked; + const authObject: KubernetesRequestAuth = {}; + + beforeEach(() => { + mockTranslator = { decorateClusterDetailsWithAuth: jest.fn() }; + authTranslator = new DispatchingKubernetesAuthTranslator({ + authTranslatorMap: { google: mockTranslator }, + }); + }); + + it('can decorate cluster details if the auth provider is in the translator map', async () => { + const expectedClusterDetails: ClusterDetails = { + url: 'notanything.com', + name: 'randomName', + authProvider: 'google', + serviceAccountToken: 'added by mock translator', + }; + + mockTranslator.decorateClusterDetailsWithAuth.mockResolvedValue( + expectedClusterDetails, + ); + + const returnedValue = await authTranslator.decorateClusterDetailsWithAuth( + { name: 'googleCluster', url: 'anything.com', authProvider: 'google' }, + authObject, + ); + + expect(mockTranslator.decorateClusterDetailsWithAuth).toHaveBeenCalledWith( + { name: 'googleCluster', url: 'anything.com', authProvider: 'google' }, + authObject, + ); + expect(returnedValue).toBe(expectedClusterDetails); + }); + + it('throws an error when asked for an auth translator for an unsupported auth type', () => { + expect(() => + authTranslator.decorateClusterDetailsWithAuth( + { + name: 'test-cluster', + url: 'anything.com', + authProvider: 'linode', + }, + authObject, + ), + ).toThrow( + 'authProvider "linode" has no KubernetesAuthTranslator associated with it', + ); + }); +}); diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/DispatchingKubernetesAuthTranslator.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/DispatchingKubernetesAuthTranslator.ts new file mode 100644 index 0000000000..82d9538cac --- /dev/null +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/DispatchingKubernetesAuthTranslator.ts @@ -0,0 +1,56 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { KubernetesAuthTranslator } from './types'; +import { ClusterDetails } from '../types'; +import { KubernetesRequestAuth } from '@backstage/plugin-kubernetes-common'; + +/** + * + * @public + */ +export type DispatchingKubernetesAuthTranslatorOptions = { + authTranslatorMap: { + [key: string]: KubernetesAuthTranslator; + }; +}; +/** + * used to direct a KubernetesAuthProvider to its corresponding KubernetesAuthTranslator + * @public + */ +export class DispatchingKubernetesAuthTranslator + implements KubernetesAuthTranslator +{ + private readonly translatorMap: { [key: string]: KubernetesAuthTranslator }; + + constructor(options: DispatchingKubernetesAuthTranslatorOptions) { + this.translatorMap = options.authTranslatorMap; + } + + public decorateClusterDetailsWithAuth( + clusterDetails: ClusterDetails, + auth: KubernetesRequestAuth, + ) { + if (this.translatorMap[clusterDetails.authProvider]) { + return this.translatorMap[ + clusterDetails.authProvider + ].decorateClusterDetailsWithAuth(clusterDetails, auth); + } + throw new Error( + `authProvider "${clusterDetails.authProvider}" has no KubernetesAuthTranslator associated with it`, + ); + } +} diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.test.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.test.ts deleted file mode 100644 index a7e317e4d8..0000000000 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { KubernetesAuthTranslator } from './types'; -import { GoogleKubernetesAuthTranslator } from './GoogleKubernetesAuthTranslator'; -import { KubernetesAuthTranslatorGenerator } from './KubernetesAuthTranslatorGenerator'; -import { NoopKubernetesAuthTranslator } from './NoopKubernetesAuthTranslator'; -import { AwsIamKubernetesAuthTranslator } from './AwsIamKubernetesAuthTranslator'; -import { OidcKubernetesAuthTranslator } from './OidcKubernetesAuthTranslator'; -import { getVoidLogger } from '@backstage/backend-common'; -import { ConfigReader } from '@backstage/config'; - -const logger = getVoidLogger(); -const config = new ConfigReader({}); - -describe('getKubernetesAuthTranslatorInstance', () => { - const sut = KubernetesAuthTranslatorGenerator; - - it('can return an auth translator for google auth', () => { - const authTranslator: KubernetesAuthTranslator = - sut.getKubernetesAuthTranslatorInstance('google', { logger, config }); - expect(authTranslator instanceof GoogleKubernetesAuthTranslator).toBe(true); - }); - - it('can return an auth translator for aws auth', () => { - const authTranslator: KubernetesAuthTranslator = - sut.getKubernetesAuthTranslatorInstance('aws', { logger, config }); - expect(authTranslator instanceof AwsIamKubernetesAuthTranslator).toBe(true); - }); - - it('can return an auth translator for serviceAccount auth', () => { - const authTranslator: KubernetesAuthTranslator = - sut.getKubernetesAuthTranslatorInstance('serviceAccount', { - logger, - config, - }); - expect(authTranslator instanceof NoopKubernetesAuthTranslator).toBe(true); - }); - - it('can return an auth translator for oidc auth', () => { - const authTranslator: KubernetesAuthTranslator = - sut.getKubernetesAuthTranslatorInstance('oidc', { logger, config }); - expect(authTranslator instanceof OidcKubernetesAuthTranslator).toBe(true); - }); - - it('throws an error when asked for an auth translator for an unsupported auth type', () => { - expect(() => - sut.getKubernetesAuthTranslatorInstance('linode', { logger, config }), - ).toThrow( - 'authProvider "linode" has no KubernetesAuthTranslator associated with it', - ); - }); -}); diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.ts deleted file mode 100644 index 834de28c84..0000000000 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Logger } from 'winston'; -import { KubernetesAuthTranslator } from './types'; -import { GoogleKubernetesAuthTranslator } from './GoogleKubernetesAuthTranslator'; -import { NoopKubernetesAuthTranslator } from './NoopKubernetesAuthTranslator'; -import { AwsIamKubernetesAuthTranslator } from './AwsIamKubernetesAuthTranslator'; -import { GoogleServiceAccountAuthTranslator } from './GoogleServiceAccountAuthProvider'; -import { AzureIdentityKubernetesAuthTranslator } from './AzureIdentityKubernetesAuthTranslator'; -import { OidcKubernetesAuthTranslator } from './OidcKubernetesAuthTranslator'; -import { Config } from '@backstage/config'; - -/** - * - * @public - */ -export class KubernetesAuthTranslatorGenerator { - static getKubernetesAuthTranslatorInstance( - authProvider: string, - options: { - logger: Logger; - config: Config; - }, - ): KubernetesAuthTranslator { - switch (authProvider) { - case 'google': { - return new GoogleKubernetesAuthTranslator(); - } - case 'aws': { - return new AwsIamKubernetesAuthTranslator(options); - } - case 'azure': { - return new AzureIdentityKubernetesAuthTranslator(options.logger); - } - case 'serviceAccount': { - return new NoopKubernetesAuthTranslator(); - } - case 'googleServiceAccount': { - return new GoogleServiceAccountAuthTranslator(); - } - case 'oidc': { - return new OidcKubernetesAuthTranslator(); - } - case 'localKubectlProxy': { - return new NoopKubernetesAuthTranslator(); - } - default: { - throw new Error( - `authProvider "${authProvider}" has no KubernetesAuthTranslator associated with it`, - ); - } - } - } -} diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/index.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/index.ts index 19f6dd80eb..4ee83b0da0 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/index.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/index.ts @@ -18,7 +18,7 @@ export * from './AwsIamKubernetesAuthTranslator'; export * from './AzureIdentityKubernetesAuthTranslator'; export * from './GoogleKubernetesAuthTranslator'; export * from './GoogleServiceAccountAuthProvider'; -export * from './KubernetesAuthTranslatorGenerator'; +export * from './DispatchingKubernetesAuthTranslator'; export * from './NoopKubernetesAuthTranslator'; export * from './OidcKubernetesAuthTranslator'; export * from './types'; diff --git a/plugins/kubernetes-backend/src/plugin.ts b/plugins/kubernetes-backend/src/plugin.ts new file mode 100644 index 0000000000..a62d852937 --- /dev/null +++ b/plugins/kubernetes-backend/src/plugin.ts @@ -0,0 +1,54 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { + createBackendPlugin, + coreServices, +} from '@backstage/backend-plugin-api'; +import { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha'; + +import { KubernetesBuilder } from '@backstage/plugin-kubernetes-backend'; + +/** + * This is the backend plugin that provides the Kubernetes integration. + * @alpha + */ +export const kubernetesPlugin = createBackendPlugin({ + pluginId: 'kubernetes-backend', + register(env) { + env.registerInit({ + deps: { + http: coreServices.httpRouter, + logger: coreServices.logger, + config: coreServices.config, + catalogApi: catalogServiceRef, + permissions: coreServices.permissions, + }, + async init({ http, logger, config, catalogApi, permissions }) { + const winstonLogger = loggerToWinstonLogger(logger); + // TODO: expose all of the customization & extension points of the builder here + const { router } = await KubernetesBuilder.createBuilder({ + logger: winstonLogger, + config, + catalogApi, + permissions, + }).build(); + http.use(router); + }, + }); + }, +}); diff --git a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts index f1d9f0bae1..75b619b412 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts @@ -24,6 +24,17 @@ import { Duration } from 'luxon'; import { Logger } from 'winston'; import { getCombinedClusterSupplier } from '../cluster-locator'; +import { + KubernetesAuthTranslator, + DispatchingKubernetesAuthTranslator, + GoogleKubernetesAuthTranslator, + NoopKubernetesAuthTranslator, + AwsIamKubernetesAuthTranslator, + GoogleServiceAccountAuthTranslator, + AzureIdentityKubernetesAuthTranslator, + OidcKubernetesAuthTranslator, +} from '../kubernetes-auth-translator'; + import { addResourceRoutesToRouter } from '../routes/resourcesRoutes'; import { MultiTenantServiceLocator } from '../service-locator/MultiTenantServiceLocator'; import { @@ -68,6 +79,7 @@ export type KubernetesBuilderReturn = Promise<{ proxy: KubernetesProxy; objectsProvider: KubernetesObjectsProvider; serviceLocator: KubernetesServiceLocator; + authTranslatorMap: { [key: string]: KubernetesAuthTranslator }; }>; /** @@ -83,6 +95,7 @@ export class KubernetesBuilder { private fetcher?: KubernetesFetcher; private serviceLocator?: KubernetesServiceLocator; private proxy?: KubernetesProxy; + private authTranslatorMap?: { [key: string]: KubernetesAuthTranslator }; static createBuilder(env: KubernetesEnvironment) { return new KubernetesBuilder(env); @@ -114,6 +127,8 @@ export class KubernetesBuilder { const clusterSupplier = this.getClusterSupplier(); + const authTranslatorMap = this.getAuthTranslatorMap(); + const proxy = this.getProxy(logger, clusterSupplier); const serviceLocator = this.getServiceLocator(); @@ -143,6 +158,7 @@ export class KubernetesBuilder { objectsProvider, router, serviceLocator, + authTranslatorMap, }; } @@ -176,6 +192,12 @@ export class KubernetesBuilder { return this; } + public setAuthTranslatorMap(authTranslatorMap: { + [key: string]: KubernetesAuthTranslator; + }) { + this.authTranslatorMap = authTranslatorMap; + } + protected buildCustomResources() { const customResources: CustomResource[] = ( this.env.config.getOptionalConfigArray('kubernetes.customResources') ?? [] @@ -211,7 +233,14 @@ export class KubernetesBuilder { protected buildObjectsProvider( options: KubernetesObjectsProviderOptions, ): KubernetesObjectsProvider { - this.objectsProvider = new KubernetesFanOutHandler(options); + const authTranslatorMap = this.getAuthTranslatorMap(); + this.objectsProvider = new KubernetesFanOutHandler({ + ...options, + authTranslator: new DispatchingKubernetesAuthTranslator({ + authTranslatorMap, + }), + }); + return this.objectsProvider; } @@ -260,7 +289,15 @@ export class KubernetesBuilder { logger: Logger, clusterSupplier: KubernetesClustersSupplier, ): KubernetesProxy { - this.proxy = new KubernetesProxy(logger, clusterSupplier); + const authTranslatorMap = this.getAuthTranslatorMap(); + const authTranslator = new DispatchingKubernetesAuthTranslator({ + authTranslatorMap, + }); + this.proxy = new KubernetesProxy({ + logger, + clusterSupplier, + authTranslator, + }); return this.proxy; } @@ -315,6 +352,19 @@ export class KubernetesBuilder { return router; } + protected buildAuthTranslatorMap() { + this.authTranslatorMap = { + google: new GoogleKubernetesAuthTranslator(), + aws: new AwsIamKubernetesAuthTranslator({ config: this.env.config }), + azure: new AzureIdentityKubernetesAuthTranslator(this.env.logger), + serviceAccount: new NoopKubernetesAuthTranslator(), + googleServiceAccount: new GoogleServiceAccountAuthTranslator(), + oidc: new OidcKubernetesAuthTranslator(), + localKubectlProxy: new NoopKubernetesAuthTranslator(), + }; + return this.authTranslatorMap; + } + protected async fetchClusterDetails( clusterSupplier: KubernetesClustersSupplier, ) { @@ -394,4 +444,8 @@ export class KubernetesBuilder { ) { return this.proxy ?? this.buildProxy(logger, clusterSupplier); } + + protected getAuthTranslatorMap() { + return this.authTranslatorMap ?? this.buildAuthTranslatorMap(); + } } diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts index 9cdd533c71..e24c08cafd 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts @@ -168,6 +168,11 @@ function getKubernetesFanOutHandler(customResources: CustomResource[]) { getClustersByEntity, }, customResources: customResources, + authTranslator: { + decorateClusterDetailsWithAuth: async (clusterDetails, _) => { + return clusterDetails; + }, + }, }); } @@ -882,6 +887,11 @@ describe('getKubernetesObjectsByEntity', () => { objectType: 'services', }, ], + authTranslator: { + decorateClusterDetailsWithAuth: async (clusterDetails, _) => { + return clusterDetails; + }, + }, }); const result = await sut.getKubernetesObjectsByEntity({ diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 75522c5887..8441effabd 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -30,7 +30,6 @@ import { ServiceLocatorRequestContext, } from '../types/types'; import { KubernetesAuthTranslator } from '../kubernetes-auth-translator/types'; -import { KubernetesAuthTranslatorGenerator } from '../kubernetes-auth-translator/KubernetesAuthTranslatorGenerator'; import { ClientContainerStatus, ClientCurrentResourceUsage, @@ -48,7 +47,6 @@ import { CurrentResourceUsage, PodStatus, } from '@kubernetes/client-node'; -import { Config } from '@backstage/config'; const isRejected = ( input: PromiseSettledResult, @@ -138,7 +136,9 @@ export const DEFAULT_OBJECTS: ObjectToFetch[] = [ ]; export interface KubernetesFanOutHandlerOptions - extends KubernetesObjectsProviderOptions {} + extends KubernetesObjectsProviderOptions { + authTranslator: KubernetesAuthTranslator; +} export interface KubernetesRequestBody extends ObjectsByEntityRequest {} @@ -196,24 +196,22 @@ export class KubernetesFanOutHandler { private readonly serviceLocator: KubernetesServiceLocator; private readonly customResources: CustomResource[]; private readonly objectTypesToFetch: Set; - private readonly authTranslators: Record; - private readonly config: Config; + private readonly authTranslator: KubernetesAuthTranslator; constructor({ - config, logger, fetcher, serviceLocator, customResources, objectTypesToFetch = DEFAULT_OBJECTS, + authTranslator, }: KubernetesFanOutHandlerOptions) { - this.config = config; this.logger = logger; this.fetcher = fetcher; this.serviceLocator = serviceLocator; this.customResources = customResources; this.objectTypesToFetch = new Set(objectTypesToFetch); - this.authTranslators = {}; + this.authTranslator = authTranslator; } async getCustomResourcesByEntity({ @@ -317,12 +315,7 @@ export class KubernetesFanOutHandler { // Execute all of these async actions simultaneously/without blocking sequentially as no common object is modified by them const promiseResults = await Promise.allSettled( clusterDetails.map(cd => { - const kubernetesAuthTranslator: KubernetesAuthTranslator = - this.getAuthTranslator(cd.authProvider); - return kubernetesAuthTranslator.decorateClusterDetailsWithAuth( - cd, - auth, - ); + return this.authTranslator.decorateClusterDetailsWithAuth(cd, auth); }), ); @@ -397,20 +390,4 @@ export class KubernetesFanOutHandler { result.errors.push(...podMetrics.errors); return [result, podMetrics.responses as PodStatusFetchResponse[]]; } - - private getAuthTranslator(provider: string): KubernetesAuthTranslator { - if (this.authTranslators[provider]) { - return this.authTranslators[provider]; - } - - this.authTranslators[provider] = - KubernetesAuthTranslatorGenerator.getKubernetesAuthTranslatorInstance( - provider, - { - logger: this.logger, - config: this.config, - }, - ); - return this.authTranslators[provider]; - } } diff --git a/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts index 6482ba5f9e..9800780077 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts @@ -235,6 +235,55 @@ describe('KubernetesFetcher', () => { ], }); }); + it('localKubectlProxy authProvider fetches resources correctly', async () => { + worker.use( + rest.get( + 'http://localhost:9999/k8s/clusters/1234/api/v1/services', + (req, res, ctx) => + res( + withLabels(req, ctx, { + items: [{ metadata: { name: 'service-name' } }], + }), + ), + ), + ); + + const result = await sut.fetchObjectsForService({ + serviceId: 'some-service', + clusterDetails: { + name: 'cluster1', + url: 'http://localhost:9999/k8s/clusters/1234', + authProvider: 'localKubectlProxy', + }, + objectTypesToFetch: new Set([ + { + group: '', + apiVersion: 'v1', + plural: 'services', + objectType: 'services', + }, + ]), + labelSelector: '', + customResources: [], + }); + + expect(result).toStrictEqual({ + errors: [], + responses: [ + { + type: 'services', + resources: [ + { + metadata: { + name: 'service-name', + labels: { 'backstage.io/kubernetes-id': 'some-service' }, + }, + }, + ], + }, + ], + }); + }); it('should return pods, services', async () => { worker.use( rest.get('http://localhost:9999/api/v1/pods', (req, res, ctx) => diff --git a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts index 6161c040d7..48bea3106b 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts @@ -191,7 +191,10 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { let url: URL; let requestInit: RequestInit; - if (clusterDetails.serviceAccountToken) { + if ( + clusterDetails.serviceAccountToken || + clusterDetails.authProvider === 'localKubectlProxy' + ) { [url, requestInit] = this.fetchArgsFromClusterDetails(clusterDetails); } else if (fs.pathExistsSync(Config.SERVICEACCOUNT_TOKEN_PATH)) { [url, requestInit] = this.fetchArgsInCluster(); diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index d2404af839..57eb29f0a7 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -28,16 +28,19 @@ import { ClusterDetails, KubernetesClustersSupplier } from '../types/types'; import { APPLICATION_JSON, HEADER_KUBERNETES_CLUSTER, + HEADER_KUBERNETES_AUTH, KubernetesProxy, } from './KubernetesProxy'; import { AuthorizeResult, PermissionEvaluator, } from '@backstage/plugin-permission-common'; +import { KubernetesAuthTranslator } from '../kubernetes-auth-translator'; describe('KubernetesProxy', () => { let proxy: KubernetesProxy; const worker = setupServer(); + const logger = getVoidLogger(); setupRequestMockHandlers(worker); @@ -73,9 +76,13 @@ describe('KubernetesProxy', () => { authorizeConditional: jest.fn(), }; + const authTranslator: jest.Mocked = { + decorateClusterDetailsWithAuth: jest.fn(), + }; + beforeEach(() => { jest.resetAllMocks(); - proxy = new KubernetesProxy(getVoidLogger(), clusterSupplier); + proxy = new KubernetesProxy({ logger, clusterSupplier, authTranslator }); }); it('should return a ERROR_NOT_FOUND if no clusters are found', async () => { @@ -112,21 +119,30 @@ describe('KubernetesProxy', () => { authProvider: 'serviceAccount', }, ] as ClusterDetails[]); + + permissionApi.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); + + authTranslator.decorateClusterDetailsWithAuth.mockResolvedValue({ + name: 'cluster1', + url: 'https://localhost:9999', + serviceAccountToken: '', + authProvider: 'serviceAccount', + } as ClusterDetails); + const app = express().use( '/mountpath', proxy.createRequestHandler({ permissionApi }), ); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); const requestPromise = request(app) .get('/mountpath/api') .set(HEADER_KUBERNETES_CLUSTER, 'cluster1'); worker.use( - rest.get('https://localhost:9999/api', (_, res, ctx) => + rest.get('https://localhost:9999/api', (_: any, res: any, ctx: any) => res(ctx.status(299), ctx.json(apiResponse)), ), - rest.all(requestPromise.url, (req, _res, _ctx) => req.passthrough()), + rest.all(requestPromise.url, (req: any) => req.passthrough()), ); const response = await requestPromise; @@ -134,4 +150,188 @@ describe('KubernetesProxy', () => { expect(response.status).toEqual(299); expect(response.body).toStrictEqual(apiResponse); }); + + it('should default to using a provided authorization header', async () => { + worker.use( + rest.get( + 'https://localhost:9999/api/v1/namespaces', + (req: any, res: any, ctx: any) => { + if (!req.headers.get('Authorization')) { + return res(ctx.status(401)); + } + + if (req.headers.get('Authorization') !== 'my-token') { + return res(ctx.status(403)); + } + + return res( + ctx.status(200), + ctx.json({ + kind: 'NamespaceList', + apiVersion: 'v1', + items: [], + }), + ); + }, + ), + ); + + permissionApi.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); + + clusterSupplier.getClusters.mockResolvedValue([ + { + name: 'cluster1', + url: 'https://localhost:9999', + serviceAccountToken: '', + authProvider: 'serviceAccount', + }, + ] as ClusterDetails[]); + + authTranslator.decorateClusterDetailsWithAuth.mockResolvedValue({ + name: 'cluster1', + url: 'https://localhost:9999', + serviceAccountToken: 'random-token', + authProvider: 'serviceAccount', + } as ClusterDetails); + + const app = express().use( + '/mountpath', + proxy.createRequestHandler({ permissionApi }), + ); + const requestPromise = request(app) + .get('/mountpath/api/v1/namespaces') + .set(HEADER_KUBERNETES_CLUSTER, 'cluster1') + .set('Authorization', 'my-token'); + + worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + + const response = await requestPromise; + + expect(response.status).toEqual(200); + }); + + it('should add a serviceAccountToken to the request headers if one isnt provided in request and one isnt set up in cluster details', async () => { + worker.use( + rest.get('https://localhost:9999/api/v1/namespaces', (req, res, ctx) => { + if (!req.headers.get('Authorization')) { + return res(ctx.status(401)); + } + + if (req.headers.get('Authorization') !== 'Bearer my-token') { + return res(ctx.status(403)); + } + + return res( + ctx.status(200), + ctx.json({ + kind: 'NamespaceList', + apiVersion: 'v1', + items: [], + }), + ); + }), + ); + + permissionApi.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); + + clusterSupplier.getClusters.mockResolvedValue([ + { + name: 'cluster1', + url: 'https://localhost:9999', + authProvider: 'googleServiceAccount', + }, + ] as ClusterDetails[]); + + authTranslator.decorateClusterDetailsWithAuth.mockResolvedValue({ + name: 'cluster1', + url: 'https://localhost:9999', + serviceAccountToken: 'my-token', + authProvider: 'googleServiceAccount', + } as ClusterDetails); + + const app = express().use( + '/mountpath', + proxy.createRequestHandler({ permissionApi }), + ); + const requestPromise = request(app) + .get('/mountpath/api/v1/namespaces') + .set(HEADER_KUBERNETES_CLUSTER, 'cluster1'); + + worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + + const response = await requestPromise; + + expect(response.status).toEqual(200); + expect(response.body).toStrictEqual({ + kind: 'NamespaceList', + apiVersion: 'v1', + items: [], + }); + }); + + it('should append the Backstage-Kubernetes-Auth field to the requests authorization header if one is provided', async () => { + worker.use( + rest.get('https://localhost:9999/api/v1/namespaces', (req, res, ctx) => { + if (!req.headers.get('Authorization')) { + return res(ctx.status(401)); + } + + if (req.headers.get('Authorization') !== 'tokenB') { + return res(ctx.status(403)); + } + + return res( + ctx.status(200), + ctx.json({ + kind: 'NamespaceList', + apiVersion: 'v1', + items: [], + }), + ); + }), + ); + + permissionApi.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); + + clusterSupplier.getClusters.mockResolvedValue([ + { + name: 'cluster1', + url: 'https://localhost:9999', + authProvider: 'googleServiceAccount', + }, + ] as ClusterDetails[]); + + authTranslator.decorateClusterDetailsWithAuth.mockResolvedValue({ + name: 'cluster1', + url: 'https://localhost:9999', + serviceAccountToken: 'tokenA', + authProvider: 'googleServiceAccount', + } as ClusterDetails); + + const app = express().use( + '/mountpath', + proxy.createRequestHandler({ permissionApi }), + ); + const requestPromise = request(app) + .get('/mountpath/api/v1/namespaces') + .set(HEADER_KUBERNETES_CLUSTER, 'cluster1') + .set(HEADER_KUBERNETES_AUTH, 'tokenB'); + + worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + + const response = await requestPromise; + + expect(response.status).toEqual(200); + expect(response.body).toStrictEqual({ + kind: 'NamespaceList', + apiVersion: 'v1', + items: [], + }); + }); }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 49a381b75a..eb6748ffba 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -32,6 +32,7 @@ import { bufferFromFileOrString } from '@kubernetes/client-node'; import type { Request, RequestHandler } from 'express'; import { createProxyMiddleware } from 'http-proxy-middleware'; import { Logger } from 'winston'; +import { KubernetesAuthTranslator } from '../kubernetes-auth-translator'; import { ClusterDetails, KubernetesClustersSupplier } from '../types/types'; export const APPLICATION_JSON: string = 'application/json'; @@ -60,6 +61,17 @@ export type KubernetesProxyCreateRequestHandlerOptions = { permissionApi: PermissionEvaluator; }; +/** + * Options accepted as a parameter by the KubernetesProxy + * + * @public + */ +export type KubernetesProxyOptions = { + logger: Logger; + clusterSupplier: KubernetesClustersSupplier; + authTranslator: KubernetesAuthTranslator; +}; + /** * A proxy that routes requests to the Kubernetes API. * @@ -67,11 +79,15 @@ export type KubernetesProxyCreateRequestHandlerOptions = { */ export class KubernetesProxy { private readonly middlewareForClusterName = new Map(); + private readonly logger: Logger; + private readonly clusterSupplier: KubernetesClustersSupplier; + private readonly authTranslator: KubernetesAuthTranslator; - constructor( - private readonly logger: Logger, - private readonly clusterSupplier: KubernetesClustersSupplier, - ) {} + constructor(options: KubernetesProxyOptions) { + this.logger = options.logger; + this.clusterSupplier = options.clusterSupplier; + this.authTranslator = options.authTranslator; + } public createRequestHandler( options: KubernetesProxyCreateRequestHandlerOptions, @@ -96,6 +112,12 @@ export class KubernetesProxy { return; } + const cluster = await this.getClusterForRequest(req).then(cd => + this.authTranslator.decorateClusterDetailsWithAuth(cd, {}), + ); + if (!req.headers.authorization) { + req.headers.authorization = `Bearer ${cluster.serviceAccountToken}`; + } const middleware = await this.getMiddleware(req); middleware(req, res, next); }; @@ -108,13 +130,6 @@ export class KubernetesProxy { const originalCluster = await this.getClusterForRequest(originalReq); let middleware = this.middlewareForClusterName.get(originalCluster.name); if (!middleware) { - // Probably too risky without permissions protecting this endpoint - // if (cluster.serviceAccountToken) { - // options.headers = { - // Authorization: `Bearer ${cluster.serviceAccountToken}`, - // }; - // } - const logger = this.logger.child({ cluster: originalCluster.name }); middleware = createProxyMiddleware({ logProvider: () => logger, @@ -146,19 +161,18 @@ export class KubernetesProxy { request: { method: req.method, url: req.originalUrl }, response: { statusCode: 500 }, }; - res.status(500).json(body); }, onProxyReq: (proxyReq, req) => { // the kubernetes proxy endpoint expects a header field labeled `Backstage-Kubernetes-Authorization` that will be used to authenticate with the Kubernetes Api. The token provided as a value should be an bearer token for the target cluster. - const token = req.header(HEADER_KUBERNETES_AUTH) ?? ''; - proxyReq.setHeader('Authorization', token); + if (req.header(HEADER_KUBERNETES_AUTH)) { + const token = req.header(HEADER_KUBERNETES_AUTH) ?? ''; + proxyReq.setHeader('Authorization', token); + } }, }); - this.middlewareForClusterName.set(originalCluster.name, middleware); } - return middleware; } diff --git a/plugins/kubernetes-backend/src/service/index.ts b/plugins/kubernetes-backend/src/service/index.ts index 2f3e907879..9c0911de37 100644 --- a/plugins/kubernetes-backend/src/service/index.ts +++ b/plugins/kubernetes-backend/src/service/index.ts @@ -21,5 +21,8 @@ export { KubernetesProxy, HEADER_KUBERNETES_AUTH, } from './KubernetesProxy'; -export type { KubernetesProxyCreateRequestHandlerOptions } from './KubernetesProxy'; +export type { + KubernetesProxyCreateRequestHandlerOptions, + KubernetesProxyOptions, +} from './KubernetesProxy'; export * from './router'; diff --git a/plugins/kubernetes-backend/src/types/types.ts b/plugins/kubernetes-backend/src/types/types.ts index 31327b21ee..e460edbc29 100644 --- a/plugins/kubernetes-backend/src/types/types.ts +++ b/plugins/kubernetes-backend/src/types/types.ts @@ -105,6 +105,8 @@ export type KubernetesObjectTypes = | 'customresources' | 'statefulsets' | 'daemonsets'; +// If updating this list, also make sure to update +// `objectTypes` and `apiVersionOverrides` in config.d.ts! /** * Used to load cluster details from different sources diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 862899600e..0f6b540c23 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-kubernetes-common +## 0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.6.2-next.0 ### Patch Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index 4eb4a02bf9..8f4b4d348d 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-common", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", - "version": "0.6.2-next.0", + "version": "0.6.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index cc8131b399..fbecb8ee2e 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-kubernetes +## 0.7.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + +## 0.7.10-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-kubernetes-common@0.6.2-next.1 + ## 0.7.10-next.0 ### Patch Changes diff --git a/plugins/kubernetes/api-report.md b/plugins/kubernetes/api-report.md index 2cc2674a9e..ad1217e257 100644 --- a/plugins/kubernetes/api-report.md +++ b/plugins/kubernetes/api-report.md @@ -104,17 +104,21 @@ export interface DeploymentResources { // @public export interface DetectedError { // (undocumented) - cluster: string; + message: string; // (undocumented) - kind: ErrorDetectableKind; + occuranceCount: number; + // Warning: (ae-forgotten-export) The symbol "ProposedFix" needs to be exported by the entry point index.d.ts + // // (undocumented) - message: string[]; - // (undocumented) - names: string[]; - // (undocumented) - namespace: string; + proposedFix: ProposedFix[]; // (undocumented) severity: ErrorSeverity; + // Warning: (ae-forgotten-export) The symbol "ResourceRef" needs to be exported by the entry point index.d.ts + // + // (undocumented) + sourceRef: ResourceRef; + // (undocumented) + type: string; } // @public @@ -137,12 +141,6 @@ export type EntityKubernetesContentProps = { refreshIntervalMs?: number; }; -// @public -export type ErrorDetectableKind = - | 'Pod' - | 'Deployment' - | 'HorizontalPodAutoscaler'; - // Warning: (ae-forgotten-export) The symbol "ErrorPanelProps" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "ErrorPanel" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index f674402545..edff7348a4 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.7.10-next.0", + "version": "0.7.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -47,12 +47,14 @@ "@types/react": "^16.13.1 || ^17.0.0", "cronstrue": "^2.2.0", "js-yaml": "^4.0.0", + "kubernetes-models": "^4.1.0", "lodash": "^4.17.21", "luxon": "^3.0.0", "react-use": "^17.2.4" }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -60,6 +62,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/kubernetes/src/components/ErrorReporting/ErrorReporting.tsx b/plugins/kubernetes/src/components/ErrorReporting/ErrorReporting.tsx index a99fc21902..367e791067 100644 --- a/plugins/kubernetes/src/components/ErrorReporting/ErrorReporting.tsx +++ b/plugins/kubernetes/src/components/ErrorReporting/ErrorReporting.tsx @@ -15,84 +15,64 @@ */ import * as React from 'react'; import { DetectedError, DetectedErrorsByCluster } from '../../error-detection'; -import { Chip } from '@material-ui/core'; import { Table, TableColumn } from '@backstage/core-components'; type ErrorReportingProps = { detectedErrors: DetectedErrorsByCluster; }; -const columns: TableColumn[] = [ +const columns: TableColumn[] = [ { title: 'cluster', width: '10%', - render: (detectedError: DetectedError) => detectedError.cluster, + render: (row: Row) => row.clusterName, }, { title: 'namespace', width: '10%', - render: (detectedError: DetectedError) => detectedError.namespace, + render: (row: Row) => row.error.sourceRef.namespace, }, { title: 'kind', width: '10%', - render: (detectedError: DetectedError) => detectedError.kind, + render: (row: Row) => row.error.sourceRef.kind, }, { title: 'name', width: '30%', - render: (detectedError: DetectedError) => { - const errorCount = detectedError.names.length; - - if (errorCount === 0) { - // This shouldn't happen - return null; - } - - const displayName = detectedError.names[0]; - - const otherErrorCount = errorCount - 1; - - return ( - <> - {displayName}{' '} - {otherErrorCount > 0 && ( - 1 ? 's' : '' - }`} - size="small" - /> - )} - - ); + render: (row: Row) => { + return <>{row.error.sourceRef.name} ; }, }, { title: 'messages', width: '40%', - render: (detectedError: DetectedError) => ( - <> - {detectedError.message.map((m, i) => ( -

{m}
- ))} - - ), + render: (row: Row) => row.error.message, }, ]; -const sortBySeverity = (a: DetectedError, b: DetectedError) => { - if (a.severity < b.severity) { +interface Row { + clusterName: string; + error: DetectedError; +} + +const sortBySeverity = (a: Row, b: Row) => { + if (a.error.severity < b.error.severity) { return 1; - } else if (b.severity < a.severity) { + } else if (b.error.severity < a.error.severity) { return -1; } return 0; }; export const ErrorReporting = ({ detectedErrors }: ErrorReportingProps) => { - const errors = Array.from(detectedErrors.values()) - .flat() + const errors = Array.from(detectedErrors.entries()) + .flatMap(([clusterName, resourceErrors]) => { + return resourceErrors.map(e => ({ + clusterName, + error: e, + })); + }) .sort(sortBySeverity); return ( diff --git a/plugins/kubernetes/src/components/KubernetesContent.tsx b/plugins/kubernetes/src/components/KubernetesContent.tsx index a42e9fbb0b..63aa52f1ba 100644 --- a/plugins/kubernetes/src/components/KubernetesContent.tsx +++ b/plugins/kubernetes/src/components/KubernetesContent.tsx @@ -114,9 +114,8 @@ export const KubernetesContent = ({ const podsWithErrors = new Set( detectedErrors .get(item.cluster.name) - ?.filter(de => de.kind === 'Pod') - .map(de => de.names) - .flat() ?? [], + ?.filter(de => de.sourceRef.kind === 'Pod') + .map(de => de.sourceRef.name), ); return ( diff --git a/plugins/kubernetes/src/error-detection/__fixtures__/pod-crashing.json b/plugins/kubernetes/src/error-detection/__fixtures__/pod-crashing.json index 79acd2900d..bff3347813 100644 --- a/plugins/kubernetes/src/error-detection/__fixtures__/pod-crashing.json +++ b/plugins/kubernetes/src/error-detection/__fixtures__/pod-crashing.json @@ -185,7 +185,7 @@ }, "name": "other-side-car", "ready": false, - "restartCount": 38, + "restartCount": 123, "started": false, "state": { "waiting": { diff --git a/plugins/kubernetes/src/error-detection/common.ts b/plugins/kubernetes/src/error-detection/common.ts index bc5fd2fc40..381f57b71a 100644 --- a/plugins/kubernetes/src/error-detection/common.ts +++ b/plugins/kubernetes/src/error-detection/common.ts @@ -14,59 +14,15 @@ * limitations under the License. */ -import { - DetectedError, - ErrorDetectable, - ErrorDetectableKind, - ErrorMapper, -} from './types'; +import { DetectedError, ErrorMapper } from './types'; // Run through the each error mapper for each object // returning a deduplicated (mostly) result -export const detectErrorsInObjects = ( +export const detectErrorsInObjects = ( objects: T[], - kind: ErrorDetectableKind, - clusterName: string, errorMappers: ErrorMapper[], ): DetectedError[] => { - // Build up a map of errors - // key: the joined message produced by an error - // value: the error - const errors = new Map(); - - for (const object of objects) { - for (const errorMapper of errorMappers) { - if (errorMapper.errorExists(object)) { - const message = errorMapper.messageAccessor(object); - - // TODO This is not perfect as errors with uuid/hashes/date/times will not be caught by this - const dedupKey = message.join(''); - - const value = errors.get(dedupKey); - - const name = object.metadata?.name ?? 'unknown'; - const namespace = object.metadata?.namespace ?? 'unknown'; - - if (value !== undefined) { - // This gets translated into the Chip "+5 others" - // in the ErrorReporting component - // but we need to keep the names so we can easily - // find which objects owns the error later - value.names.push(name); - errors.set(dedupKey, value); - } else { - errors.set(dedupKey, { - cluster: clusterName, - kind: kind, - names: [name], - message: message, - severity: errorMapper.severity, - namespace, - }); - } - } - } - } - - return Array.from(errors.values()); + return objects.flatMap(o => { + return errorMappers.flatMap(em => em.detectErrors(o)); + }); }; diff --git a/plugins/kubernetes/src/error-detection/deployments.ts b/plugins/kubernetes/src/error-detection/deployments.ts index 896cd231ff..7807110224 100644 --- a/plugins/kubernetes/src/error-detection/deployments.ts +++ b/plugins/kubernetes/src/error-detection/deployments.ts @@ -15,35 +15,33 @@ */ import { DetectedError, ErrorMapper } from './types'; -import { V1Deployment } from '@kubernetes/client-node'; +import { Deployment } from 'kubernetes-models/apps/v1'; import { detectErrorsInObjects } from './common'; -const deploymentErrorMappers: ErrorMapper[] = [ +const deploymentErrorMappers: ErrorMapper[] = [ { - // this is probably important - severity: 6, - errorExplanation: 'condition-message-present', - errorExists: deployment => { - return (deployment.status?.conditions ?? []) - .filter(c => c.status === 'False') - .some(c => c.message !== undefined); - }, - messageAccessor: deployment => { + detectErrors: deployment => { return (deployment.status?.conditions ?? []) .filter(c => c.status === 'False') .filter(c => c.message !== undefined) - .map(c => c.message ?? ''); + .map(c => ({ + type: 'condition-message-present', + message: c.message ?? '', + severity: 6, + proposedFix: [], // TODO next PR + sourceRef: { + name: deployment.metadata?.name ?? 'unknown hpa', + namespace: deployment.metadata?.namespace ?? 'unknown namespace', + kind: 'Deployment', + apiGroup: 'apps/v1', + }, + occuranceCount: 1, + })); }, }, ]; export const detectErrorsInDeployments = ( - deployments: V1Deployment[], - clusterName: string, + deployments: Deployment[], ): DetectedError[] => - detectErrorsInObjects( - deployments, - 'Deployment', - clusterName, - deploymentErrorMappers, - ); + detectErrorsInObjects(deployments, deploymentErrorMappers); diff --git a/plugins/kubernetes/src/error-detection/error-detection.test.ts b/plugins/kubernetes/src/error-detection/error-detection.test.ts index 2c6373f32d..e3b9e91f6b 100644 --- a/plugins/kubernetes/src/error-detection/error-detection.test.ts +++ b/plugins/kubernetes/src/error-detection/error-detection.test.ts @@ -147,51 +147,61 @@ describe('detectErrors', () => { const [err1, err2, err3, err4] = errors ?? []; expect(err1).toStrictEqual({ - cluster: 'cluster-a', - kind: 'Pod', - message: [ - 'container=other-side-car restarted 38 times', - 'container=side-car restarted 38 times', - ], - names: ['dice-roller-canary-7d64cd756c-55rfq'], - namespace: 'default', + sourceRef: { + apiGroup: 'v1', + kind: 'Pod', + name: 'dice-roller-canary-7d64cd756c-55rfq', + namespace: 'default', + }, + message: + 'back-off 5m0s restarting failed container=other-side-car pod=dice-roller-canary-7d64cd756c-55rfq_default(65ad28e3-5d51-4b4b-9bf8-4cb069803034)', severity: 4, + occuranceCount: 1, + proposedFix: [], + type: 'container-waiting', }); expect(err2).toStrictEqual({ - cluster: 'cluster-a', - kind: 'Pod', - message: [ - 'containers with unready status: [side-car other-side-car]', - 'containers with unready status: [side-car other-side-car]', - ], - names: ['dice-roller-canary-7d64cd756c-55rfq'], - namespace: 'default', - severity: 5, + sourceRef: { + apiGroup: 'v1', + kind: 'Pod', + name: 'dice-roller-canary-7d64cd756c-55rfq', + namespace: 'default', + }, + message: + 'back-off 5m0s restarting failed container=side-car pod=dice-roller-canary-7d64cd756c-55rfq_default(65ad28e3-5d51-4b4b-9bf8-4cb069803034)', + severity: 4, + occuranceCount: 1, + proposedFix: [], + type: 'container-waiting', }); expect(err3).toStrictEqual({ - cluster: 'cluster-a', - kind: 'Pod', - message: [ - 'back-off 5m0s restarting failed container=other-side-car pod=dice-roller-canary-7d64cd756c-55rfq_default(65ad28e3-5d51-4b4b-9bf8-4cb069803034)', - 'back-off 5m0s restarting failed container=side-car pod=dice-roller-canary-7d64cd756c-55rfq_default(65ad28e3-5d51-4b4b-9bf8-4cb069803034)', - ], - names: ['dice-roller-canary-7d64cd756c-55rfq'], - namespace: 'default', - severity: 6, + sourceRef: { + apiGroup: 'v1', + kind: 'Pod', + name: 'dice-roller-canary-7d64cd756c-55rfq', + namespace: 'default', + }, + message: 'container=other-side-car restarted 123 times', + severity: 4, + occuranceCount: 123, + proposedFix: [], + type: 'containers-restarting', }); expect(err4).toStrictEqual({ - cluster: 'cluster-a', - kind: 'Pod', - message: [ - 'container=other-side-car exited with error code (1)', - 'container=side-car exited with error code (1)', - ], - names: ['dice-roller-canary-7d64cd756c-55rfq'], - namespace: 'default', + sourceRef: { + apiGroup: 'v1', + kind: 'Pod', + name: 'dice-roller-canary-7d64cd756c-55rfq', + namespace: 'default', + }, + message: 'container=side-car restarted 38 times', severity: 4, + occuranceCount: 38, + proposedFix: [], + type: 'containers-restarting', }); }); it('should detect errors in pod with missing Config Map', () => { @@ -202,29 +212,22 @@ describe('detectErrors', () => { const errors = result.get(CLUSTER_NAME); expect(errors).toBeDefined(); - expect(errors).toHaveLength(2); + expect(errors).toHaveLength(1); - const [err1, err2] = errors ?? []; + const [err1] = errors ?? []; expect(err1).toStrictEqual({ - cluster: 'cluster-a', - kind: 'Pod', - message: [ - 'containers with unready status: [nginx]', - 'containers with unready status: [nginx]', - ], - names: ['dice-roller-bad-cm-855bf85464-mg6xb'], - namespace: 'default', - severity: 5, - }); - - expect(err2).toStrictEqual({ - cluster: 'cluster-a', - kind: 'Pod', - message: ['configmap "some-cm" not found'], - names: ['dice-roller-bad-cm-855bf85464-mg6xb'], - namespace: 'default', - severity: 6, + message: 'configmap "some-cm" not found', + occuranceCount: 1, + proposedFix: [], + severity: 4, + sourceRef: { + apiGroup: 'v1', + kind: 'Pod', + name: 'dice-roller-bad-cm-855bf85464-mg6xb', + namespace: 'default', + }, + type: 'container-waiting', }); }); it('should detect no errors in healthy deployment', () => { @@ -250,12 +253,17 @@ describe('detectErrors', () => { const [err1] = errors ?? []; expect(err1).toStrictEqual({ - cluster: 'cluster-a', - kind: 'Deployment', - message: ['Deployment does not have minimum availability.'], - names: ['dice-roller-canary'], - namespace: 'default', + sourceRef: { + apiGroup: 'apps/v1', + kind: 'Deployment', + name: 'dice-roller-canary', + namespace: 'default', + }, + message: 'Deployment does not have minimum availability.', severity: 6, + occuranceCount: 1, + proposedFix: [], + type: 'condition-message-present', }); }); it('should detect no errors in healthy hpa', () => { @@ -281,14 +289,159 @@ describe('detectErrors', () => { const [err1] = errors ?? []; expect(err1).toStrictEqual({ - cluster: 'cluster-a', - kind: 'HorizontalPodAutoscaler', - message: [ + sourceRef: { + apiGroup: 'autoscaling/v1', + kind: 'HorizontalPodAutoscaler', + name: 'dice-roller', + namespace: 'default', + }, + message: 'Current number of replicas (10) is equal to the configured max number of replicas (10)', - ], - names: ['dice-roller'], - namespace: 'default', severity: 8, + occuranceCount: 1, + proposedFix: [], + type: 'hpa-max-current-replicas', + }); + }); + it('pending pod is not an error', async () => { + const expiredReadiness = new Date(); + expiredReadiness.setFullYear(expiredReadiness.getFullYear() - 1); + const result = await detectErrors( + onePod({ + spec: { + containers: [ + { + name: 'some-container', + readinessProbe: { + initialDelaySeconds: 20000, + failureThreshold: 5, + periodSeconds: 5, + }, + }, + ], + }, + status: { + containerStatuses: [ + { + name: 'some-container', + image: 'some-image', + imageID: 'some-image-id', + restartCount: 0, + containerID: 'running-container', + ready: false, + state: { + running: { + startedAt: new Date().toISOString() as any, + }, + }, + }, + ], + message: 'Container running', + }, + }), + ); + + const errors = result.get(CLUSTER_NAME); + + expect(errors).toBeDefined(); + expect(errors).toHaveLength(0); + }); + it('no probe pod has no errors', async () => { + const expiredReadiness = new Date(); + expiredReadiness.setFullYear(expiredReadiness.getFullYear() - 1); + const result = await detectErrors( + onePod({ + spec: { + containers: [ + { + name: 'some-container', + }, + ], + }, + status: { + containerStatuses: [ + { + name: 'some-container', + image: 'some-image', + imageID: 'some-image-id', + restartCount: 0, + containerID: 'running-container', + ready: false, + state: { + running: { + startedAt: new Date().toISOString() as any, + }, + }, + }, + ], + message: 'Container running', + }, + }), + ); + + const errors = result.get(CLUSTER_NAME); + + expect(errors).toBeDefined(); + expect(errors).toHaveLength(0); + }); + it('readiness probe failure results in error', async () => { + const expiredReadiness = new Date(); + expiredReadiness.setFullYear(expiredReadiness.getFullYear() - 1); + const result = await detectErrors( + onePod({ + spec: { + containers: [ + { + name: 'some-container', + readinessProbe: { + initialDelaySeconds: 20, + failureThreshold: 5, + periodSeconds: 5, + }, + }, + ], + }, + status: { + containerStatuses: [ + { + name: 'some-container', + image: 'some-image', + imageID: 'some-image-id', + restartCount: 0, + containerID: 'running-container', + ready: false, + state: { + running: { + startedAt: expiredReadiness.toISOString() as any, + }, + }, + }, + ], + message: 'Container running', + }, + }), + ); + + const errors = result.get(CLUSTER_NAME); + + expect(errors).toBeDefined(); + expect(errors).toHaveLength(1); + + const [err1] = errors ?? []; + + expect(err1).toStrictEqual({ + message: + 'The container some-container failed to start properly, but is not crashing', + occuranceCount: 1, + proposedFix: [], + severity: 4, + sourceRef: { + apiGroup: 'v1', + kind: 'Pod', + name: 'unknown pod', + namespace: 'unknown namespace', + }, + type: 'readiness-probe-taking-too-long', }); }); }); diff --git a/plugins/kubernetes/src/error-detection/error-detection.ts b/plugins/kubernetes/src/error-detection/error-detection.ts index fddd4d838a..c33de18b80 100644 --- a/plugins/kubernetes/src/error-detection/error-detection.ts +++ b/plugins/kubernetes/src/error-detection/error-detection.ts @@ -20,6 +20,9 @@ import { groupResponses } from '../utils/response'; import { detectErrorsInPods } from './pods'; import { detectErrorsInDeployments } from './deployments'; import { detectErrorsInHpa } from './hpas'; +import { Deployment } from 'kubernetes-models/apps/v1'; +import { HorizontalPodAutoscaler } from 'kubernetes-models/autoscaling/v1'; +import { Pod } from 'kubernetes-models/v1'; /** * For each cluster try to find errors in each of the object types provided @@ -38,20 +41,16 @@ export const detectErrors = ( const groupedResponses = groupResponses(clusterResponse.resources); clusterErrors = clusterErrors.concat( - detectErrorsInPods(groupedResponses.pods, clusterResponse.cluster.name), + detectErrorsInPods(groupedResponses.pods as Pod[]), ); clusterErrors = clusterErrors.concat( - detectErrorsInDeployments( - groupedResponses.deployments, - clusterResponse.cluster.name, - ), + detectErrorsInDeployments(groupedResponses.deployments as Deployment[]), ); clusterErrors = clusterErrors.concat( detectErrorsInHpa( - groupedResponses.horizontalPodAutoscalers, - clusterResponse.cluster.name, + groupedResponses.horizontalPodAutoscalers as HorizontalPodAutoscaler[], ), ); diff --git a/plugins/kubernetes/src/error-detection/hpas.ts b/plugins/kubernetes/src/error-detection/hpas.ts index dd4674a7d0..2dc5e30ce6 100644 --- a/plugins/kubernetes/src/error-detection/hpas.ts +++ b/plugins/kubernetes/src/error-detection/hpas.ts @@ -14,37 +14,39 @@ * limitations under the License. */ -import { V1HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import { HorizontalPodAutoscaler } from 'kubernetes-models/autoscaling/v1'; import { DetectedError, ErrorMapper } from './types'; import { detectErrorsInObjects } from './common'; -const hpaErrorMappers: ErrorMapper[] = [ +const hpaErrorMappers: ErrorMapper[] = [ { - // this is probably important - severity: 8, - errorExplanation: 'hpa-max-current-replicas', - errorExists: hpa => { - return (hpa.spec?.maxReplicas ?? -1) === hpa.status?.currentReplicas; - }, - messageAccessor: hpa => { - return [ - `Current number of replicas (${ - hpa.status?.currentReplicas - }) is equal to the configured max number of replicas (${ - hpa.spec?.maxReplicas ?? -1 - })`, - ]; + detectErrors: hpa => { + if ((hpa.spec?.maxReplicas ?? -1) === hpa.status?.currentReplicas) { + return [ + { + type: 'hpa-max-current-replicas', + message: `Current number of replicas (${ + hpa.status?.currentReplicas + }) is equal to the configured max number of replicas (${ + hpa.spec?.maxReplicas ?? -1 + })`, + severity: 8, + proposedFix: [], // TODO next PR + sourceRef: { + name: hpa.metadata?.name ?? 'unknown hpa', + namespace: hpa.metadata?.namespace ?? 'unknown namespace', + kind: 'HorizontalPodAutoscaler', + apiGroup: 'autoscaling/v1', + }, + occuranceCount: 1, + }, + ]; + } + return []; }, }, ]; export const detectErrorsInHpa = ( - hpas: V1HorizontalPodAutoscaler[], - clusterName: string, -): DetectedError[] => - detectErrorsInObjects( - hpas, - 'HorizontalPodAutoscaler', - clusterName, - hpaErrorMappers, - ); + hpas: HorizontalPodAutoscaler[], +): DetectedError[] => detectErrorsInObjects(hpas, hpaErrorMappers); diff --git a/plugins/kubernetes/src/error-detection/index.ts b/plugins/kubernetes/src/error-detection/index.ts index ced03066a7..67bfb70f3b 100644 --- a/plugins/kubernetes/src/error-detection/index.ts +++ b/plugins/kubernetes/src/error-detection/index.ts @@ -15,7 +15,6 @@ */ export type { - ErrorDetectableKind, DetectedError, DetectedErrorsByCluster, ErrorSeverity, diff --git a/plugins/kubernetes/src/error-detection/pods.ts b/plugins/kubernetes/src/error-detection/pods.ts index 1ad6e3485f..a85276eaa2 100644 --- a/plugins/kubernetes/src/error-detection/pods.ts +++ b/plugins/kubernetes/src/error-detection/pods.ts @@ -14,82 +14,121 @@ * limitations under the License. */ -import { V1Pod } from '@kubernetes/client-node'; -import { totalRestarts } from '../utils/pod'; +import { Pod, IContainerStatus, IContainer } from 'kubernetes-models/v1'; import { DetectedError, ErrorMapper } from './types'; import { detectErrorsInObjects } from './common'; +import lodash from 'lodash'; +import { DateTime } from 'luxon'; -const podErrorMappers: ErrorMapper[] = [ +function isPodReadinessProbeUnready({ + container, + containerStatus, +}: ContainerSpecAndStatus): boolean { + if ( + containerStatus.ready || + containerStatus.state?.running?.startedAt === undefined || + !container.readinessProbe + ) { + return false; + } + const startDateTime = DateTime.fromISO( + containerStatus.state?.running?.startedAt, + ) + // Add initial delay + .plus({ + seconds: container.readinessProbe?.initialDelaySeconds ?? 0, + }) + // Add failure threshold + .plus({ + seconds: + (container.readinessProbe?.periodSeconds ?? 0) * + (container.readinessProbe?.failureThreshold ?? 0), + }); + return startDateTime < DateTime.now(); +} + +interface ContainerSpecAndStatus { + container: IContainer; + containerStatus: IContainerStatus; +} + +const podToContainerSpecsAndStatuses = (pod: Pod): ContainerSpecAndStatus[] => { + const specs = lodash.groupBy(pod.spec?.containers ?? [], value => value.name); + + const result: ContainerSpecAndStatus[] = []; + + for (const cs of pod.status?.containerStatuses ?? []) { + const spec = specs[cs.name]; + if (spec.length > 0) { + result.push({ + container: spec[0], + containerStatus: cs, + }); + } + } + + return result; +}; + +const podErrorMappers: ErrorMapper[] = [ { - severity: 5, - errorExplanation: 'status-message', - errorExists: pod => { - return pod.status?.message !== undefined; - }, - messageAccessor: pod => { - return [pod.status?.message ?? '']; + detectErrors: pod => { + return podToContainerSpecsAndStatuses(pod) + .filter(isPodReadinessProbeUnready) + .map(cs => ({ + type: 'readiness-probe-taking-too-long', + message: `The container ${cs.container.name} failed to start properly, but is not crashing`, + severity: 4, + proposedFix: [], // TODO next PR + sourceRef: { + name: pod.metadata?.name ?? 'unknown pod', + namespace: pod.metadata?.namespace ?? 'unknown namespace', + kind: 'Pod', + apiGroup: 'v1', + }, + occuranceCount: 1, + })); }, }, { - severity: 4, - errorExplanation: 'containers-restarting', - errorExists: pod => { - // TODO magic number - return totalRestarts(pod) > 3; - }, - messageAccessor: pod => { - return (pod.status?.containerStatuses ?? []) - .filter(cs => cs.restartCount > 0) - .map(cs => `container=${cs.name} restarted ${cs.restartCount} times`); - }, - }, - { - severity: 5, - errorExplanation: 'condition-message-present', - errorExists: pod => { - return (pod.status?.conditions ?? []).some(c => c.message !== undefined); - }, - messageAccessor: pod => { - return (pod.status?.conditions ?? []) - .filter(c => c.message !== undefined) - .map(c => c.message ?? ''); - }, - }, - { - severity: 6, - errorExplanation: 'container-waiting', - errorExists: pod => { - return (pod.status?.containerStatuses ?? []).some( - cs => cs.state?.waiting?.message !== undefined, - ); - }, - messageAccessor: pod => { + detectErrors: pod => { return (pod.status?.containerStatuses ?? []) .filter(cs => cs.state?.waiting?.message !== undefined) - .map(cs => cs.state?.waiting?.message ?? ''); + .map(cs => ({ + type: 'container-waiting', + message: cs.state?.waiting?.message ?? 'container waiting', + severity: 4, + proposedFix: [], // TODO next PR + sourceRef: { + name: pod.metadata?.name ?? 'unknown pod', + namespace: pod.metadata?.namespace ?? 'unknown namespace', + kind: 'Pod', + apiGroup: 'v1', + }, + occuranceCount: 1, + })); }, }, { - severity: 4, - errorExplanation: 'container-last-state-error', - errorExists: pod => { - return (pod.status?.containerStatuses ?? []).some( - cs => (cs.lastState?.terminated?.reason ?? '') === 'Error', - ); - }, - messageAccessor: pod => { + detectErrors: pod => { return (pod.status?.containerStatuses ?? []) - .filter(cs => (cs.lastState?.terminated?.reason ?? '') === 'Error') - .map( - cs => - `container=${cs.name} exited with error code (${cs.lastState?.terminated?.exitCode})`, - ); + .filter(cs => cs.restartCount > 0) + .map(cs => ({ + type: 'containers-restarting', + message: `container=${cs.name} restarted ${cs.restartCount} times`, + severity: 4, + proposedFix: [], // TODO next PR + sourceRef: { + name: pod.metadata?.name ?? 'unknown pod', + namespace: pod.metadata?.namespace ?? 'unknown namespace', + kind: 'Pod', + apiGroup: 'v1', + }, + occuranceCount: cs.restartCount, + })); }, }, ]; -export const detectErrorsInPods = ( - pods: V1Pod[], - clusterName: string, -): DetectedError[] => - detectErrorsInObjects(pods, 'Pod', clusterName, podErrorMappers); +export const detectErrorsInPods = (pods: Pod[]): DetectedError[] => + detectErrorsInObjects(pods, podErrorMappers); diff --git a/plugins/kubernetes/src/error-detection/types.ts b/plugins/kubernetes/src/error-detection/types.ts index 4bc7ae164d..3698d9bc68 100644 --- a/plugins/kubernetes/src/error-detection/types.ts +++ b/plugins/kubernetes/src/error-detection/types.ts @@ -14,13 +14,6 @@ * limitations under the License. */ -// Higher is more sever, but it's relative -import { - V1Deployment, - V1HorizontalPodAutoscaler, - V1Pod, -} from '@kubernetes/client-node'; - /** * Severity of the error, where 10 is critical and 0 is very low. * @@ -28,18 +21,6 @@ import { */ export type ErrorSeverity = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10; -export type ErrorDetectable = V1Pod | V1Deployment | V1HorizontalPodAutoscaler; - -/** - * Kubernetes kinds that errors might be reported by the plugin - * - * @public - */ -export type ErrorDetectableKind = - | 'Pod' - | 'Deployment' - | 'HorizontalPodAutoscaler'; - /** * A list of errors keyed by Cluster name * @@ -47,23 +28,51 @@ export type ErrorDetectableKind = */ export type DetectedErrorsByCluster = Map; +export interface ResourceRef { + name: string; + namespace: string; + kind: string; + apiGroup: string; +} + /** * Represents an error found on a Kubernetes object * * @public */ export interface DetectedError { + type: string; severity: ErrorSeverity; - cluster: string; - namespace: string; - kind: ErrorDetectableKind; - names: string[]; - message: string[]; + message: string; + proposedFix: ProposedFix[]; + sourceRef: ResourceRef; + occuranceCount: number; } -export interface ErrorMapper { - severity: ErrorSeverity; - errorExplanation: string; - errorExists: (object: T) => boolean; - messageAccessor: (object: T) => string[]; +type ProposedFix = LogSolution | DocsSolution | EventsSolution; + +interface ProposedFixBase { + errorType: string; + rootCauseExplanation: string; + possibleFixes: string[]; +} + +export interface LogSolution extends ProposedFixBase { + type: 'logs'; + container: string; +} + +export interface DocsSolution extends ProposedFixBase { + type: 'docs'; + docsLink: string; +} + +export interface EventsSolution extends ProposedFixBase { + type: 'events'; + docsLink: string; + podName: string; +} + +export interface ErrorMapper { + detectErrors: (resource: T) => DetectedError[]; } diff --git a/plugins/lighthouse-backend/CHANGELOG.md b/plugins/lighthouse-backend/CHANGELOG.md index 7320fc7b77..6dd9f1e1f3 100644 --- a/plugins/lighthouse-backend/CHANGELOG.md +++ b/plugins/lighthouse-backend/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-lighthouse-backend +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/lighthouse-backend/package.json b/plugins/lighthouse-backend/package.json index 523f3837f5..d46ffa506a 100644 --- a/plugins/lighthouse-backend/package.json +++ b/plugins/lighthouse-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-backend", "description": "Backend functionalities for lighthouse", - "version": "0.1.2-next.0", + "version": "0.1.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index e662f3d81d..2031e811b3 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-lighthouse +## 0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-lighthouse-common@0.1.1 + +## 0.4.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-lighthouse-common@0.1.1 + ## 0.4.2-next.0 ### Patch Changes diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index c46fcffe57..0765634940 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse", "description": "A Backstage plugin that integrates towards Lighthouse", - "version": "0.4.2-next.0", + "version": "0.4.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -47,6 +47,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -54,6 +55,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/linguist-backend/CHANGELOG.md b/plugins/linguist-backend/CHANGELOG.md index 5f38af055f..1a520139cd 100644 --- a/plugins/linguist-backend/CHANGELOG.md +++ b/plugins/linguist-backend/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-linguist-backend +## 0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-linguist-common@0.1.0 + +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-linguist-common@0.1.0 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json index d9f971d178..2456be9608 100644 --- a/plugins/linguist-backend/package.json +++ b/plugins/linguist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist-backend", - "version": "0.2.1-next.0", + "version": "0.2.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist/CHANGELOG.md b/plugins/linguist/CHANGELOG.md index 1670d80f97..d39be5a604 100644 --- a/plugins/linguist/CHANGELOG.md +++ b/plugins/linguist/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-linguist +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-linguist-common@0.1.0 + +## 0.1.2-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-linguist-common@0.1.0 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/linguist/package.json b/plugins/linguist/package.json index 0a36244b81..6ca88bffd1 100644 --- a/plugins/linguist/package.json +++ b/plugins/linguist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist", - "version": "0.1.2-next.0", + "version": "0.1.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,17 +43,21 @@ "slugify": "^1.6.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "*", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/microsoft-calendar/CHANGELOG.md b/plugins/microsoft-calendar/CHANGELOG.md index 1cb17d787b..983542af09 100644 --- a/plugins/microsoft-calendar/CHANGELOG.md +++ b/plugins/microsoft-calendar/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-microsoft-calendar +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.1.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/errors@1.1.5 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json index 8170c7847f..898dc383dc 100644 --- a/plugins/microsoft-calendar/package.json +++ b/plugins/microsoft-calendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-microsoft-calendar", - "version": "0.1.2-next.0", + "version": "0.1.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -57,17 +57,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index 81112322fb..482e78baab 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-newrelic-dashboard +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + +## 0.2.10-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.2.10-next.0 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index 8718cbfe70..e00bba36f2 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.2.10-next.0", + "version": "0.2.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,6 +32,11 @@ "@material-ui/lab": "4.0.0-alpha.61", "react-use": "^17.2.4" }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", @@ -41,8 +46,5 @@ }, "files": [ "dist" - ], - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" - } + ] } diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md index 60ccace53b..6542ab6d5f 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-newrelic +## 0.3.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## 0.3.35-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + ## 0.3.35-next.0 ### Patch Changes diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index 89823c559b..b3f8986757 100644 --- a/plugins/newrelic/package.json +++ b/plugins/newrelic/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-newrelic", "description": "A Backstage plugin that integrates towards New Relic", - "version": "0.3.35-next.0", + "version": "0.3.35-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,17 +42,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/octopus-deploy/CHANGELOG.md b/plugins/octopus-deploy/CHANGELOG.md index 8b39119ce2..db1bb22834 100644 --- a/plugins/octopus-deploy/CHANGELOG.md +++ b/plugins/octopus-deploy/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-octopus-deploy +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.1.1-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json index ce36c80678..f1f01c1f3e 100644 --- a/plugins/octopus-deploy/package.json +++ b/plugins/octopus-deploy/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-octopus-deploy", - "version": "0.1.1-next.0", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,17 +33,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "*", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index cdb4ef0b9e..87ec76c66b 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-org-react +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.1.6-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 6b48a9c381..631286f575 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.6-next.0", + "version": "0.1.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,17 +42,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "*", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index d4db2bcc61..a3518388d6 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-org +## 0.6.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.6.7-next.1 + +### Patch Changes + +- d7c8d8c52dd: Allow the title of the group profile card to use the title of the entity, if it is set. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.6.7-next.0 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 43a102e1dd..7627b3955d 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.6.7-next.0", + "version": "0.6.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,6 +43,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -51,10 +52,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md index 583e29ebe3..bc956de572 100644 --- a/plugins/pagerduty/CHANGELOG.md +++ b/plugins/pagerduty/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-pagerduty +## 0.5.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.5.10-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.5.10-next.0 ### Patch Changes diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index fdb8e566fc..44cc77a7c1 100644 --- a/plugins/pagerduty/package.json +++ b/plugins/pagerduty/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-pagerduty", "description": "A Backstage plugin that integrates towards PagerDuty", - "version": "0.5.10-next.0", + "version": "0.5.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,13 +42,14 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "classnames": "^2.2.6", "luxon": "^3.0.0", "react-use": "^17.2.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -56,6 +57,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index ef3d7e9d64..260f57eb6a 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-periskop-backend +## 0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + +## 0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + ## 0.1.15-next.0 ### Patch Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index fca2c142a3..83e97b0234 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop-backend", - "version": "0.1.15-next.0", + "version": "0.1.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md index 6e3a7a08f3..ab8028538f 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-periskop +## 0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.1.15-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.1.15-next.0 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 76fe8604ad..38300e4b21 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.15-next.0", + "version": "0.1.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,18 +37,21 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", - "react-dom": "^16.13.1 || ^17.0.0" + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/luxon": "^3.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 46b162f2fd..3e65f628a5 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-permission-backend +## 0.5.19-next.2 + +### Patch Changes + +- 84946a580c4: Introduced alpha export of the `permissionPlugin` for use in the new backend system, along with a `permissionModuleAllowAllPolicy` that can be used to allow all requests. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## 0.5.19-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + ## 0.5.19-next.0 ### Patch Changes diff --git a/plugins/permission-backend/alpha-api-report.md b/plugins/permission-backend/alpha-api-report.md new file mode 100644 index 0000000000..926691930b --- /dev/null +++ b/plugins/permission-backend/alpha-api-report.md @@ -0,0 +1,15 @@ +## API Report File for "@backstage/plugin-permission-backend" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; + +// @alpha +export const permissionModuleAllowAllPolicy: () => BackendFeature; + +// @alpha +export const permissionPlugin: () => BackendFeature; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 88e58cc531..23394e4aa4 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.19-next.0", + "version": "0.5.19-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -9,6 +9,21 @@ "main": "dist/index.cjs.js", "types": "dist/index.d.ts" }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, "backstage": { "role": "backend-plugin" }, @@ -23,6 +38,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", diff --git a/plugins/permission-backend/src/alpha.ts b/plugins/permission-backend/src/alpha.ts new file mode 100644 index 0000000000..f6a2bb4f09 --- /dev/null +++ b/plugins/permission-backend/src/alpha.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { permissionPlugin, permissionModuleAllowAllPolicy } from './plugin'; diff --git a/plugins/permission-backend/src/plugin.ts b/plugins/permission-backend/src/plugin.ts new file mode 100644 index 0000000000..5c0a9a87a0 --- /dev/null +++ b/plugins/permission-backend/src/plugin.ts @@ -0,0 +1,118 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { + coreServices, + createBackendModule, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { BackstageIdentityResponse } from '@backstage/plugin-auth-node'; +import { + AuthorizeResult, + PolicyDecision, +} from '@backstage/plugin-permission-common'; +import { + PermissionPolicy, + PolicyQuery, +} from '@backstage/plugin-permission-node'; +import { + policyExtensionPoint, + PolicyExtensionPoint, +} from '@backstage/plugin-permission-node/alpha'; +import { createRouter } from './service'; + +class PolicyExtensionPointImpl implements PolicyExtensionPoint { + public policy: PermissionPolicy | undefined; + + setPolicy(policy: PermissionPolicy): void { + if (this.policy) { + throw new Error('Policy already set'); + } + this.policy = policy; + } +} + +/** + * A permission policy module that allows all requests. + * + * @alpha + */ +export const permissionModuleAllowAllPolicy = createBackendModule({ + moduleId: 'allowAllPolicy', + pluginId: 'permission', + register(reg) { + class AllowAllPermissionPolicy implements PermissionPolicy { + async handle( + _request: PolicyQuery, + _user?: BackstageIdentityResponse, + ): Promise { + return { + result: AuthorizeResult.ALLOW, + }; + } + } + + reg.registerInit({ + deps: { policy: policyExtensionPoint }, + async init({ policy }) { + policy.setPolicy(new AllowAllPermissionPolicy()); + }, + }); + }, +}); + +/** + * Permission plugin + * + * @alpha + */ +export const permissionPlugin = createBackendPlugin(() => ({ + pluginId: 'permission', + register(env) { + const policies = new PolicyExtensionPointImpl(); + + env.registerExtensionPoint(policyExtensionPoint, policies); + + env.registerInit({ + deps: { + http: coreServices.httpRouter, + config: coreServices.config, + logger: coreServices.logger, + discovery: coreServices.discovery, + identity: coreServices.identity, + }, + async init({ http, config, logger, discovery, identity }) { + const winstonLogger = loggerToWinstonLogger(logger); + if (!policies.policy) { + throw new Error( + 'No policy module installed! Please install a policy module. If you want to allow all requests, use permissionModuleAllowAllPolicy', + ); + } + + http.use( + await createRouter({ + config, + discovery, + identity, + logger: winstonLogger, + policy: policies.policy, + }), + ); + }, + }); + }, +})); diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md index be9d35ef6a..a0cff870ff 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-common +## 0.7.5-next.0 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + ## 0.7.4 ### Patch Changes diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index 8b8a6f60c0..74d56618b8 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-common", "description": "Isomorphic types and client for Backstage permissions and authorization", - "version": "0.7.4", + "version": "0.7.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 3bd2cf06c4..654283d4e7 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-permission-node +## 0.7.7-next.2 + +### Patch Changes + +- 788f0f5a152: Introduced alpha export of the `policyExtensionPoint` for use in the new backend system. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## 0.7.7-next.1 + +### Patch Changes + +- 71fd0966d10: Added createConditionAuthorizer utility function, which takes some permission conditions and returns a function that returns a definitive authorization result given a decision and a resource. +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + ## 0.7.7-next.0 ### Patch Changes diff --git a/plugins/permission-node/alpha-api-report.md b/plugins/permission-node/alpha-api-report.md new file mode 100644 index 0000000000..1be8e77035 --- /dev/null +++ b/plugins/permission-node/alpha-api-report.md @@ -0,0 +1,18 @@ +## API Report File for "@backstage/plugin-permission-node" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ExtensionPoint } from '@backstage/backend-plugin-api'; +import { PermissionPolicy } from '@backstage/plugin-permission-node'; + +// @alpha +export type PolicyExtensionPoint = { + setPolicy(policy: PermissionPolicy): void; +}; + +// @alpha +export const policyExtensionPoint: ExtensionPoint; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/permission-node/api-report.md b/plugins/permission-node/api-report.md index b3d06efdc7..9d49fd3d01 100644 --- a/plugins/permission-node/api-report.md +++ b/plugins/permission-node/api-report.md @@ -75,17 +75,14 @@ export type ConditionTransformer = ( // @public export const createConditionAuthorizer: ( - rules: PermissionRule[], + rules: PermissionRule[], ) => (decision: PolicyDecision, resource: TResource | undefined) => boolean; // @public export const createConditionExports: < TResourceType extends string, TResource, - TRules extends Record< - string, - PermissionRule - >, + TRules extends Record>, >(options: { pluginId: string; resourceType: TResourceType; @@ -94,9 +91,7 @@ export const createConditionExports: < conditions: Conditions; createConditionalDecision: ( permission: ResourcePermission, - conditions: PermissionCriteria< - PermissionCondition - >, + conditions: PermissionCriteria>, ) => ConditionalPolicyDecision; }; @@ -111,7 +106,7 @@ export const createConditionFactory: < // @public export const createConditionTransformer: < TQuery, - TRules extends PermissionRule[], + TRules extends PermissionRule[], >( permissionRules: [...TRules], ) => ConditionTransformer; diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 23c24fe3cc..d7170c86a9 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.7.7-next.0", + "version": "0.7.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,6 +10,21 @@ "main": "dist/index.cjs.js", "types": "dist/index.d.ts" }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, "backstage": { "role": "node-library" }, @@ -34,6 +49,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", diff --git a/plugins/permission-node/src/alpha.ts b/plugins/permission-node/src/alpha.ts new file mode 100644 index 0000000000..1031dc4fe9 --- /dev/null +++ b/plugins/permission-node/src/alpha.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { type PolicyExtensionPoint, policyExtensionPoint } from './plugin'; diff --git a/plugins/permission-node/src/plugin.ts b/plugins/permission-node/src/plugin.ts new file mode 100644 index 0000000000..646223a3ee --- /dev/null +++ b/plugins/permission-node/src/plugin.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { PermissionPolicy } from '@backstage/plugin-permission-node'; + +/** + * Allows supplying policies to the permissions backend + * + * @alpha + */ +export type PolicyExtensionPoint = { + setPolicy(policy: PermissionPolicy): void; +}; + +/** + * Allows supplying policies to the permissions backend + * + * @alpha + */ +export const policyExtensionPoint = createExtensionPoint({ + id: 'permission.policy', +}); diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index 9da20a2875..8edff27f2b 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-permission-react +## 0.4.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## 0.4.12-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/config@1.0.7 + ## 0.4.11 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index afa4a4768e..3a8cf8950a 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-react", - "version": "0.4.11", + "version": "0.4.12-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,13 +34,14 @@ "@backstage/config": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "react-use": "^17.2.4", "swr": "^2.0.0" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index 51e419f0fb..8172d8b132 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-playlist-backend +## 0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-playlist-common@0.1.6-next.0 + +## 0.2.7-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-playlist-common@0.1.6-next.0 + ## 0.2.7-next.0 ### Patch Changes diff --git a/plugins/playlist-backend/api-report.md b/plugins/playlist-backend/api-report.md index 6b51f316c4..b755347205 100644 --- a/plugins/playlist-backend/api-report.md +++ b/plugins/playlist-backend/api-report.md @@ -15,7 +15,6 @@ import { PermissionCriteria } from '@backstage/plugin-permission-common'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; import { PermissionPolicy } from '@backstage/plugin-permission-node'; import { PermissionRule } from '@backstage/plugin-permission-node'; -import { PermissionRuleParams } from '@backstage/plugin-permission-common'; import { PlaylistMetadata } from '@backstage/plugin-playlist-common'; import { PluginDatabaseManager } from '@backstage/backend-common'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; @@ -26,9 +25,7 @@ import { ResourcePermission } from '@backstage/plugin-permission-common'; // @public (undocumented) export const createPlaylistConditionalDecision: ( permission: ResourcePermission<'playlist-list'>, - conditions: PermissionCriteria< - PermissionCondition<'playlist-list', PermissionRuleParams> - >, + conditions: PermissionCriteria>, ) => ConditionalPolicyDecision; // @public (undocumented) diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 054651b841..7aee62b158 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.2.7-next.0", + "version": "0.2.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-common/CHANGELOG.md b/plugins/playlist-common/CHANGELOG.md index 15eebfc59b..d48bc62216 100644 --- a/plugins/playlist-common/CHANGELOG.md +++ b/plugins/playlist-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-playlist-common +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + ## 0.1.5 ### Patch Changes diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json index 440e46713d..0ee4a48acf 100644 --- a/plugins/playlist-common/package.json +++ b/plugins/playlist-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-playlist-common", "description": "Common functionalities for the playlist plugin", - "version": "0.1.5", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md index 6e09f280bd..a4230877b3 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-playlist +## 0.1.8-next.2 + +### Patch Changes + +- 1b3c0546047: Added config properties to change dynamically the group noun for all the components in the UI +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-permission-react@0.4.12-next.1 + - @backstage/plugin-playlist-common@0.1.6-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## 0.1.8-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-playlist-common@0.1.6-next.0 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/playlist/README.md b/plugins/playlist/README.md index 6ae3fb84ac..e35f94b9e5 100644 --- a/plugins/playlist/README.md +++ b/plugins/playlist/README.md @@ -131,6 +131,15 @@ const defaultEntityPage = ( Note: the above only shows an example for the `defaultEntityPage` for a full example of this you can look at [this EntityPage](../../packages/app/src/components/catalog/EntityPage.tsx) +## Custom Title + +You can define a custom title to be shown in all the components of this plugin to replace the default term "playlist" in the UI. To do this you just need to add some config in your **app-config.yaml**, here's an example: + +```yaml +playlist: + title: Collection +``` + ## Features ### View All Playlists diff --git a/plugins/playlist/config.d.ts b/plugins/playlist/config.d.ts new file mode 100644 index 0000000000..d949cfe73a --- /dev/null +++ b/plugins/playlist/config.d.ts @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface Config { + playlist?: { + /** + * (Optional) The title that will shown in the UI; Defaults to`Playlist` if undefined. + * @visibility frontend + */ + title?: string | undefined; + }; +} diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index 4bf202bdba..dafdde48d5 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.8-next.0", + "version": "0.1.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -42,12 +42,14 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "lodash": "^4.17.21", + "pluralize": "^8.0.0", "qs": "^6.9.4", "react-hook-form": "^7.13.0", "react-use": "^17.2.4" }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -55,16 +57,20 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "^14.0.0", "@types/node": "*", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0", "swr": "^2.0.0" }, "files": [ - "dist" - ] + "dist", + "config.d.ts" + ], + "configSchema": "config.d.ts" } diff --git a/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.tsx b/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.tsx index c064f28591..7669a48c26 100644 --- a/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.tsx +++ b/plugins/playlist/src/components/CreatePlaylistButton/CreatePlaylistButton.tsx @@ -29,6 +29,7 @@ import { useNavigate } from 'react-router-dom'; import { playlistApiRef } from '../../api'; import { playlistRouteRef } from '../../routes'; import { PlaylistEditDialog } from '../PlaylistEditDialog'; +import { useTitle } from '../../hooks'; export const CreatePlaylistButton = () => { const navigate = useNavigate(); @@ -55,13 +56,18 @@ export const CreatePlaylistButton = () => { [errorApi, navigate, playlistApi, playlistRoute], ); + const singularTitle = useTitle({ + pluralize: false, + lowerCase: false, + }); + return ( <> {isXSScreen ? ( setOpenDialog(true)} > @@ -74,7 +80,7 @@ export const CreatePlaylistButton = () => { color="primary" onClick={() => setOpenDialog(true)} > - Create Playlist + Create {singularTitle} )} { [playlistApi], ); + const singularTitle = useTitle({ + pluralize: true, + lowerCase: false, + }); + const singularTitleLowerCase = useTitle({ + pluralize: false, + lowerCase: true, + }); + const pluralTitleLowerCase = useTitle({ + pluralize: true, + lowerCase: true, + }); + useEffect(() => { if (open) { loadPlaylists(); @@ -120,12 +134,19 @@ export const EntityPlaylistDialog = (props: EntityPlaylistDialogProps) => { navigate(playlistRoute({ playlistId })); } catch (e) { alertApi.post({ - message: `Failed to add entity to playlist: ${e}`, + message: `Failed to add entity to ${singularTitleLowerCase}: ${e}`, severity: 'error', }); } }, - [alertApi, entity, navigate, playlistApi, playlistRoute], + [ + alertApi, + entity, + navigate, + playlistApi, + playlistRoute, + singularTitleLowerCase, + ], ); const [{ loading: addEntityLoading }, addToPlaylist] = useAsyncFn( @@ -141,12 +162,12 @@ export const EntityPlaylistDialog = (props: EntityPlaylistDialogProps) => { }); } catch (e) { alertApi.post({ - message: `Failed to add entity to playlist: ${e}`, + message: `Failed to add entity to ${singularTitleLowerCase}: ${e}`, severity: 'error', }); } }, - [alertApi, closeDialog, entity, playlistApi], + [alertApi, closeDialog, entity, playlistApi, singularTitleLowerCase], ); return ( @@ -160,7 +181,7 @@ export const EntityPlaylistDialog = (props: EntityPlaylistDialogProps) => { > {(loading || addEntityLoading) && } - Add to Playlist + Add to {singularTitle} { {error && ( - + )} {playlists && entity && ( @@ -205,7 +229,9 @@ export const EntityPlaylistDialog = (props: EntityPlaylistDialogProps) => { - + )} {playlists diff --git a/plugins/playlist/src/components/PlaylistEditDialog/PlaylistEditDialog.tsx b/plugins/playlist/src/components/PlaylistEditDialog/PlaylistEditDialog.tsx index 27cc13fede..a213c7c51c 100644 --- a/plugins/playlist/src/components/PlaylistEditDialog/PlaylistEditDialog.tsx +++ b/plugins/playlist/src/components/PlaylistEditDialog/PlaylistEditDialog.tsx @@ -39,6 +39,7 @@ import React from 'react'; import { useForm, Controller } from 'react-hook-form'; import useAsync from 'react-use/lib/useAsync'; import useAsyncFn from 'react-use/lib/useAsyncFn'; +import { useTitle } from '../../hooks'; const useStyles = makeStyles({ buttonWrapper: { @@ -105,6 +106,11 @@ export const PlaylistEditDialog = ({ } }; + const titleSingularLowerCase = useTitle({ + pluralize: false, + lowerCase: false, + }); + return ( @@ -121,7 +127,7 @@ export const PlaylistEditDialog = ({ fullWidth label="Name" margin="dense" - placeholder="Give your playlist name" + placeholder={`Give your ${titleSingularLowerCase} a name`} required type="text" /> @@ -139,7 +145,7 @@ export const PlaylistEditDialog = ({ label="Description" margin="dense" multiline - placeholder="Describe your playlist" + placeholder={`Describe your ${titleSingularLowerCase}`} type="text" /> )} diff --git a/plugins/playlist/src/components/PlaylistIndexPage/PlaylistIndexPage.tsx b/plugins/playlist/src/components/PlaylistIndexPage/PlaylistIndexPage.tsx index 0ee829018a..f25df19ee7 100644 --- a/plugins/playlist/src/components/PlaylistIndexPage/PlaylistIndexPage.tsx +++ b/plugins/playlist/src/components/PlaylistIndexPage/PlaylistIndexPage.tsx @@ -23,7 +23,7 @@ import { } from '@backstage/core-components'; import { CatalogFilterLayout } from '@backstage/plugin-catalog-react'; -import { PlaylistListProvider } from '../../hooks'; +import { PlaylistListProvider, useTitle } from '../../hooks'; import { CreatePlaylistButton } from '../CreatePlaylistButton'; import { PersonalListPicker } from '../PersonalListPicker'; import { PlaylistList } from '../PlaylistList'; @@ -31,26 +31,33 @@ import { PlaylistOwnerPicker } from '../PlaylistOwnerPicker'; import { PlaylistSearchBar } from '../PlaylistSearchBar'; import { PlaylistSortPicker } from '../PlaylistSortPicker'; -export const PlaylistIndexPage = () => ( - - - - - - - - - - - - - - - - - - - - - -); +export const PlaylistIndexPage = () => { + const pluralTitle = useTitle({ + pluralize: true, + lowerCase: false, + }); + + return ( + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/plugins/playlist/src/components/PlaylistList/PlaylistList.test.tsx b/plugins/playlist/src/components/PlaylistList/PlaylistList.test.tsx index 27030ec1c7..976db99983 100644 --- a/plugins/playlist/src/components/PlaylistList/PlaylistList.test.tsx +++ b/plugins/playlist/src/components/PlaylistList/PlaylistList.test.tsx @@ -14,13 +14,19 @@ * limitations under the License. */ +import { ConfigApi, configApiRef } from '@backstage/core-plugin-api'; import { Playlist } from '@backstage/plugin-playlist-common'; +import { TestApiProvider } from '@backstage/test-utils'; import { render } from '@testing-library/react'; import React from 'react'; import { MockPlaylistListProvider } from '../../testUtils'; import { PlaylistList } from './PlaylistList'; +const mockConfigApi = { + getOptionalString: () => undefined, +} as Partial; + jest.mock('../PlaylistCard', () => ({ PlaylistCard: ({ playlist }: { playlist: Playlist }) => (
{playlist.name}
@@ -30,9 +36,11 @@ jest.mock('../PlaylistCard', () => ({ describe('', () => { it('renders error on error', () => { const rendered = render( - - - , + + + + + , ); expect(rendered.getByText('Test Error')).toBeInTheDocument(); @@ -40,9 +48,11 @@ describe('', () => { it('handles no playlists', () => { const rendered = render( - - - , + + + + + , ); expect( @@ -52,32 +62,34 @@ describe('', () => { it('renders playlists', () => { const rendered = render( - - - , + + + + + , ); expect(rendered.getByText('playlist-1')).toBeInTheDocument(); diff --git a/plugins/playlist/src/components/PlaylistList/PlaylistList.tsx b/plugins/playlist/src/components/PlaylistList/PlaylistList.tsx index fcc3971542..2f815f07c6 100644 --- a/plugins/playlist/src/components/PlaylistList/PlaylistList.tsx +++ b/plugins/playlist/src/components/PlaylistList/PlaylistList.tsx @@ -23,18 +23,24 @@ import { } from '@backstage/core-components'; import { Typography } from '@material-ui/core'; -import { usePlaylistList } from '../../hooks'; +import { useTitle, usePlaylistList } from '../../hooks'; import { PlaylistCard } from '../PlaylistCard'; export const PlaylistList = () => { const { loading, error, playlists } = usePlaylistList(); + const pluralTitleLowerCase = useTitle({ + pluralize: true, + lowerCase: true, + }); return ( <> {loading && } {error && ( - + {error.message} )} diff --git a/plugins/playlist/src/components/PlaylistPage/PlaylistEntitiesTable.tsx b/plugins/playlist/src/components/PlaylistPage/PlaylistEntitiesTable.tsx index f499f59a61..3d8efe3bc5 100644 --- a/plugins/playlist/src/components/PlaylistPage/PlaylistEntitiesTable.tsx +++ b/plugins/playlist/src/components/PlaylistPage/PlaylistEntitiesTable.tsx @@ -32,6 +32,7 @@ import React, { forwardRef, useCallback, useEffect, useState } from 'react'; import useAsyncFn from 'react-use/lib/useAsyncFn'; import { playlistApiRef } from '../../api'; +import { useTitle } from '../../hooks'; import { AddEntitiesDrawer } from './AddEntitiesDrawer'; export const PlaylistEntitiesTable = ({ @@ -84,16 +85,21 @@ export const PlaylistEntitiesTable = ({ [errorApi, loadEntities, playlistApi, playlistId], ); + const singularTitleLowerCase = useTitle({ + pluralize: false, + lowerCase: true, + }); + const actions = editAllowed ? [ { icon: DeleteIcon, - tooltip: 'Remove from playlist', + tooltip: `Remove from ${singularTitleLowerCase}`, onClick: removeEntity, }, { icon: AddBoxIcon, - tooltip: 'Add entities to playlist', + tooltip: `Add entities to ${singularTitleLowerCase}`, isFreeAction: true, onClick: () => setOpenAddEntitiesDrawer(true), }, diff --git a/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.tsx b/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.tsx index 7f4457062d..621f94f75c 100644 --- a/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.tsx +++ b/plugins/playlist/src/components/PlaylistPage/PlaylistHeader.tsx @@ -45,6 +45,7 @@ import useAsyncFn from 'react-use/lib/useAsyncFn'; import { playlistApiRef } from '../../api'; import { rootRouteRef } from '../../routes'; import { PlaylistEditDialog } from '../PlaylistEditDialog'; +import { useTitle } from '../../hooks'; const useStyles = makeStyles({ buttonWrapper: { @@ -109,6 +110,11 @@ export const PlaylistHeader = ({ playlist, onUpdate }: PlaylistHeaderProps) => { } }, [playlistApi]); + const singularTitle = useTitle({ + pluralize: false, + lowerCase: false, + }); + return (
{ onClick: () => setOpenEditDialog(true), }, { - label: 'Delete Playlist', + label: `Delete ${singularTitle}`, icon: , disabled: !deleteAllowed, onClick: () => setOpenDeleteDialog(true), diff --git a/plugins/playlist/src/hooks/index.ts b/plugins/playlist/src/hooks/index.ts index 316121b515..bb164d961c 100644 --- a/plugins/playlist/src/hooks/index.ts +++ b/plugins/playlist/src/hooks/index.ts @@ -15,3 +15,4 @@ */ export * from './usePlaylistList'; +export * from './useTitle'; diff --git a/plugins/playlist/src/hooks/usePlaylistList.tsx b/plugins/playlist/src/hooks/usePlaylistList.tsx index 69f712413b..b20f82bb5c 100644 --- a/plugins/playlist/src/hooks/usePlaylistList.tsx +++ b/plugins/playlist/src/hooks/usePlaylistList.tsx @@ -172,8 +172,9 @@ export const PlaylistListProvider = < const queryParams = Object.keys(requestedFilters).reduce( (params, key) => { - const filter: PlaylistFilter | undefined = - requestedFilters[key as keyof PlaylistFilters]; + const filter = requestedFilters[key as keyof PlaylistFilters] as + | PlaylistFilter + | undefined; if (filter?.toQueryValue) { params[key] = filter.toQueryValue(); } diff --git a/plugins/playlist/src/hooks/useTitle.ts b/plugins/playlist/src/hooks/useTitle.ts new file mode 100644 index 0000000000..5f46e027d7 --- /dev/null +++ b/plugins/playlist/src/hooks/useTitle.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { configApiRef, useApi } from '@backstage/core-plugin-api'; +import pluralize from 'pluralize'; + +interface UseTitleOptions { + pluralize?: boolean; + lowerCase?: boolean; +} + +export function useTitle(opts: UseTitleOptions) { + const configApi = useApi(configApiRef); + let title = configApi.getOptionalString('playlist.title') ?? 'Playlist'; + + if (opts.pluralize) { + title = pluralize(title); + } + + return opts.lowerCase ? title.toLocaleLowerCase('en-US') : title; +} diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 58d68eceab..fabcaf7be7 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-proxy-backend +## 0.2.38-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + +## 0.2.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + ## 0.2.38-next.0 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 11caccbff3..a2378efce4 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.2.38-next.0", + "version": "0.2.38-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index f7f91fea98..896d1c6116 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-rollbar-backend +## 0.1.41-next.2 + +### Patch Changes + +- 66b6cfc5716: Replace `camelcase-keys` dependency with one with better compatibility. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + +## 0.1.41-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + ## 0.1.41-next.0 ### Patch Changes diff --git a/plugins/rollbar-backend/api-report.md b/plugins/rollbar-backend/api-report.md index 58a5fb0252..72499fbe58 100644 --- a/plugins/rollbar-backend/api-report.md +++ b/plugins/rollbar-backend/api-report.md @@ -27,21 +27,9 @@ export class RollbarApi { environment: string; item_id?: number; }, - ): Promise< - { - count: number; - timestamp: number; - }[] - >; + ): Promise; // (undocumented) - getAllProjects(): Promise< - { - id: number; - name: string; - status: string; - accountId: number; - }[] - >; + getAllProjects(): Promise; // (undocumented) getOccuranceCounts( projectName: string, @@ -49,25 +37,11 @@ export class RollbarApi { environment: string; item_id?: number; }, - ): Promise< - { - count: number; - timestamp: number; - }[] - >; + ): Promise; // (undocumented) - getProject(projectName: string): Promise<{ - id: number; - name: string; - status: string; - accountId: number; - }>; + getProject(projectName: string): Promise; // (undocumented) - getProjectItems(projectName: string): Promise<{ - page: number; - items: RollbarItem[]; - totalCount: number; - }>; + getProjectItems(projectName: string): Promise; // (undocumented) getTopActiveItems( projectName: string, @@ -75,23 +49,7 @@ export class RollbarApi { hours: number; environment: string; }, - ): Promise< - { - item: { - id: number; - counter: number; - environment: string; - framework: RollbarFrameworkId; - lastOccurrenceTimestamp: number; - level: number; - occurrences: number; - projectId: number; - title: string; - uniqueOccurrences: number; - }; - counts: number[]; - }[] - >; + ): Promise; } // @public (undocumented) diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index bec3819121..e400d33ba9 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar-backend", "description": "A Backstage backend plugin that integrates towards Rollbar", - "version": "0.1.41-next.0", + "version": "0.1.41-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,7 +36,6 @@ "@backstage/backend-common": "workspace:^", "@backstage/config": "workspace:^", "@types/express": "^4.17.6", - "camelcase-keys": "^7.0.1", "compression": "^1.7.4", "cors": "^2.8.5", "express": "^4.17.1", diff --git a/plugins/rollbar-backend/src/api/RollbarApi.test.ts b/plugins/rollbar-backend/src/api/RollbarApi.test.ts index 430fc205c9..25bd931af6 100644 --- a/plugins/rollbar-backend/src/api/RollbarApi.test.ts +++ b/plugins/rollbar-backend/src/api/RollbarApi.test.ts @@ -19,7 +19,6 @@ import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { getVoidLogger } from '@backstage/backend-common'; -import { RollbarProject } from './types'; describe('RollbarApi', () => { describe('getRequestHeaders', () => { @@ -38,9 +37,15 @@ describe('RollbarApi', () => { const mockBaseUrl = 'https://api.rollbar.com/api/1'; - const mockProjects: RollbarProject[] = [ - { id: 123, name: 'abc', accountId: 1, status: 'enabled' }, - { id: 456, name: 'xyz', accountId: 1, status: 'enabled' }, + const mockProjects = [ + { id: 123, name: 'abc', account_id: 1, status: 'enabled' }, + { + id: 456, + name: 'xyz', + account_id: 1, + status: 'enabled', + extra_nested: { nested_value: [{ value_here: 'hello_world' }] }, + }, ]; const setupHandlers = () => { @@ -55,7 +60,16 @@ describe('RollbarApi', () => { setupHandlers(); const api = new RollbarApi('my-access-token', getVoidLogger()); const projects = await api.getAllProjects(); - expect(projects).toEqual(mockProjects); + expect(projects).toEqual([ + { id: 123, name: 'abc', accountId: 1, status: 'enabled' }, + { + id: 456, + name: 'xyz', + accountId: 1, + status: 'enabled', + extraNested: { nestedValue: [{ valueHere: 'hello_world' }] }, + }, + ]); }); }); }); diff --git a/plugins/rollbar-backend/src/api/RollbarApi.ts b/plugins/rollbar-backend/src/api/RollbarApi.ts index 59394d7ad0..98dbc19119 100644 --- a/plugins/rollbar-backend/src/api/RollbarApi.ts +++ b/plugins/rollbar-backend/src/api/RollbarApi.ts @@ -15,7 +15,7 @@ */ import { Logger } from 'winston'; -import camelcaseKeys from 'camelcase-keys'; +import { camelCase } from 'lodash'; import { buildQuery } from '../util'; import { RollbarItemCount, @@ -30,6 +30,18 @@ const baseUrl = 'https://api.rollbar.com/api/1'; const buildUrl = (url: string) => `${baseUrl}${url}`; +function camelize(val: T): T { + if (Array.isArray(val)) { + return val.map(camelize) as T; + } + if (val && typeof val === 'object') { + return Object.fromEntries( + Object.entries(val).map(([k, v]) => [camelCase(k), camelize(v)]), + ) as T; + } + return val; +} + /** @public */ export class RollbarApi { private projectMap: ProjectMetadataMap | undefined; @@ -104,22 +116,25 @@ export class RollbarApi { ); } - private async get(url: string, accessToken?: string) { + private async get( + url: string, + accessToken?: string, + ): Promise { const fullUrl = buildUrl(url); if (this.logger) { this.logger.info(`Calling Rollbar REST API, ${fullUrl}`); } - return fetch( + const res = await fetch( fullUrl, getRequestHeaders(accessToken || this.accessToken || ''), - ) - .then(response => response.json()) - .then(json => camelcaseKeys(json?.result, { deep: true })); + ); + const data = await res.json(); + return camelize(data?.result) as T; } - private async getForProject( + private async getForProject( url: string, projectName: string, useProjectToken = true, diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md index 24e85c8e77..2439b71ef1 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-rollbar +## 0.4.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.4.17-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.4.17-next.0 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index 4abd1b90f2..f34ba7061d 100644 --- a/plugins/rollbar/package.json +++ b/plugins/rollbar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar", "description": "A Backstage plugin that integrates towards Rollbar", - "version": "0.4.17-next.0", + "version": "0.4.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -47,6 +47,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -54,6 +55,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md new file mode 100644 index 0000000000..3773e85e3e --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -0,0 +1,32 @@ +# @backstage/plugin-scaffolder-backend-module-confluence-to-markdown + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + +## 0.1.0-next.0 + +### Minor Changes + +- 1b49a18bf8d: Created `confluence:transform:markdown` action for converting confluence docs to Markdown. + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md b/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md index 398beb5059..70428f118c 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/api-report.md @@ -4,6 +4,7 @@ ```ts import { Config } from '@backstage/config'; +import { JsonObject } from '@backstage/types'; import { ScmIntegrations } from '@backstage/integration'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { UrlReader } from '@backstage/backend-common'; @@ -13,8 +14,11 @@ export const createConfluenceToMarkdownAction: (options: { reader: UrlReader; integrations: ScmIntegrations; config: Config; -}) => TemplateAction<{ - confluenceUrls: string[]; - repoUrl: string; -}>; +}) => TemplateAction< + { + confluenceUrls: string[]; + repoUrl: string; + }, + JsonObject +>; ``` diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 7ad5f127f6..410bdff252 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", - "version": "0.0.0", + "version": "0.1.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,8 +38,8 @@ "yaml": "^2.0.0" }, "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", - "@backstage/test-utils": "workspace:^", "mock-fs": "^5.2.0", "msw": "^1.0.0" }, diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts index b95d8ae520..67f98d5fea 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts @@ -19,7 +19,7 @@ import { getVoidLogger } from '@backstage/backend-common'; import { UrlReader } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; -import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import mockFs from 'mock-fs'; import os from 'os'; import type { ActionContext } from '@backstage/plugin-scaffolder-node'; diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index b03b35dc72..004e416337 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + +## 0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + ## 0.2.19-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/api-report.md b/plugins/scaffolder-backend-module-cookiecutter/api-report.md index 2944f5240e..927d4b4c55 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/api-report.md +++ b/plugins/scaffolder-backend-module-cookiecutter/api-report.md @@ -16,12 +16,15 @@ export function createFetchCookiecutterAction(options: { reader: UrlReader; integrations: ScmIntegrations; containerRunner?: ContainerRunner; -}): TemplateAction<{ - url: string; - targetPath?: string | undefined; - values: JsonObject; - copyWithoutRender?: string[] | undefined; - extensions?: string[] | undefined; - imageName?: string | undefined; -}>; +}): TemplateAction< + { + url: string; + targetPath?: string | undefined; + values: JsonObject; + copyWithoutRender?: string[] | undefined; + extensions?: string[] | undefined; + imageName?: string | undefined; + }, + JsonObject +>; ``` diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index c78cdae972..3e24f6664d 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.19-next.0", + "version": "0.2.19-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index 9bd33f6aae..b7da2bcc08 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.1.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-backend-module-gitlab/api-report.md b/plugins/scaffolder-backend-module-gitlab/api-report.md index 6db732fdcc..2ec05e74de 100644 --- a/plugins/scaffolder-backend-module-gitlab/api-report.md +++ b/plugins/scaffolder-backend-module-gitlab/api-report.md @@ -3,46 +3,56 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { JsonObject } from '@backstage/types'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; // @public export const createGitlabProjectAccessTokenAction: (options: { integrations: ScmIntegrationRegistry; -}) => TemplateAction<{ - repoUrl: string; - projectId: string | number; - name: string; - accessLevel: number; - scopes: string[]; - token?: string | undefined; -}>; +}) => TemplateAction< + { + repoUrl: string; + projectId: string | number; + name: string; + accessLevel: number; + scopes: string[]; + token?: string | undefined; + }, + JsonObject +>; // @public export const createGitlabProjectDeployTokenAction: (options: { integrations: ScmIntegrationRegistry; -}) => TemplateAction<{ - repoUrl: string; - projectId: string | number; - name: string; - username: string; - scopes: string[]; - token?: string | undefined; -}>; +}) => TemplateAction< + { + repoUrl: string; + projectId: string | number; + name: string; + username: string; + scopes: string[]; + token?: string | undefined; + }, + JsonObject +>; // @public export const createGitlabProjectVariableAction: (options: { integrations: ScmIntegrationRegistry; -}) => TemplateAction<{ - repoUrl: string; - projectId: string | number; - key: string; - value: string; - variableType: string; - variableProtected: boolean; - masked: boolean; - raw: boolean; - environmentScope: string; - token?: string | undefined; -}>; +}) => TemplateAction< + { + repoUrl: string; + projectId: string | number; + key: string; + value: string; + variableType: string; + variableProtected: boolean; + masked: boolean; + raw: boolean; + environmentScope: string; + token?: string | undefined; + }, + JsonObject +>; ``` diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index e870ba57a0..7b8f42bd17 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.1.0-next.0", + "version": "0.1.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index bd3509dbd0..ca8475d2ea 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + +## 0.4.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + ## 0.4.12-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/api-report.md b/plugins/scaffolder-backend-module-rails/api-report.md index c91daa1344..06b7dc457f 100644 --- a/plugins/scaffolder-backend-module-rails/api-report.md +++ b/plugins/scaffolder-backend-module-rails/api-report.md @@ -15,10 +15,13 @@ export function createFetchRailsAction(options: { integrations: ScmIntegrations; containerRunner: ContainerRunner; allowedImageNames?: string[]; -}): TemplateAction<{ - url: string; - targetPath?: string | undefined; - values: JsonObject; - imageName?: string | undefined; -}>; +}): TemplateAction< + { + url: string; + targetPath?: string | undefined; + values: JsonObject; + imageName?: string | undefined; + }, + JsonObject +>; ``` diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index aa1a178d9d..caf63204da 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.12-next.0", + "version": "0.4.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index 67772961ab..768e114acb 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/api-report.md b/plugins/scaffolder-backend-module-sentry/api-report.md index ef09bdebc0..746cce1348 100644 --- a/plugins/scaffolder-backend-module-sentry/api-report.md +++ b/plugins/scaffolder-backend-module-sentry/api-report.md @@ -4,18 +4,22 @@ ```ts import { Config } from '@backstage/config'; +import { JsonObject } from '@backstage/types'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; // @public export function createSentryCreateProjectAction(options: { config: Config; -}): TemplateAction<{ - organizationSlug: string; - teamSlug: string; - name: string; - slug?: string | undefined; - authToken?: string | undefined; -}>; +}): TemplateAction< + { + organizationSlug: string; + teamSlug: string; + name: string; + slug?: string | undefined; + authToken?: string | undefined; + }, + JsonObject +>; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 6f04036110..9a5d749bdc 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.1.4-next.0", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index 2948bbc79b..871c345d38 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.17-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/api-report.md b/plugins/scaffolder-backend-module-yeoman/api-report.md index 562fe52ac2..d8bdcb7b3b 100644 --- a/plugins/scaffolder-backend-module-yeoman/api-report.md +++ b/plugins/scaffolder-backend-module-yeoman/api-report.md @@ -7,9 +7,12 @@ import { JsonObject } from '@backstage/types'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; // @public -export function createRunYeomanAction(): TemplateAction<{ - namespace: string; - args?: string[] | undefined; - options?: JsonObject | undefined; -}>; +export function createRunYeomanAction(): TemplateAction< + { + namespace: string; + args?: string[] | undefined; + options?: JsonObject | undefined; + }, + JsonObject +>; ``` diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 50db3c38d0..91f1c9b848 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.2.17-next.0", + "version": "0.2.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 89bfc23549..4b8ba1359d 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,68 @@ # @backstage/plugin-scaffolder-backend +## 1.13.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/plugin-scaffolder-node@0.1.2-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + +## 1.13.0-next.1 + +### Minor Changes + +- 30ffdae70f9: Added `fetch:plain:file` action to fetch a single file, this action is also added to the list of built-in actions. +- 65e989f4018: Added the possibility to authorize parameters and steps of a template + + The scaffolder plugin is now integrated with the permission framework. + It is possible to toggle parameters or actions within templates by marking each section with specific `tags`, inside a `backstage:permissions` property under each parameter or action. Each parameter or action can then be permissioned by using a conditional decision containing the `scaffolderTemplateRules.hasTag` rule. + +- 95ea9f69b6f: Provide some more default filters out of the box and refactoring how the filters are applied to the `SecureTemplater`. + + - `parseEntityRef` will take an string entity triplet and return a parsed object. + - `pick` will allow you to reference a specific property in the piped object. + + So you can now combine things like this: `${{ parameters.entity | parseEntityRef | pick('name') }}` to get the name of a specific entity, or `${{ parameters.repoUrl | parseRepoUrl | pick('owner') }}` to get the owner of a repo. + +### Patch Changes + +- a7eb36c6e38: Improve type-check for scaffolder output parameters +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/plugin-scaffolder-node@0.1.2-next.1 + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 1.12.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend/alpha-api-report.md b/plugins/scaffolder-backend/alpha-api-report.md index 2ecd2cc800..e762c2be4f 100644 --- a/plugins/scaffolder-backend/alpha-api-report.md +++ b/plugins/scaffolder-backend/alpha-api-report.md @@ -9,7 +9,6 @@ import { Conditions } from '@backstage/plugin-permission-node'; import { PermissionCondition } from '@backstage/plugin-permission-common'; import { PermissionCriteria } from '@backstage/plugin-permission-common'; import { PermissionRule } from '@backstage/plugin-permission-node'; -import { PermissionRuleParams } from '@backstage/plugin-permission-common'; import { ResourcePermission } from '@backstage/plugin-permission-common'; import { TaskBroker } from '@backstage/plugin-scaffolder-backend'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; @@ -24,9 +23,7 @@ export const catalogModuleTemplateKind: () => BackendFeature; // @alpha export const createScaffolderConditionalDecision: ( permission: ResourcePermission<'scaffolder-template'>, - conditions: PermissionCriteria< - PermissionCondition<'scaffolder-template', PermissionRuleParams> - >, + conditions: PermissionCriteria>, ) => ConditionalPolicyDecision; // @alpha diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index a50bb7a515..5b12455d0f 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -78,49 +78,66 @@ export function createCatalogRegisterAction(options: { repoContentsUrl: string; catalogInfoPath?: string | undefined; optional?: boolean | undefined; - } + }, + JsonObject >; // @public -export function createCatalogWriteAction(): TemplateAction_2<{ - entity: {} & { - [k: string]: unknown; - }; - filePath?: string | undefined; -}>; +export function createCatalogWriteAction(): TemplateAction_2< + { + entity: Record; + filePath?: string | undefined; + }, + JsonObject +>; // @public -export function createDebugLogAction(): TemplateAction_2<{ - message?: string | undefined; - listWorkspace?: boolean | undefined; -}>; +export function createDebugLogAction(): TemplateAction_2< + { + message?: string | undefined; + listWorkspace?: boolean | undefined; + }, + JsonObject +>; // @public export function createFetchCatalogEntityAction(options: { catalogClient: CatalogApi; -}): TemplateAction_2<{ - entityRef?: string | undefined; - entityRefs?: string[] | undefined; - optional?: boolean | undefined; -}>; +}): TemplateAction_2< + { + entityRef?: string | undefined; + entityRefs?: string[] | undefined; + optional?: boolean | undefined; + }, + { + entity?: any; + entities?: any[] | undefined; + } +>; // @public export function createFetchPlainAction(options: { reader: UrlReader; integrations: ScmIntegrations; -}): TemplateAction_2<{ - url: string; - targetPath?: string | undefined; -}>; +}): TemplateAction_2< + { + url: string; + targetPath?: string | undefined; + }, + JsonObject +>; // @public export function createFetchPlainFileAction(options: { reader: UrlReader; integrations: ScmIntegrations; -}): TemplateAction_2<{ - url: string; - targetPath: string; -}>; +}): TemplateAction_2< + { + url: string; + targetPath: string; + }, + JsonObject +>; // @public export function createFetchTemplateAction(options: { @@ -128,57 +145,72 @@ export function createFetchTemplateAction(options: { integrations: ScmIntegrations; additionalTemplateFilters?: Record; additionalTemplateGlobals?: Record; -}): TemplateAction_2<{ - url: string; - targetPath?: string | undefined; - values: any; - templateFileExtension?: string | boolean | undefined; - copyWithoutRender?: string[] | undefined; - copyWithoutTemplating?: string[] | undefined; - cookiecutterCompat?: boolean | undefined; - replace?: boolean | undefined; -}>; +}): TemplateAction_2< + { + url: string; + targetPath?: string | undefined; + values: any; + templateFileExtension?: string | boolean | undefined; + copyWithoutRender?: string[] | undefined; + copyWithoutTemplating?: string[] | undefined; + cookiecutterCompat?: boolean | undefined; + replace?: boolean | undefined; + }, + JsonObject +>; // @public -export const createFilesystemDeleteAction: () => TemplateAction_2<{ - files: string[]; -}>; +export const createFilesystemDeleteAction: () => TemplateAction_2< + { + files: string[]; + }, + JsonObject +>; // @public -export const createFilesystemRenameAction: () => TemplateAction_2<{ - files: Array<{ - from: string; - to: string; - overwrite?: boolean; - }>; -}>; +export const createFilesystemRenameAction: () => TemplateAction_2< + { + files: Array<{ + from: string; + to: string; + overwrite?: boolean; + }>; + }, + JsonObject +>; // @public export function createGithubActionsDispatchAction(options: { integrations: ScmIntegrations; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction_2<{ - repoUrl: string; - workflowId: string; - branchOrTagName: string; - workflowInputs?: - | { - [key: string]: string; - } - | undefined; - token?: string | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + workflowId: string; + branchOrTagName: string; + workflowInputs?: + | { + [key: string]: string; + } + | undefined; + token?: string | undefined; + }, + JsonObject +>; // @public export function createGithubIssuesLabelAction(options: { integrations: ScmIntegrationRegistry; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction_2<{ - repoUrl: string; - number: number; - labels: string[]; - token?: string | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + number: number; + labels: string[]; + token?: string | undefined; + }, + JsonObject +>; // @public export interface CreateGithubPullRequestActionOptions { @@ -203,354 +235,411 @@ export type CreateGithubPullRequestClientFactoryInput = { export function createGithubRepoCreateAction(options: { integrations: ScmIntegrationRegistry; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction_2<{ - repoUrl: string; - description?: string | undefined; - homepage?: string | undefined; - access?: string | undefined; - deleteBranchOnMerge?: boolean | undefined; - gitAuthorName?: string | undefined; - gitAuthorEmail?: string | undefined; - allowRebaseMerge?: boolean | undefined; - allowSquashMerge?: boolean | undefined; - squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined; - squashMergeCommitMessage?: - | 'PR_BODY' - | 'COMMIT_MESSAGES' - | 'BLANK' - | undefined; - allowMergeCommit?: boolean | undefined; - allowAutoMerge?: boolean | undefined; - requireCodeOwnerReviews?: boolean | undefined; - bypassPullRequestAllowances?: - | { - users?: string[] | undefined; - teams?: string[] | undefined; - apps?: string[] | undefined; - } - | undefined; - requiredApprovingReviewCount?: number | undefined; - restrictions?: - | { - users: string[]; - teams: string[]; - apps?: string[] | undefined; - } - | undefined; - requiredStatusCheckContexts?: string[] | undefined; - requireBranchesToBeUpToDate?: boolean | undefined; - requiredConversationResolution?: boolean | undefined; - repoVisibility?: 'internal' | 'private' | 'public' | undefined; - collaborators?: - | ( - | { - user: string; - access: string; - } - | { - team: string; - access: string; - } - | { - username: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; - } - )[] - | undefined; - hasProjects?: boolean | undefined; - hasWiki?: boolean | undefined; - hasIssues?: boolean | undefined; - token?: string | undefined; - topics?: string[] | undefined; - requireCommitSigning?: boolean | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + description?: string | undefined; + homepage?: string | undefined; + access?: string | undefined; + deleteBranchOnMerge?: boolean | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + allowRebaseMerge?: boolean | undefined; + allowSquashMerge?: boolean | undefined; + squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined; + squashMergeCommitMessage?: + | 'PR_BODY' + | 'COMMIT_MESSAGES' + | 'BLANK' + | undefined; + allowMergeCommit?: boolean | undefined; + allowAutoMerge?: boolean | undefined; + requireCodeOwnerReviews?: boolean | undefined; + bypassPullRequestAllowances?: + | { + users?: string[] | undefined; + teams?: string[] | undefined; + apps?: string[] | undefined; + } + | undefined; + requiredApprovingReviewCount?: number | undefined; + restrictions?: + | { + users: string[]; + teams: string[]; + apps?: string[] | undefined; + } + | undefined; + requiredStatusCheckContexts?: string[] | undefined; + requireBranchesToBeUpToDate?: boolean | undefined; + requiredConversationResolution?: boolean | undefined; + repoVisibility?: 'internal' | 'private' | 'public' | undefined; + collaborators?: + | ( + | { + user: string; + access: string; + } + | { + team: string; + access: string; + } + | { + username: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } + )[] + | undefined; + hasProjects?: boolean | undefined; + hasWiki?: boolean | undefined; + hasIssues?: boolean | undefined; + token?: string | undefined; + topics?: string[] | undefined; + requireCommitSigning?: boolean | undefined; + }, + JsonObject +>; // @public export function createGithubRepoPushAction(options: { integrations: ScmIntegrationRegistry; config: Config; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction_2<{ - repoUrl: string; - description?: string | undefined; - defaultBranch?: string | undefined; - protectDefaultBranch?: boolean | undefined; - protectEnforceAdmins?: boolean | undefined; - gitCommitMessage?: string | undefined; - gitAuthorName?: string | undefined; - gitAuthorEmail?: string | undefined; - requireCodeOwnerReviews?: boolean | undefined; - dismissStaleReviews?: boolean | undefined; - bypassPullRequestAllowances?: - | { - users?: string[]; - teams?: string[]; - apps?: string[]; - } - | undefined; - requiredApprovingReviewCount?: number | undefined; - restrictions?: - | { - users: string[]; - teams: string[]; - apps?: string[]; - } - | undefined; - requiredStatusCheckContexts?: string[] | undefined; - requireBranchesToBeUpToDate?: boolean | undefined; - requiredConversationResolution?: boolean | undefined; - sourcePath?: string | undefined; - token?: string | undefined; - requiredCommitSigning?: boolean | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + description?: string | undefined; + defaultBranch?: string | undefined; + protectDefaultBranch?: boolean | undefined; + protectEnforceAdmins?: boolean | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + requireCodeOwnerReviews?: boolean | undefined; + dismissStaleReviews?: boolean | undefined; + bypassPullRequestAllowances?: + | { + users?: string[]; + teams?: string[]; + apps?: string[]; + } + | undefined; + requiredApprovingReviewCount?: number | undefined; + restrictions?: + | { + users: string[]; + teams: string[]; + apps?: string[]; + } + | undefined; + requiredStatusCheckContexts?: string[] | undefined; + requireBranchesToBeUpToDate?: boolean | undefined; + requiredConversationResolution?: boolean | undefined; + sourcePath?: string | undefined; + token?: string | undefined; + requiredCommitSigning?: boolean | undefined; + }, + JsonObject +>; // @public export function createGithubWebhookAction(options: { integrations: ScmIntegrationRegistry; defaultWebhookSecret?: string; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction_2<{ - repoUrl: string; - webhookUrl: string; - webhookSecret?: string | undefined; - events?: string[] | undefined; - active?: boolean | undefined; - contentType?: 'form' | 'json' | undefined; - insecureSsl?: boolean | undefined; - token?: string | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + webhookUrl: string; + webhookSecret?: string | undefined; + events?: string[] | undefined; + active?: boolean | undefined; + contentType?: 'form' | 'json' | undefined; + insecureSsl?: boolean | undefined; + token?: string | undefined; + }, + JsonObject +>; // @public export function createPublishAzureAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction_2<{ - repoUrl: string; - description?: string | undefined; - defaultBranch?: string | undefined; - sourcePath?: string | undefined; - token?: string | undefined; - gitCommitMessage?: string | undefined; - gitAuthorName?: string | undefined; - gitAuthorEmail?: string | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + description?: string | undefined; + defaultBranch?: string | undefined; + sourcePath?: string | undefined; + token?: string | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + }, + JsonObject +>; // @public @deprecated export function createPublishBitbucketAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction_2<{ - repoUrl: string; - description?: string | undefined; - defaultBranch?: string | undefined; - repoVisibility?: 'private' | 'public' | undefined; - sourcePath?: string | undefined; - enableLFS?: boolean | undefined; - token?: string | undefined; - gitCommitMessage?: string | undefined; - gitAuthorName?: string | undefined; - gitAuthorEmail?: string | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + description?: string | undefined; + defaultBranch?: string | undefined; + repoVisibility?: 'private' | 'public' | undefined; + sourcePath?: string | undefined; + enableLFS?: boolean | undefined; + token?: string | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + }, + JsonObject +>; // @public export function createPublishBitbucketCloudAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction_2<{ - repoUrl: string; - description?: string | undefined; - defaultBranch?: string | undefined; - repoVisibility?: 'private' | 'public' | undefined; - sourcePath?: string | undefined; - token?: string | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + description?: string | undefined; + defaultBranch?: string | undefined; + repoVisibility?: 'private' | 'public' | undefined; + sourcePath?: string | undefined; + token?: string | undefined; + }, + JsonObject +>; // @public export function createPublishBitbucketServerAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction_2<{ - repoUrl: string; - description?: string | undefined; - defaultBranch?: string | undefined; - repoVisibility?: 'private' | 'public' | undefined; - sourcePath?: string | undefined; - enableLFS?: boolean | undefined; - token?: string | undefined; - gitCommitMessage?: string | undefined; - gitAuthorName?: string | undefined; - gitAuthorEmail?: string | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + description?: string | undefined; + defaultBranch?: string | undefined; + repoVisibility?: 'private' | 'public' | undefined; + sourcePath?: string | undefined; + enableLFS?: boolean | undefined; + token?: string | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + }, + JsonObject +>; // @public export function createPublishGerritAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction_2<{ - repoUrl: string; - description: string; - defaultBranch?: string | undefined; - gitCommitMessage?: string | undefined; - gitAuthorName?: string | undefined; - gitAuthorEmail?: string | undefined; - sourcePath?: string | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + description: string; + defaultBranch?: string | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + sourcePath?: string | undefined; + }, + JsonObject +>; // @public export function createPublishGerritReviewAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction_2<{ - repoUrl: string; - branch?: string | undefined; - sourcePath?: string | undefined; - gitCommitMessage?: string | undefined; - gitAuthorName?: string | undefined; - gitAuthorEmail?: string | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + branch?: string | undefined; + sourcePath?: string | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + }, + JsonObject +>; // @public export function createPublishGithubAction(options: { integrations: ScmIntegrationRegistry; config: Config; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction_2<{ - repoUrl: string; - description?: string | undefined; - homepage?: string | undefined; - access?: string | undefined; - defaultBranch?: string | undefined; - protectDefaultBranch?: boolean | undefined; - protectEnforceAdmins?: boolean | undefined; - deleteBranchOnMerge?: boolean | undefined; - gitCommitMessage?: string | undefined; - gitAuthorName?: string | undefined; - gitAuthorEmail?: string | undefined; - allowRebaseMerge?: boolean | undefined; - allowSquashMerge?: boolean | undefined; - squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined; - squashMergeCommitMessage?: - | 'PR_BODY' - | 'COMMIT_MESSAGES' - | 'BLANK' - | undefined; - allowMergeCommit?: boolean | undefined; - allowAutoMerge?: boolean | undefined; - sourcePath?: string | undefined; - bypassPullRequestAllowances?: - | { - users?: string[]; - teams?: string[]; - apps?: string[]; - } - | undefined; - requiredApprovingReviewCount?: number | undefined; - restrictions?: - | { - users: string[]; - teams: string[]; - apps?: string[]; - } - | undefined; - requireCodeOwnerReviews?: boolean | undefined; - dismissStaleReviews?: boolean | undefined; - requiredStatusCheckContexts?: string[] | undefined; - requireBranchesToBeUpToDate?: boolean | undefined; - requiredConversationResolution?: boolean | undefined; - repoVisibility?: 'internal' | 'private' | 'public' | undefined; - collaborators?: - | ( - | { - user: string; - access: string; - } - | { - team: string; - access: string; - } - | { - username: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; - } - )[] - | undefined; - hasProjects?: boolean | undefined; - hasWiki?: boolean | undefined; - hasIssues?: boolean | undefined; - token?: string | undefined; - topics?: string[] | undefined; - requiredCommitSigning?: boolean | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + description?: string | undefined; + homepage?: string | undefined; + access?: string | undefined; + defaultBranch?: string | undefined; + protectDefaultBranch?: boolean | undefined; + protectEnforceAdmins?: boolean | undefined; + deleteBranchOnMerge?: boolean | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + allowRebaseMerge?: boolean | undefined; + allowSquashMerge?: boolean | undefined; + squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined; + squashMergeCommitMessage?: + | 'PR_BODY' + | 'COMMIT_MESSAGES' + | 'BLANK' + | undefined; + allowMergeCommit?: boolean | undefined; + allowAutoMerge?: boolean | undefined; + sourcePath?: string | undefined; + bypassPullRequestAllowances?: + | { + users?: string[]; + teams?: string[]; + apps?: string[]; + } + | undefined; + requiredApprovingReviewCount?: number | undefined; + restrictions?: + | { + users: string[]; + teams: string[]; + apps?: string[]; + } + | undefined; + requireCodeOwnerReviews?: boolean | undefined; + dismissStaleReviews?: boolean | undefined; + requiredStatusCheckContexts?: string[] | undefined; + requireBranchesToBeUpToDate?: boolean | undefined; + requiredConversationResolution?: boolean | undefined; + repoVisibility?: 'internal' | 'private' | 'public' | undefined; + collaborators?: + | ( + | { + user: string; + access: string; + } + | { + team: string; + access: string; + } + | { + username: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } + )[] + | undefined; + hasProjects?: boolean | undefined; + hasWiki?: boolean | undefined; + hasIssues?: boolean | undefined; + token?: string | undefined; + topics?: string[] | undefined; + requiredCommitSigning?: boolean | undefined; + }, + JsonObject +>; // @public export const createPublishGithubPullRequestAction: ( options: CreateGithubPullRequestActionOptions, -) => TemplateAction_2<{ - title: string; - branchName: string; - description: string; - repoUrl: string; - draft?: boolean | undefined; - targetPath?: string | undefined; - sourcePath?: string | undefined; - token?: string | undefined; - reviewers?: string[] | undefined; - teamReviewers?: string[] | undefined; -}>; +) => TemplateAction_2< + { + title: string; + branchName: string; + description: string; + repoUrl: string; + draft?: boolean | undefined; + targetPath?: string | undefined; + sourcePath?: string | undefined; + token?: string | undefined; + reviewers?: string[] | undefined; + teamReviewers?: string[] | undefined; + commitMessage?: string | undefined; + }, + JsonObject +>; // @public export function createPublishGitlabAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction_2<{ - repoUrl: string; - defaultBranch?: string | undefined; - repoVisibility?: 'internal' | 'private' | 'public' | undefined; - sourcePath?: string | undefined; - token?: string | undefined; - gitCommitMessage?: string | undefined; - gitAuthorName?: string | undefined; - gitAuthorEmail?: string | undefined; - setUserAsOwner?: boolean | undefined; - topics?: string[] | undefined; -}>; +}): TemplateAction_2< + { + repoUrl: string; + defaultBranch?: string | undefined; + repoVisibility?: 'internal' | 'private' | 'public' | undefined; + sourcePath?: string | undefined; + token?: string | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + setUserAsOwner?: boolean | undefined; + topics?: string[] | undefined; + }, + JsonObject +>; // @public export const createPublishGitlabMergeRequestAction: (options: { integrations: ScmIntegrationRegistry; -}) => TemplateAction_2<{ - repoUrl: string; - title: string; - description: string; - branchName: string; - sourcePath?: string | undefined; - targetPath?: string | undefined; - token?: string | undefined; - commitAction?: 'update' | 'delete' | 'create' | undefined; - projectid?: string | undefined; - removeSourceBranch?: boolean | undefined; - assignee?: string | undefined; -}>; +}) => TemplateAction_2< + { + repoUrl: string; + title: string; + description: string; + branchName: string; + sourcePath?: string | undefined; + targetPath?: string | undefined; + token?: string | undefined; + commitAction?: 'update' | 'delete' | 'create' | undefined; + projectid?: string | undefined; + removeSourceBranch?: boolean | undefined; + assignee?: string | undefined; + }, + JsonObject +>; // @public export function createRouter(options: RouterOptions): Promise; // @public @deprecated (undocumented) export const createTemplateAction: < - TParams, + TInputParams extends JsonObject = JsonObject, + TOutputParams extends JsonObject = JsonObject, TInputSchema extends ZodType | Schema = {}, TOutputSchema extends ZodType | Schema = {}, - TActionInput = TInputSchema extends ZodType + TActionInput extends JsonObject = TInputSchema extends ZodType< + any, + any, + infer IReturn + > ? IReturn - : TParams, + : TInputParams, + TActionOutput extends JsonObject = TOutputSchema extends ZodType< + any, + any, + infer IReturn_1 + > + ? IReturn_1 + : TOutputParams, >( - action: TemplateActionOptions, -) => TemplateAction_2; + action: TemplateActionOptions< + TActionInput, + TActionOutput, + TInputSchema, + TOutputSchema + >, +) => TemplateAction_2; // @public export function createWaitAction(options?: { maxWaitTime?: Duration | HumanDuration; -}): TemplateAction_2; +}): TemplateAction_2; // @public export type CreateWorkerOptions = { diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index d8d7347d6c..a2669ec164 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.12.1-next.0", + "version": "1.13.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts index 76643131f5..051096db57 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts @@ -69,7 +69,12 @@ describe('SecureTemplater', () => { owner: 'my-owner', host: 'my-host.com', })); - const renderWith = await SecureTemplater.loadRenderer({ parseRepoUrl }); + + const projectSlug = jest.fn(() => 'my-owner/my-repo'); + + const renderWith = await SecureTemplater.loadRenderer({ + templateFilters: { parseRepoUrl, projectSlug }, + }); const renderWithout = await SecureTemplater.loadRenderer(); const ctx = { @@ -95,7 +100,6 @@ describe('SecureTemplater', () => { expect(parseRepoUrl.mock.calls).toEqual([ ['https://my-host.com/my-owner/my-repo'], - ['https://my-host.com/my-owner/my-repo'], ]); }); @@ -104,7 +108,7 @@ describe('SecureTemplater', () => { const mockFilter2 = jest.fn((var1, var2) => `${var1} ${var2}`); const mockFilter3 = jest.fn((var1, var2) => ({ var1, var2 })); const renderWith = await SecureTemplater.loadRenderer({ - additionalTemplateFilters: { mockFilter1, mockFilter2, mockFilter3 }, + templateFilters: { mockFilter1, mockFilter2, mockFilter3 }, }); const renderWithout = await SecureTemplater.loadRenderer(); @@ -149,7 +153,7 @@ describe('SecureTemplater', () => { const mockGlobal2 = 'foo'; const mockGlobal3 = 123456; const renderWith = await SecureTemplater.loadRenderer({ - additionalTemplateGlobals: { mockGlobal1, mockGlobal2, mockGlobal3 }, + templateGlobals: { mockGlobal1, mockGlobal2, mockGlobal3 }, }); const renderWithout = await SecureTemplater.loadRenderer(); @@ -168,11 +172,13 @@ describe('SecureTemplater', () => { it('should not allow helpers to be rewritten', async () => { const render = await SecureTemplater.loadRenderer({ - parseRepoUrl: () => ({ - repo: 'my-repo', - owner: 'my-owner', - host: 'my-host.com', - }), + templateFilters: { + parseRepoUrl: () => ({ + repo: 'my-repo', + owner: 'my-owner', + host: 'my-host.com', + }), + }, }); const ctx = { diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index 7dc42658be..f0ccb6f192 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -18,7 +18,6 @@ import { VM } from 'vm2'; import { resolvePackagePath } from '@backstage/backend-common'; import fs from 'fs-extra'; import { JsonValue } from '@backstage/types'; -import { RepoSpec } from '../../scaffolder/actions/builtin/publish/util'; // language=JavaScript const mkScript = (nunjucksSource: string) => ` @@ -46,26 +45,14 @@ const { render, renderCompat } = (() => { }); compatEnv.addFilter('jsonify', compatEnv.getFilter('dump')); - if (typeof parseRepoUrl !== 'undefined') { - const safeHelperRef = parseRepoUrl; - - env.addFilter('parseRepoUrl', repoUrl => { - return JSON.parse(safeHelperRef(repoUrl)) - }); - env.addFilter('projectSlug', repoUrl => { - const { owner, repo } = JSON.parse(safeHelperRef(repoUrl)); - return owner + '/' + repo; - }); - } - - if (typeof additionalTemplateFilters !== 'undefined') { - for (const [filterName, filterFn] of Object.entries(additionalTemplateFilters)) { + if (typeof templateFilters !== 'undefined') { + for (const [filterName, filterFn] of Object.entries(templateFilters)) { env.addFilter(filterName, (...args) => JSON.parse(filterFn(...args))); } } - if (typeof additionalTemplateGlobals !== 'undefined') { - for (const [globalName, global] of Object.entries(additionalTemplateGlobals)) { + if (typeof templateGlobals !== 'undefined') { + for (const [globalName, global] of Object.entries(templateGlobals)) { if (typeof global === 'function') { env.addGlobal(globalName, (...args) => JSON.parse(global(...args))); } else { @@ -114,16 +101,12 @@ export type TemplateGlobal = | JsonValue; export interface SecureTemplaterOptions { - /* Optional implementation of the parseRepoUrl filter */ - parseRepoUrl?(repoUrl: string): RepoSpec; - /* Enables jinja compatibility and the "jsonify" filter */ cookiecutterCompat?: boolean; - /* Extra user-provided nunjucks filters */ - additionalTemplateFilters?: Record; + templateFilters?: Record; /* Extra user-provided nunjucks globals */ - additionalTemplateGlobals?: Record; + templateGlobals?: Record; } export type SecureTemplateRenderer = ( @@ -133,21 +116,12 @@ export type SecureTemplateRenderer = ( export class SecureTemplater { static async loadRenderer(options: SecureTemplaterOptions = {}) { - const { - parseRepoUrl, - cookiecutterCompat, - additionalTemplateFilters, - additionalTemplateGlobals, - } = options; + const { cookiecutterCompat, templateFilters, templateGlobals } = options; const sandbox: Record = {}; - if (parseRepoUrl) { - sandbox.parseRepoUrl = (url: string) => JSON.stringify(parseRepoUrl(url)); - } - - if (additionalTemplateFilters) { - sandbox.additionalTemplateFilters = Object.fromEntries( - Object.entries(additionalTemplateFilters) + if (templateFilters) { + sandbox.templateFilters = Object.fromEntries( + Object.entries(templateFilters) .filter(([_, filterFunction]) => !!filterFunction) .map(([filterName, filterFunction]) => [ filterName, @@ -155,9 +129,9 @@ export class SecureTemplater { ]), ); } - if (additionalTemplateGlobals) { - sandbox.additionalTemplateGlobals = Object.fromEntries( - Object.entries(additionalTemplateGlobals) + if (templateGlobals) { + sandbox.templateGlobals = Object.fromEntries( + Object.entries(templateGlobals) .filter(([_, global]) => !!global) .map(([globalName, global]) => { if (typeof global === 'function') { diff --git a/plugins/scaffolder-backend/src/lib/templating/filters.ts b/plugins/scaffolder-backend/src/lib/templating/filters.ts new file mode 100644 index 0000000000..204d0015d8 --- /dev/null +++ b/plugins/scaffolder-backend/src/lib/templating/filters.ts @@ -0,0 +1,37 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { parseEntityRef } from '@backstage/catalog-model'; +import { ScmIntegrations } from '@backstage/integration'; +import { JsonValue } from '@backstage/types'; +import { TemplateFilter } from '..'; +import { parseRepoUrl } from '../../scaffolder/actions/builtin/publish/util'; +import get from 'lodash/get'; + +export const createDefaultFilters = ({ + integrations, +}: { + integrations: ScmIntegrations; +}): Record => { + return { + parseRepoUrl: url => parseRepoUrl(url as string, integrations), + parseEntityRef: ref => parseEntityRef(ref as string), + pick: (obj: JsonValue, key: JsonValue) => get(obj, key as string), + projectSlug: repoUrl => { + const { owner, repo } = parseRepoUrl(repoUrl as string, integrations); + return `${owner}/${repo}`; + }, + }; +}; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts index 1bcbfa0006..d6abeee792 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts @@ -17,6 +17,7 @@ import { CatalogApi } from '@backstage/catalog-client'; import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import yaml from 'yaml'; +import { z } from 'zod'; const id = 'catalog:fetch'; @@ -63,55 +64,46 @@ export function createFetchCatalogEntityAction(options: { }) { const { catalogClient } = options; - return createTemplateAction<{ - entityRef?: string; - entityRefs?: string[]; - optional?: boolean; - }>({ + return createTemplateAction({ id, description: 'Returns entity or entities from the catalog by entity reference(s)', examples, schema: { - input: { - type: 'object', - properties: { - entityRef: { - type: 'string', - title: 'Entity reference', + input: z.object({ + entityRef: z + .string({ description: 'Entity reference of the entity to get', - }, - entityRefs: { - type: 'array', - title: 'Entity references', + }) + .optional(), + entityRefs: z + .array(z.string(), { description: 'Entity references of the entities to get', - }, - optional: { - title: 'Optional', + }) + .optional(), + optional: z + .boolean({ description: 'Allow the entity or entities to optionally exist. Default: false', - type: 'boolean', - }, - }, - }, - output: { - type: 'object', - properties: { - entity: { - title: 'Entity found by the entity reference', - type: 'object', + }) + .optional(), + }), + output: z.object({ + entity: z + .any({ description: 'Object containing same values used in the Entity schema. Only when used with `entityRef` parameter.', - }, - entities: { - title: 'Entities found by the entity references', - type: 'array', - items: { type: 'object' }, - description: - 'Array containing objects with same values used in the Entity schema. Only when used with `entityRefs` parameter.', - }, - }, - }, + }) + .optional(), + entities: z + .array( + z.any({ + description: + 'Array containing objects with same values used in the Entity schema. Only when used with `entityRefs` parameter.', + }), + ) + .optional(), + }), }, async handler(ctx) { const { entityRef, entityRefs, optional } = ctx.input; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts index 9e823d2574..81fdc73e71 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts @@ -69,8 +69,7 @@ export function createCatalogWriteAction() { .describe('Defaults to catalog-info.yaml'), // TODO: this should reference an zod entity validator if it existed. entity: z - .object({}) - .passthrough() + .record(z.any()) .describe( 'You can provide the same values used in the Entity schema.', ), diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts index 68c205ce59..7659cff240 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -28,6 +28,7 @@ import { SecureTemplater, TemplateGlobal, } from '../../../../lib/templating/SecureTemplater'; +import { createDefaultFilters } from '../../../../lib/templating/filters'; /** * Downloads a skeleton, templates variables into file and directory names and content. @@ -49,6 +50,8 @@ export function createFetchTemplateAction(options: { additionalTemplateGlobals, } = options; + const defaultTemplateFilters = createDefaultFilters({ integrations }); + return createTemplateAction<{ url: string; targetPath?: string; @@ -231,8 +234,11 @@ export function createFetchTemplateAction(options: { const renderTemplate = await SecureTemplater.loadRenderer({ cookiecutterCompat: ctx.input.cookiecutterCompat, - additionalTemplateFilters, - additionalTemplateGlobals, + templateFilters: { + ...defaultTemplateFilters, + ...additionalTemplateFilters, + }, + templateGlobals: additionalTemplateGlobals, }); for (const location of allEntriesInTemplate) { diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts index 70fff20446..7750277728 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts @@ -545,4 +545,56 @@ describe('createPublishGithubPullRequestAction', () => { expect(ctx.output).toHaveBeenCalledWith('pullRequestNumber', 123); }); }); + + describe('with commit message', () => { + let input: GithubPullRequestActionInput; + let ctx: ActionContext; + + beforeEach(() => { + input = { + repoUrl: 'github.com?owner=myorg&repo=myrepo', + title: 'Create my new app', + branchName: 'new-app', + description: 'This PR is really good', + commitMessage: 'Create my new app, but in the commit message', + }; + + mockFs({ + [workspacePath]: { 'file.txt': 'Hello there!' }, + }); + + ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + }); + + it('creates a pull request', async () => { + await instance.handler(ctx); + + expect(fakeClient.createPullRequest).toHaveBeenCalledWith({ + owner: 'myorg', + repo: 'myrepo', + title: 'Create my new app', + head: 'new-app', + body: 'This PR is really good', + changes: [ + { + commit: 'Create my new app, but in the commit message', + files: { + 'file.txt': { + content: Buffer.from('Hello there!').toString('base64'), + encoding: 'base64', + mode: '100644', + }, + }, + }, + ], + }); + }); + }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts index b8c0068d70..6706ad9c06 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts @@ -136,6 +136,7 @@ export const createPublishGithubPullRequestAction = ( token?: string; reviewers?: string[]; teamReviewers?: string[]; + commitMessage?: string; }>({ id: 'publish:github:pull-request', schema: { @@ -202,6 +203,11 @@ export const createPublishGithubPullRequestAction = ( description: 'The teams that will be added as reviewers to the pull request', }, + commitMessage: { + type: 'string', + title: 'Commit Message', + description: 'The commit message for the pull request commit', + }, }, }, output: { @@ -233,6 +239,7 @@ export const createPublishGithubPullRequestAction = ( token: providedToken, reviewers, teamReviewers, + commitMessage, } = ctx.input; const { owner, repo, host } = parseRepoUrl(repoUrl, integrations); @@ -298,7 +305,7 @@ export const createPublishGithubPullRequestAction = ( changes: [ { files, - commit: title, + commit: commitMessage ?? title, }, ], body: description, diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 3b6ec54249..b8c9edaae7 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -120,7 +120,7 @@ describe('DefaultWorkflowRunner', () => { foo: z.number(), }), }, - }) as TemplateAction, + }) as TemplateAction, ); actionRegistry.register({ @@ -698,6 +698,88 @@ describe('DefaultWorkflowRunner', () => { repo: 'repo', }); }); + + it('provides the parseEntityRef filter', async () => { + const task = createMockTaskWithSpec({ + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [ + { + id: 'test', + name: 'name', + action: 'output-action', + input: {}, + }, + ], + output: { + foo: '${{ parameters.entity | parseEntityRef }}', + }, + parameters: { + entity: 'component:default/ben', + }, + }); + + const { output } = await runner.execute(task); + + expect(output.foo).toEqual({ + kind: 'component', + namespace: 'default', + name: 'ben', + }); + }); + + it('provides the pick filter', async () => { + const task = createMockTaskWithSpec({ + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [ + { + id: 'test', + name: 'name', + action: 'output-action', + input: {}, + }, + ], + output: { + foo: '${{ parameters.entity | parseEntityRef | pick("kind") }}', + }, + parameters: { + entity: 'component:default/ben', + }, + }); + + const { output } = await runner.execute(task); + + expect(output.foo).toEqual('component'); + }); + + it('should allow deep nesting of picked objects', async () => { + const task = createMockTaskWithSpec({ + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [ + { + id: 'test', + name: 'name', + action: 'output-action', + input: {}, + }, + ], + output: { + foo: '${{ parameters.entity | pick("something.deeply.nested") }}', + }, + parameters: { + entity: { + something: { + deeply: { + nested: 'component', + }, + }, + }, + }, + }); + + const { output } = await runner.execute(task); + + expect(output.foo).toEqual('component'); + }); }); describe('dry run', () => { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 629c730d48..9358484642 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -30,7 +30,6 @@ import { InputError } from '@backstage/errors'; import { PassThrough } from 'stream'; import { generateExampleOutput, isTruthy } from './helper'; import { validate as validateJsonSchema } from 'jsonschema'; -import { parseRepoUrl } from '../actions/builtin/publish/util'; import { TemplateActionRegistry } from '../actions'; import { TemplateFilter, @@ -46,6 +45,7 @@ import { import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { UserEntity } from '@backstage/catalog-model'; import { createCounterMetric, createHistogramMetric } from '../../util/metrics'; +import { createDefaultFilters } from '../../lib/templating/filters'; type NunjucksWorkflowRunnerOptions = { workingDirectory: string; @@ -103,7 +103,12 @@ const createStepLogger = ({ }; export class NunjucksWorkflowRunner implements WorkflowRunner { - constructor(private readonly options: NunjucksWorkflowRunnerOptions) {} + private readonly defaultTemplateFilters: Record; + constructor(private readonly options: NunjucksWorkflowRunnerOptions) { + this.defaultTemplateFilters = createDefaultFilters({ + integrations: this.options.integrations, + }); + } private readonly tracker = scaffoldingTracker(); @@ -329,22 +334,15 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { await task.getWorkspaceName(), ); - const { - additionalTemplateFilters, - additionalTemplateGlobals, - integrations, - } = this.options; + const { additionalTemplateFilters, additionalTemplateGlobals } = + this.options; const renderTemplate = await SecureTemplater.loadRenderer({ - // TODO(blam): let's work out how we can deprecate this. - // We shouldn't really need to be exposing these now we can deal with - // objects in the params block. - // Maybe we can expose a new RepoUrlPicker with secrets for V3 that provides an object already. - parseRepoUrl(url: string) { - return parseRepoUrl(url, integrations); + templateFilters: { + ...this.defaultTemplateFilters, + ...additionalTemplateFilters, }, - additionalTemplateFilters, - additionalTemplateGlobals, + templateGlobals: additionalTemplateGlobals, }); try { diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 83e32d4d30..a598cb3259 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-common +## 1.2.7-next.1 + +### Patch Changes + +- 65e989f4018: Added permissions for authorizing parameters and steps +- 65e989f4018: Define optional `backstage:permissions` property to parameters and steps used to authorize part of the template using the permission framework +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + ## 1.2.7-next.0 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index 41c1b28fc1..1d48199262 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-common", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", - "version": "1.2.7-next.0", + "version": "1.2.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index aa73af9a1f..17ab2a73ce 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-scaffolder-node +## 0.1.2-next.2 + +### Patch Changes + +- 2898b6c8d52: Minor type tweaks for TypeScript 5.0 +- Updated dependencies + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + +## 0.1.2-next.1 + +### Patch Changes + +- a7eb36c6e38: Improve type-check for scaffolder output parameters +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index d5b9b73767..bea689dc70 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -7,7 +7,6 @@ import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; -import { JsonValue } from '@backstage/types'; import { Logger } from 'winston'; import { Schema } from 'jsonschema'; import { TemplateInfo } from '@backstage/plugin-scaffolder-common'; @@ -16,13 +15,19 @@ import { Writable } from 'stream'; import { z } from 'zod'; // @public -export type ActionContext = { +export type ActionContext< + TActionInput extends JsonObject, + TActionOutput extends JsonObject = JsonObject, +> = { logger: Logger; logStream: Writable; secrets?: TaskSecrets; workspacePath: string; input: TActionInput; - output(name: string, value: JsonValue): void; + output( + name: keyof TActionOutput, + value: TActionOutput[keyof TActionOutput], + ): void; createTemporaryDirectory(): Promise; templateInfo?: TemplateInfo; isDryRun?: boolean; @@ -35,15 +40,32 @@ export type ActionContext = { // @public export const createTemplateAction: < - TParams, + TInputParams extends JsonObject = JsonObject, + TOutputParams extends JsonObject = JsonObject, TInputSchema extends z.ZodType | Schema = {}, TOutputSchema extends z.ZodType | Schema = {}, - TActionInput = TInputSchema extends z.ZodType + TActionInput extends JsonObject = TInputSchema extends z.ZodType< + any, + any, + infer IReturn + > ? IReturn - : TParams, + : TInputParams, + TActionOutput extends JsonObject = TOutputSchema extends z.ZodType< + any, + any, + infer IReturn_1 + > + ? IReturn_1 + : TOutputParams, >( - action: TemplateActionOptions, -) => TemplateAction; + action: TemplateActionOptions< + TActionInput, + TActionOutput, + TInputSchema, + TOutputSchema + >, +) => TemplateAction; // @alpha export interface ScaffolderActionsExtensionPoint { @@ -60,7 +82,10 @@ export type TaskSecrets = Record & { }; // @public (undocumented) -export type TemplateAction = { +export type TemplateAction< + TActionInput extends JsonObject = JsonObject, + TActionOutput extends JsonObject = JsonObject, +> = { id: string; description?: string; examples?: { @@ -72,12 +97,13 @@ export type TemplateAction = { input?: Schema; output?: Schema; }; - handler: (ctx: ActionContext) => Promise; + handler: (ctx: ActionContext) => Promise; }; // @public (undocumented) export type TemplateActionOptions< - TActionInput = {}, + TActionInput extends JsonObject = {}, + TActionOutput extends JsonObject = {}, TInputSchema extends Schema | z.ZodType = {}, TOutputSchema extends Schema | z.ZodType = {}, > = { @@ -92,6 +118,6 @@ export type TemplateActionOptions< input?: TInputSchema; output?: TOutputSchema; }; - handler: (ctx: ActionContext) => Promise; + handler: (ctx: ActionContext) => Promise; }; ``` diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index d63fddc0b5..5098a33788 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-node", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", - "version": "0.1.2-next.0", + "version": "0.1.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-node/src/actions/createTemplateAction.ts b/plugins/scaffolder-node/src/actions/createTemplateAction.ts index 8c98042d8c..a667f91744 100644 --- a/plugins/scaffolder-node/src/actions/createTemplateAction.ts +++ b/plugins/scaffolder-node/src/actions/createTemplateAction.ts @@ -18,10 +18,12 @@ import { ActionContext, TemplateAction } from './types'; import { z } from 'zod'; import { Schema } from 'jsonschema'; import zodToJsonSchema from 'zod-to-json-schema'; +import { JsonObject } from '@backstage/types'; /** @public */ export type TemplateActionOptions< - TActionInput = {}, + TActionInput extends JsonObject = {}, + TActionOutput extends JsonObject = {}, TInputSchema extends Schema | z.ZodType = {}, TOutputSchema extends Schema | z.ZodType = {}, > = { @@ -33,7 +35,7 @@ export type TemplateActionOptions< input?: TInputSchema; output?: TOutputSchema; }; - handler: (ctx: ActionContext) => Promise; + handler: (ctx: ActionContext) => Promise; }; /** @@ -42,15 +44,32 @@ export type TemplateActionOptions< * @public */ export const createTemplateAction = < - TParams, + TInputParams extends JsonObject = JsonObject, + TOutputParams extends JsonObject = JsonObject, TInputSchema extends Schema | z.ZodType = {}, TOutputSchema extends Schema | z.ZodType = {}, - TActionInput = TInputSchema extends z.ZodType + TActionInput extends JsonObject = TInputSchema extends z.ZodType< + any, + any, + infer IReturn + > ? IReturn - : TParams, + : TInputParams, + TActionOutput extends JsonObject = TOutputSchema extends z.ZodType< + any, + any, + infer IReturn + > + ? IReturn + : TOutputParams, >( - action: TemplateActionOptions, -): TemplateAction => { + action: TemplateActionOptions< + TActionInput, + TActionOutput, + TInputSchema, + TOutputSchema + >, +): TemplateAction => { const inputSchema = action.schema?.input && 'safeParseAsync' in action.schema.input ? zodToJsonSchema(action.schema.input) @@ -61,7 +80,7 @@ export const createTemplateAction = < ? zodToJsonSchema(action.schema.output) : action.schema?.output; - const templateAction = { + return { ...action, schema: { ...action.schema, @@ -69,6 +88,4 @@ export const createTemplateAction = < output: outputSchema, }, }; - - return templateAction; }; diff --git a/plugins/scaffolder-node/src/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts index 8827aaf98c..e35f55aa67 100644 --- a/plugins/scaffolder-node/src/actions/types.ts +++ b/plugins/scaffolder-node/src/actions/types.ts @@ -16,8 +16,8 @@ import { Logger } from 'winston'; import { Writable } from 'stream'; -import { JsonObject, JsonValue } from '@backstage/types'; -import { TaskSecrets } from '../tasks/types'; +import { JsonObject } from '@backstage/types'; +import { TaskSecrets } from '../tasks'; import { TemplateInfo } from '@backstage/plugin-scaffolder-common'; import { UserEntity } from '@backstage/catalog-model'; import { Schema } from 'jsonschema'; @@ -26,13 +26,19 @@ import { Schema } from 'jsonschema'; * ActionContext is passed into scaffolder actions. * @public */ -export type ActionContext = { +export type ActionContext< + TActionInput extends JsonObject, + TActionOutput extends JsonObject = JsonObject, +> = { logger: Logger; logStream: Writable; secrets?: TaskSecrets; workspacePath: string; input: TActionInput; - output(name: string, value: JsonValue): void; + output( + name: keyof TActionOutput, + value: TActionOutput[keyof TActionOutput], + ): void; /** * Creates a temporary directory for use by the action, which is then cleaned up automatically. @@ -68,7 +74,10 @@ export type ActionContext = { }; /** @public */ -export type TemplateAction = { +export type TemplateAction< + TActionInput extends JsonObject = JsonObject, + TActionOutput extends JsonObject = JsonObject, +> = { id: string; description?: string; examples?: { description: string; example: string }[]; @@ -77,5 +86,5 @@ export type TemplateAction = { input?: Schema; output?: Schema; }; - handler: (ctx: ActionContext) => Promise; + handler: (ctx: ActionContext) => Promise; }; diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 5993000724..b6c3b48440 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-scaffolder-react +## 1.3.0-next.2 + +### Patch Changes + +- 90dda42cfd2: bug: Invert `templateFilter` predicate to align with `Array.filter` +- 34dab7ee7f8: `scaffolder/next`: bump `rjsf` dependencies to `5.5.0` +- 2898b6c8d52: Minor type tweaks for TypeScript 5.0 +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + +## 1.3.0-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + ## 1.3.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-react/api-report.md b/plugins/scaffolder-react/api-report.md index da8309d5ec..baf5afb312 100644 --- a/plugins/scaffolder-react/api-report.md +++ b/plugins/scaffolder-react/api-report.md @@ -71,7 +71,7 @@ export type FieldExtensionComponent<_TReturnValue, _TInputProps> = () => null; // @public export interface FieldExtensionComponentProps< TFieldReturnValue, - TUiOptions extends {} = {}, + TUiOptions = unknown, > extends FieldProps { // (undocumented) uiSchema: FieldProps['uiSchema'] & { @@ -316,7 +316,7 @@ export type TemplateParameterSchema = { // @public export const useCustomFieldExtensions: < - TComponentDataType = FieldExtensionOptions, + TComponentDataType = FieldExtensionOptions, >( outlet: React.ReactNode, ) => TComponentDataType[]; diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index db0b30c758..f4c5234454 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-react", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", - "version": "1.3.0-next.0", + "version": "1.3.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -60,12 +60,13 @@ "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^20.0.0", "@rjsf/core": "^3.2.1", - "@rjsf/core-v5": "npm:@rjsf/core@5.3.1", + "@rjsf/core-v5": "npm:@rjsf/core@5.5.0", "@rjsf/material-ui": "^3.2.1", - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.3.1", - "@rjsf/utils": "5.3.1", - "@rjsf/validator-ajv8": "5.3.1", + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.5.0", + "@rjsf/utils": "5.5.0", + "@rjsf/validator-ajv8": "5.5.0", "@types/json-schema": "^7.0.9", + "@types/react": "^16.13.1 || ^17.0.0", "classnames": "^2.2.6", "humanize-duration": "^3.25.1", "immer": "^9.0.1", @@ -81,8 +82,8 @@ "zod-to-json-schema": "^3.20.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -91,6 +92,7 @@ "@backstage/plugin-catalog": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/scaffolder-react/src/extensions/types.ts b/plugins/scaffolder-react/src/extensions/types.ts index a9ed854afa..5d560a20bc 100644 --- a/plugins/scaffolder-react/src/extensions/types.ts +++ b/plugins/scaffolder-react/src/extensions/types.ts @@ -64,7 +64,7 @@ export type FieldExtensionOptions< */ export interface FieldExtensionComponentProps< TFieldReturnValue, - TUiOptions extends {} = {}, + TUiOptions = unknown, > extends FieldProps { uiSchema: FieldProps['uiSchema'] & { 'ui:options'?: TUiOptions; diff --git a/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.test.tsx index c03af41f99..894c6ea4d0 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.test.tsx @@ -214,7 +214,7 @@ describe('TemplateGroups', () => { expect(TemplateGroup).toHaveBeenCalledWith( expect.objectContaining({ - templates: [expect.objectContaining({ template: mockEntities[1] })], + templates: [expect.objectContaining({ template: mockEntities[0] })], }), {}, ); diff --git a/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx index 50be7a4bdf..f0f06b3410 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx @@ -91,7 +91,7 @@ export const TemplateGroups = (props: TemplateGroupsProps) => { {groups.map(({ title, filter }, index) => { const templates = entities .filter(isTemplateEntityV1beta3) - .filter(e => (templateFilter ? !templateFilter(e) : true)) + .filter(e => (templateFilter ? templateFilter(e) : true)) .filter(filter) .map(template => { const additionalLinks = diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 22741c6a14..c9f5adf94a 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/plugin-scaffolder +## 1.13.0-next.2 + +### Minor Changes + +- cf18c32934a: The Installed Actions page now shows details for nested objects and arrays + +### Patch Changes + +- 90dda42cfd2: bug: Invert `templateFilter` predicate to align with `Array.filter` +- 34dab7ee7f8: `scaffolder/next`: bump `rjsf` dependencies to `5.5.0` +- Updated dependencies + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/plugin-scaffolder-react@1.3.0-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-react@0.4.12-next.1 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + +## 1.13.0-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/plugin-scaffolder-common@1.2.7-next.1 + - @backstage/plugin-scaffolder-react@1.3.0-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + ## 1.13.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index de51720aa0..b2e38afcb2 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "1.13.0-next.0", + "version": "1.13.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -69,8 +69,9 @@ "@react-hookz/web": "^20.0.0", "@rjsf/core": "^3.2.1", "@rjsf/material-ui": "^3.2.1", - "@rjsf/utils": "5.3.1", - "@rjsf/validator-ajv8": "5.3.1", + "@rjsf/utils": "5.5.0", + "@rjsf/validator-ajv8": "5.5.0", + "@types/react": "^16.13.1 || ^17.0.0", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", "git-url-parse": "^13.0.0", @@ -88,8 +89,8 @@ "zod-to-json-schema": "^3.20.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -98,6 +99,7 @@ "@backstage/dev-utils": "workspace:^", "@backstage/plugin-catalog": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx index 90f6f9b393..a402e078a8 100644 --- a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx +++ b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx @@ -16,8 +16,8 @@ import React from 'react'; import { ActionsPage } from './ActionsPage'; import { - scaffolderApiRef, ScaffolderApi, + scaffolderApiRef, } from '@backstage/plugin-scaffolder-react'; import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; import { ApiProvider } from '@backstage/core-app-api'; @@ -118,7 +118,7 @@ describe('TemplatePage', () => { expect(rendered.getByText('Test output')).toBeInTheDocument(); }); - it('renders action with multipel input types', async () => { + it('renders action with multiple input types', async () => { scaffolderApiMock.listActions.mockResolvedValue([ { id: 'test', @@ -211,4 +211,300 @@ describe('TemplatePage', () => { expect(rendered.getByText('Bar title')).toBeInTheDocument(); expect(rendered.getByText('Bar description')).toBeInTheDocument(); }); + + it('renders action with object input type', async () => { + scaffolderApiMock.listActions.mockResolvedValue([ + { + id: 'test', + description: 'example description', + schema: { + input: { + type: 'object', + required: ['foobar'], + properties: { + foobar: { + title: 'Test object', + type: ['object'], + properties: { + a: { + title: 'nested prop a', + type: 'string', + }, + b: { + title: 'nested prop b', + type: 'number', + }, + }, + }, + }, + }, + }, + }, + ]); + const rendered = await renderInTestApp( + + + , + { + mountedRoutes: { + '/create/actions': rootRouteRef, + }, + }, + ); + + expect(rendered.getByText('Test object')).toBeInTheDocument(); + const objectChip = rendered.getByText('object'); + expect(objectChip).toBeInTheDocument(); + + expect(rendered.queryByText('nested prop a')).not.toBeInTheDocument(); + expect(rendered.queryByText('string')).not.toBeInTheDocument(); + expect(rendered.queryByText('nested prop b')).not.toBeInTheDocument(); + expect(rendered.queryByText('number')).not.toBeInTheDocument(); + + objectChip.click(); + + expect(rendered.queryByText('nested prop a')).toBeInTheDocument(); + expect(rendered.queryByText('string')).toBeInTheDocument(); + expect(rendered.queryByText('nested prop b')).toBeInTheDocument(); + expect(rendered.queryByText('number')).toBeInTheDocument(); + }); + + it('renders action with nested object input type', async () => { + scaffolderApiMock.listActions.mockResolvedValue([ + { + id: 'test', + description: 'example description', + schema: { + input: { + type: 'object', + required: ['foobar'], + properties: { + foobar: { + title: 'Test object', + type: 'object', + properties: { + a: { + title: 'nested object a', + type: 'object', + properties: { + c: { + title: 'nested object c', + type: 'object', + }, + }, + }, + b: { + title: 'nested prop b', + type: 'number', + }, + }, + }, + }, + }, + }, + }, + ]); + const rendered = await renderInTestApp( + + + , + { + mountedRoutes: { + '/create/actions': rootRouteRef, + }, + }, + ); + + expect(rendered.getByText('Test object')).toBeInTheDocument(); + const objectChip = rendered.getByText('object'); + expect(objectChip).toBeInTheDocument(); + + expect(rendered.queryByText('nested object a')).not.toBeInTheDocument(); + expect(rendered.queryByText('nested prop b')).not.toBeInTheDocument(); + expect(rendered.queryByText('nested object c')).not.toBeInTheDocument(); + + objectChip.click(); + + expect(rendered.queryByText('nested object a')).toBeInTheDocument(); + expect(rendered.queryByText('nested prop b')).toBeInTheDocument(); + expect(rendered.queryByText('nested object c')).not.toBeInTheDocument(); + + const allObjectChips = rendered.getAllByText('object'); + expect(allObjectChips.length).toBe(2); + allObjectChips[1].click(); + + expect(rendered.queryByText('nested object a')).toBeInTheDocument(); + expect(rendered.queryByText('nested prop b')).toBeInTheDocument(); + expect(rendered.queryByText('nested object c')).toBeInTheDocument(); + }); + + it('renders action with object input type and no properties', async () => { + scaffolderApiMock.listActions.mockResolvedValue([ + { + id: 'test', + description: 'example description', + schema: { + input: { + type: 'object', + required: ['foobar'], + properties: { + foobar: { + title: 'Test object', + type: ['object'], + }, + }, + }, + }, + }, + ]); + const rendered = await renderInTestApp( + + + , + { + mountedRoutes: { + '/create/actions': rootRouteRef, + }, + }, + ); + + expect(rendered.getByText('Test object')).toBeInTheDocument(); + const objectChip = rendered.getByText('object'); + expect(objectChip).toBeInTheDocument(); + + expect(rendered.queryByText('No schema defined')).not.toBeInTheDocument(); + + objectChip.click(); + + expect(rendered.queryByText('No schema defined')).toBeInTheDocument(); + }); + + it('renders action with array(string) input type', async () => { + scaffolderApiMock.listActions.mockResolvedValue([ + { + id: 'test', + description: 'example description', + schema: { + input: { + type: 'object', + properties: { + foobar: { + title: 'Test array', + type: 'array', + items: { + type: 'string', + }, + }, + }, + }, + }, + }, + ]); + const rendered = await renderInTestApp( + + + , + { + mountedRoutes: { + '/create/actions': rootRouteRef, + }, + }, + ); + + expect(rendered.getByText('Test array')).toBeInTheDocument(); + expect(rendered.getByText('array(string)')).toBeInTheDocument(); + }); + + it('renders action with array(object) input type', async () => { + scaffolderApiMock.listActions.mockResolvedValue([ + { + id: 'test', + description: 'example description', + schema: { + input: { + type: 'object', + properties: { + foobar: { + title: 'Test array', + type: 'array', + items: { + title: 'nested object', + type: 'object', + properties: { + a: { + title: 'nested object a', + type: 'object', + properties: { + c: { + title: 'nested object c', + type: 'object', + }, + }, + }, + b: { + title: 'nested prop b', + type: 'number', + }, + }, + }, + }, + }, + }, + }, + }, + ]); + const rendered = await renderInTestApp( + + + , + { + mountedRoutes: { + '/create/actions': rootRouteRef, + }, + }, + ); + + expect(rendered.getByText('Test array')).toBeInTheDocument(); + const objectChip = rendered.getByText('array(object)'); + expect(objectChip).toBeInTheDocument(); + + expect(rendered.queryByText('nested object a')).not.toBeInTheDocument(); + expect(rendered.queryByText('nested prop b')).not.toBeInTheDocument(); + + objectChip.click(); + + expect(rendered.queryByText('nested object a')).toBeInTheDocument(); + expect(rendered.queryByText('nested prop b')).toBeInTheDocument(); + }); + + it('renders action with array input type and no items', async () => { + scaffolderApiMock.listActions.mockResolvedValue([ + { + id: 'test', + description: 'example description', + schema: { + input: { + type: 'object', + properties: { + foo: { + type: 'array', + }, + }, + }, + }, + }, + ]); + const rendered = await renderInTestApp( + + + , + { + mountedRoutes: { + '/create/actions': rootRouteRef, + }, + }, + ); + + expect(rendered.getByText('array(unknown)')).toBeInTheDocument(); + }); }); diff --git a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx index 10a272b3cf..3f21b75322 100644 --- a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx +++ b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx @@ -13,43 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { Fragment } from 'react'; +import React, { Fragment, useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; import { ActionExample, scaffolderApiRef, } from '@backstage/plugin-scaffolder-react'; import { - Typography, + Accordion, + AccordionDetails, + AccordionSummary, + Box, + Collapse, + Grid, + makeStyles, Paper, Table, TableBody, - Box, - Chip, TableCell, TableContainer, TableHead, TableRow, - Grid, - makeStyles, - Accordion, - AccordionSummary, - AccordionDetails, + Typography, } from '@material-ui/core'; import { JSONSchema7, JSONSchema7Definition } from 'json-schema'; import classNames from 'classnames'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import ExpandLessIcon from '@material-ui/icons/ExpandLess'; import { useApi } from '@backstage/core-plugin-api'; import { - Progress, - Content, - Header, - Page, - ErrorPage, CodeSnippet, + Content, + ErrorPage, + Header, MarkdownContent, + Page, + Progress, } from '@backstage/core-components'; +import Chip from '@material-ui/core/Chip'; const useStyles = makeStyles(theme => ({ code: { @@ -111,6 +113,7 @@ export const ActionsPage = () => { const { loading, value, error } = useAsync(async () => { return api.listActions(); }); + const [isExpanded, setIsExpanded] = useState<{ [key: string]: boolean }>({}); if (loading) { return ; @@ -125,41 +128,9 @@ export const ActionsPage = () => { ); } - const formatRows = (input: JSONSchema7) => { - const properties = input.properties; - if (!properties) { - return undefined; - } - - return Object.entries(properties).map(entry => { - const [key] = entry; - const props = entry[1] as unknown as JSONSchema7; - const codeClassname = classNames(classes.code, { - [classes.codeRequired]: input.required?.includes(key), - }); - - return ( - - -
{key}
-
- {props.title} - {props.description} - - <> - {[props.type].flat().map(type => ( - - ))} - - -
- ); - }); - }; - - const renderTable = (input: JSONSchema7) => { - if (!input.properties) { - return undefined; + const renderTable = (rows?: JSX.Element[]) => { + if (!rows || rows.length < 1) { + return No schema defined; } return ( @@ -172,13 +143,108 @@ export const ActionsPage = () => { Type - {formatRows(input)} + {rows} ); }; - const renderTables = (name: string, input?: JSONSchema7Definition[]) => { + const getTypes = (properties: JSONSchema7) => { + if (!properties.type) { + return ['unknown']; + } + + if (properties.type !== 'array') { + return [properties.type].flat(); + } + + return [ + `${properties.type}(${ + (properties.items as JSONSchema7 | undefined)?.type ?? 'unknown' + })`, + ]; + }; + + const formatRows = (parentId: string, input?: JSONSchema7) => { + const properties = input?.properties; + if (!properties) { + return undefined; + } + + return Object.entries(properties).map(entry => { + const [key] = entry; + const id = `${parentId}.${key}`; + const props = entry[1] as unknown as JSONSchema7; + const codeClassname = classNames(classes.code, { + [classes.codeRequired]: input.required?.includes(key), + }); + const types = getTypes(props); + + return ( + + + +
{key}
+
+ {props.title} + {props.description} + + {types.map(type => + type.includes('object') ? ( + : + } + variant="outlined" + onClick={() => + setIsExpanded(prevState => { + const state = { ...prevState }; + state[id] = !prevState[id]; + return state; + }) + } + /> + ) : ( + + ), + )} + +
+ + + + + + {key} + + {renderTable( + formatRows( + id, + props.type === 'array' + ? ({ + properties: + (props.items as JSONSchema7 | undefined) + ?.properties ?? {}, + } as unknown as JSONSchema7 | undefined) + : props, + ), + )} + + + + +
+ ); + }); + }; + + const renderTables = ( + name: string, + id: string, + input?: JSONSchema7Definition[], + ) => { if (!input) { return undefined; } @@ -187,7 +253,11 @@ export const ActionsPage = () => { <> {name} {input.map((i, index) => ( -
{renderTable(i as unknown as JSONSchema7)}
+
+ {renderTable( + formatRows(`${id}.${index}`, i as unknown as JSONSchema7), + )} +
))} ); @@ -198,7 +268,11 @@ export const ActionsPage = () => { return undefined; } - const oneOf = renderTables('oneOf', action.schema?.input?.oneOf); + const oneOf = renderTables( + 'oneOf', + `${action.id}.input`, + action.schema?.input?.oneOf, + ); return ( @@ -208,14 +282,18 @@ export const ActionsPage = () => { {action.schema?.input && ( Input - {renderTable(action.schema.input)} + {renderTable( + formatRows(`${action.id}.input`, action?.schema?.input), + )} {oneOf} )} {action.schema?.output && ( Output - {renderTable(action.schema.output)} + {renderTable( + formatRows(`${action.id}.output`, action?.schema?.output), + )} )} {action.examples && ( diff --git a/plugins/scaffolder/src/components/TemplateList/TemplateList.test.tsx b/plugins/scaffolder/src/components/TemplateList/TemplateList.test.tsx index 2ea417ad68..c65613d2f5 100644 --- a/plugins/scaffolder/src/components/TemplateList/TemplateList.test.tsx +++ b/plugins/scaffolder/src/components/TemplateList/TemplateList.test.tsx @@ -77,7 +77,7 @@ describe('TemplateList', () => { { mountedRoutes: { '/': rootRouteRef } }, ); - expect(() => screen.getByTestId('t1')).toThrow(); - expect(screen.getByTestId('t2')).toBeDefined(); + expect(() => screen.getByTestId('t2')).toThrow(); + expect(screen.getByTestId('t1')).toBeDefined(); }); }); diff --git a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx index 9a88050d74..c925cdf6ef 100644 --- a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx +++ b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx @@ -59,7 +59,7 @@ export const TemplateList = ({ const templateEntities = entities.filter(isTemplateEntityV1beta3); const maybeFilteredEntities = ( group ? templateEntities.filter(group.filter) : templateEntities - ).filter(e => (templateFilter ? !templateFilter(e) : true)); + ).filter(e => (templateFilter ? templateFilter(e) : true)); const titleComponent: React.ReactNode = (() => { if (group && group.title) { diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md new file mode 100644 index 0000000000..1d806026e3 --- /dev/null +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -0,0 +1,37 @@ +# @backstage/plugin-search-backend-module-catalog + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 0.1.0-next.0 + +### Minor Changes + +- 01ae205352e: Package introduced to export search backend modules that can be used with the new backend system to extend search with plugin specific functionality, such as collators. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index 4c323ae7fd..56f09a03f5 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-catalog", "description": "A module for the search backend that exports catalog modules", - "version": "0.0.0", + "version": "0.1.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index a7ef318ec1..b501b4aee7 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 1.2.0-next.1 + +### Minor Changes + +- 1469daa409e: Search backend modules migrated to the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 1.1.5-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 285ab4e2fe..0400f0b407 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", "description": "A module for the search backend that implements search using ElasticSearch", - "version": "1.1.5-next.0", + "version": "1.2.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md new file mode 100644 index 0000000000..f1c8c79c3c --- /dev/null +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -0,0 +1,31 @@ +# @backstage/plugin-search-backend-module-explore + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 0.1.0-next.0 + +### Minor Changes + +- 01ae205352e: Package introduced to export search backend modules that can be used with the new backend system to extend search with plugin specific functionality, such as collators. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.3-next.0 diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index e4c71448ff..d448d0ee51 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-explore", "description": "A module for the search backend that exports explore modules", - "version": "0.0.0", + "version": "0.1.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 8f3f01e83c..e7e998018c 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 0.5.5-next.1 + +### Patch Changes + +- 1469daa409e: Search backend modules migrated to the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). +- Updated dependencies + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 0.5.5-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 28432f2025..ce1d5f174a 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-pg", "description": "A module for the search backend that implements search using PostgreSQL", - "version": "0.5.5-next.0", + "version": "0.5.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts index 59c8d85562..2f99a02521 100644 --- a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts +++ b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts @@ -44,6 +44,8 @@ function createDatabaseManager( }; } +jest.setTimeout(60_000); + describe('DatabaseDocumentStore', () => { describe('unsupported', () => { const databases = TestDatabases.create({ @@ -58,7 +60,6 @@ describe('DatabaseDocumentStore', () => { expect(supported).toBe(false); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -71,7 +72,6 @@ describe('DatabaseDocumentStore', () => { async () => await DatabaseDocumentStore.create(databaseManager), ).rejects.toThrow(); }, - 60_000, ); }); @@ -102,7 +102,6 @@ describe('DatabaseDocumentStore', () => { expect(supported).toBe(true); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -131,7 +130,6 @@ describe('DatabaseDocumentStore', () => { await knex.count('*').where('type', 'my-type').from('documents'), ).toEqual([{ count: '2' }]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -172,7 +170,6 @@ describe('DatabaseDocumentStore', () => { await knex.count('*').where('type', 'my-type').from('documents'), ).toEqual([{ count: '4' }]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -219,7 +216,6 @@ describe('DatabaseDocumentStore', () => { await knex.count('*').where('type', 'my-type').from('documents'), ).toEqual([{ count: '0' }]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -270,7 +266,6 @@ describe('DatabaseDocumentStore', () => { }, ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -325,7 +320,6 @@ describe('DatabaseDocumentStore', () => { }, ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -378,7 +372,6 @@ describe('DatabaseDocumentStore', () => { }, ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -433,7 +426,6 @@ describe('DatabaseDocumentStore', () => { }, ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -498,7 +490,6 @@ describe('DatabaseDocumentStore', () => { }, ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -551,7 +542,6 @@ describe('DatabaseDocumentStore', () => { }, ]); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -610,7 +600,6 @@ describe('DatabaseDocumentStore', () => { }, ]); }, - 60_000, ); }); }); diff --git a/plugins/search-backend-module-pg/src/database/util.test.ts b/plugins/search-backend-module-pg/src/database/util.test.ts index b3df5a3ad4..781805b3a3 100644 --- a/plugins/search-backend-module-pg/src/database/util.test.ts +++ b/plugins/search-backend-module-pg/src/database/util.test.ts @@ -16,6 +16,8 @@ import { TestDatabases } from '@backstage/backend-test-utils'; import { queryPostgresMajorVersion } from './util'; +jest.setTimeout(60_000); + describe('util', () => { describe('unsupported', () => { const databases = TestDatabases.create({ @@ -31,7 +33,6 @@ describe('util', () => { async () => await queryPostgresMajorVersion(knex), ).rejects.toThrow(); }, - 60_000, ); }); @@ -56,7 +57,6 @@ describe('util', () => { expectedVersion, ); }, - 60_000, ); }); }); diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md new file mode 100644 index 0000000000..2629004017 --- /dev/null +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -0,0 +1,39 @@ +# @backstage/plugin-search-backend-module-techdocs + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-techdocs-node@1.6.1-next.2 + +## 0.1.0-next.0 + +### Minor Changes + +- 01ae205352e: Package introduced to export search backend modules that can be used with the new backend system to extend search with plugin specific functionality, such as collators. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-techdocs-node@1.6.1-next.1 diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index d08193be29..d2e28b9be4 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", "description": "A module for the search backend that exports techdocs modules", - "version": "0.0.0", + "version": "0.1.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index ed51a90369..62b802616f 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-search-backend-node +## 1.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 1.2.0-next.1 + +### Minor Changes + +- 1469daa409e: Exports services and extension points that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 1.1.5-next.0 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index a49b6088ab..178882b4fe 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-node", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", - "version": "1.1.5-next.0", + "version": "1.2.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index d6985a70f1..f7b920da78 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-search-backend +## 1.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 1.3.0-next.1 + +### Minor Changes + +- 1469daa409e: Exports search plugin that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 1.2.5-next.0 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index e8277afa2d..57230dad16 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "1.2.5-next.0", + "version": "1.3.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-common/CHANGELOG.md b/plugins/search-common/CHANGELOG.md index 893e6cc89d..e3b3b6826f 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-common +## 1.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/types@1.0.2 + ## 1.2.2 ### Patch Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index a7c8de1c9f..3e1877f7f8 100644 --- a/plugins/search-common/package.json +++ b/plugins/search-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-common", "description": "Common functionalities for Search, to be shared between various search-enabled plugins", - "version": "1.2.2", + "version": "1.2.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 22bf885caf..5f805f5760 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-search-react +## 1.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 1.5.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 1.5.2-next.0 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 0a8864392b..188834a695 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.5.2-next.0", + "version": "1.5.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,19 +40,21 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "lodash": "^4.17.21", "qs": "^6.9.4", "react-use": "^17.3.2" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index d5f44e058c..fc1f22f81c 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-search +## 1.2.0-next.2 + +### Minor Changes + +- d6b73b0380d: Search modal auto closes on location change + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## 1.1.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 1.1.2-next.0 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index d4e93d6f45..98151c9d3f 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search", "description": "The Backstage plugin that provides your backstage app with search", - "version": "1.1.2-next.0", + "version": "1.2.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -46,12 +46,13 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "qs": "^6.9.4", "react-use": "^17.2.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -59,12 +60,14 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", "cross-fetch": "^3.1.5", + "history": "^5.0.0", "msw": "^1.0.0" }, "files": [ diff --git a/plugins/search/src/components/SearchModal/SearchModal.tsx b/plugins/search/src/components/SearchModal/SearchModal.tsx index c32c9a5cc3..3513eec65d 100644 --- a/plugins/search/src/components/SearchModal/SearchModal.tsx +++ b/plugins/search/src/components/SearchModal/SearchModal.tsx @@ -92,7 +92,7 @@ const useStyles = makeStyles(theme => ({ viewResultsLink: { verticalAlign: '0.5em' }, })); -export const Modal = ({ toggleModal }: SearchModalProps) => { +export const Modal = () => { const classes = useStyles(); const navigate = useNavigate(); const { transitions } = useTheme(); @@ -107,9 +107,8 @@ export const Modal = ({ toggleModal }: SearchModalProps) => { }); const handleSearchResultClick = useCallback(() => { - toggleModal(); setTimeout(focusContent, transitions.duration.leavingScreen); - }, [toggleModal, focusContent, transitions]); + }, [focusContent, transitions]); const handleSearchBarKeyDown = useCallback( (e: KeyboardEvent) => { @@ -187,9 +186,7 @@ export const SearchModal = (props: SearchModalProps) => { > {open && ( - {(children && children({ toggleModal })) ?? ( - - )} + {(children && children({ toggleModal })) ?? } )}
diff --git a/plugins/search/src/components/SearchModal/useSearchModal.test.tsx b/plugins/search/src/components/SearchModal/useSearchModal.test.tsx index 424dffff76..0de41e3589 100644 --- a/plugins/search/src/components/SearchModal/useSearchModal.test.tsx +++ b/plugins/search/src/components/SearchModal/useSearchModal.test.tsx @@ -13,9 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +import React from 'react'; import { act, renderHook } from '@testing-library/react-hooks'; import { useSearchModal } from './useSearchModal'; +import { BrowserRouter, Router } from 'react-router-dom'; +import { createMemoryHistory } from 'history'; describe('useSearchModal', () => { it.each([ @@ -24,14 +26,18 @@ describe('useSearchModal', () => { ])( 'should return the correct state when initial state is %s', (initialState, result) => { - const rendered = renderHook(() => useSearchModal(initialState)); + const rendered = renderHook(() => useSearchModal(initialState), { + wrapper: BrowserRouter, + }); expect(rendered.result.current.state).toEqual(result); }, ); it('should keep open forever to true once modal is toggled', () => { - const rendered = renderHook(() => useSearchModal()); + const rendered = renderHook(() => useSearchModal(), { + wrapper: BrowserRouter, + }); act(() => rendered.result.current.toggleModal()); expect(rendered.result.current.state).toEqual({ @@ -47,7 +53,9 @@ describe('useSearchModal', () => { }); it('should keep open to false if setOpen(false) is invoked on an initially closed modal', () => { - const rendered = renderHook(() => useSearchModal()); + const rendered = renderHook(() => useSearchModal(), { + wrapper: BrowserRouter, + }); act(() => rendered.result.current.setOpen(false)); expect(rendered.result.current.state).toEqual({ open: false, @@ -56,7 +64,9 @@ describe('useSearchModal', () => { }); it('should keep open forever to true even when the modal transition from opened to closed', () => { - const rendered = renderHook(() => useSearchModal()); + const rendered = renderHook(() => useSearchModal(), { + wrapper: BrowserRouter, + }); act(() => rendered.result.current.setOpen(true)); expect(rendered.result.current.state).toEqual({ @@ -70,4 +80,21 @@ describe('useSearchModal', () => { hidden: true, }); }); + + it('should hide when location changes', () => { + const history = createMemoryHistory({ initialEntries: ['/'] }); + + const rendered = renderHook(() => useSearchModal(true), { + wrapper: ({ children }) => ( + + {children} + + ), + }); + + expect(rendered.result.current.state.hidden).toBe(false); + act(() => history.push('/new/path')); + rendered.rerender(); + expect(rendered.result.current.state.hidden).toBe(true); + }); }); diff --git a/plugins/search/src/components/SearchModal/useSearchModal.tsx b/plugins/search/src/components/SearchModal/useSearchModal.tsx index db01765f0e..279484bd47 100644 --- a/plugins/search/src/components/SearchModal/useSearchModal.tsx +++ b/plugins/search/src/components/SearchModal/useSearchModal.tsx @@ -15,10 +15,12 @@ */ import React, { ReactNode, useCallback, useContext, useState } from 'react'; +import { useLocation } from 'react-router-dom'; import { createVersionedContext, createVersionedValueMap, } from '@backstage/version-bridge'; +import useUpdateEffect from 'react-use/lib/useUpdateEffect'; /** * The state of the search modal, as well as functions for changing the modal's @@ -96,7 +98,8 @@ export const SearchModalProvider = (props: SearchModalProviderProps) => { /** * Use this hook to manage the state of {@link SearchModal} - * and change its visibility. + * and change its visibility. Monitors route changes setting the hidden state + * to avoid having to call toggleModal on every result click. * * @public * @@ -105,10 +108,6 @@ export const SearchModalProvider = (props: SearchModalProviderProps) => { * functions for changing the visibility of the modal. */ export function useSearchModal(initialState = false) { - // Check for any existing parent context. - const parentContext = useContext(SearchModalContext); - const parentContextValue = parentContext?.atVersion(1); - const [state, setState] = useState({ hidden: !initialState, open: initialState, @@ -132,8 +131,23 @@ export function useSearchModal(initialState = false) { [], ); + // Check for any existing parent context. + const parentContext = useContext(SearchModalContext); + const parentContextValue = parentContext?.atVersion(1); + const isParentContextPresent = !!parentContextValue?.state; + + // Monitor route changes to automatically hide the modal. + const location = useLocation(); + const locationKey = `${location.pathname}${location.search}${location.hash}`; + useUpdateEffect(() => { + setState(prevState => ({ + open: prevState.open, + hidden: true, + })); + }, [locationKey]); + // Inherit from parent context, if set. - return parentContextValue?.state + return isParentContextPresent ? parentContextValue : { state, toggleModal, setOpen }; } diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index ca34f2ea92..6a9f0a999d 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-sentry +## 0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.5.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.5.2-next.0 ### Patch Changes diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index 6118517558..be2eb5c02b 100644 --- a/plugins/sentry/package.json +++ b/plugins/sentry/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sentry", "description": "A Backstage plugin that integrates towards Sentry", - "version": "0.5.2-next.0", + "version": "0.5.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,6 +38,7 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/theme": "workspace:^", + "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -48,6 +49,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -55,6 +57,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index c6094589d8..5121115a86 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-shortcuts +## 0.3.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + +## 0.3.9-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + ## 0.3.9-next.0 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index d84cf27223..fba65e7b5e 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-shortcuts", "description": "A Backstage plugin that provides a shortcuts feature to the sidebar", - "version": "0.3.9-next.0", + "version": "0.3.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,6 +37,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -44,10 +45,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "@types/zen-observable": "^0.8.2", "cross-fetch": "^3.1.5", "msw": "^1.0.0" diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index 1989ad3426..7a2d2c46ea 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-sonarqube-backend +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.1.9-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.1.9-next.0 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index b69b851115..c7417b6b06 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.1.9-next.0", + "version": "0.1.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,8 +33,8 @@ "yn": "^5.0.0" }, "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", - "@backstage/test-utils": "workspace:^", "@types/supertest": "^2.0.12", "msw": "^1.0.0", "supertest": "^6.2.4" diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts index 5675d635e1..72ab2ecee2 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts @@ -20,7 +20,7 @@ import { SonarqubeConfig, } from './sonarqubeInfoProvider'; import { setupServer } from 'msw/node'; -import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { rest, RestRequest } from 'msw'; describe('SonarqubeConfig', () => { diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md index ae337f220e..94bc754364 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-sonarqube-react +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + +## 0.1.5-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.4 ### Patch Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index 442a747717..b0e36b742b 100644 --- a/plugins/sonarqube-react/package.json +++ b/plugins/sonarqube-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-react", - "version": "0.1.4", + "version": "0.1.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,10 +44,13 @@ "@backstage/core-plugin-api": "workspace:^" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@types/react": "^16.13.1 || ^17.0.0" }, "files": [ "dist", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index 810d2125c0..327f0c7793 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-sonarqube +## 0.6.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-sonarqube-react@0.1.5-next.1 + +## 0.6.6-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-sonarqube-react@0.1.5-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.6.6-next.0 ### Patch Changes diff --git a/plugins/sonarqube/dev/index.tsx b/plugins/sonarqube/dev/index.tsx index 8d38c7314a..33a36bcaef 100644 --- a/plugins/sonarqube/dev/index.tsx +++ b/plugins/sonarqube/dev/index.tsx @@ -66,9 +66,6 @@ createDevApp() - - -
@@ -79,7 +76,7 @@ createDevApp() deps: {}, factory: () => ({ - getFindingSummary: async componentKey => { + getFindingSummary: async ({ componentKey }) => { switch (componentKey) { case 'error': throw new Error('Error!'); diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 672888057a..722614b030 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.6.6-next.0", + "version": "0.6.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -50,17 +50,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "msw": "^1.0.0" }, "files": [ diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index 8295e1c7ce..54be3f285e 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-splunk-on-call +## 0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.19-next.0 + +## 0.4.6-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + ## 0.4.6-next.0 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index fd7e6b524f..f88131357c 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-splunk-on-call", "description": "A Backstage plugin that integrates towards Splunk On-Call", - "version": "0.4.6-next.0", + "version": "0.4.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -47,6 +47,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -54,11 +55,13 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/luxon": "^3.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index bc76962999..5b227da921 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-stack-overflow-backend +## 0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index a3fba58bbe..a0430707b4 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.1.13-next.0", + "version": "0.1.13-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index 8c8ae16170..1d6a48b625 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-stack-overflow +## 0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-home@0.4.33-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + +## 0.1.13-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-home@0.4.33-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 94cc071af4..163c70e758 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow", - "version": "0.1.13-next.0", + "version": "0.1.13-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,20 +32,23 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@testing-library/jest-dom": "^5.10.1", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "lodash": "^4.17.21", "qs": "^6.9.4", "react-use": "^17.2.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", diff --git a/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx b/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx index 8fce24bd22..8d8aeccb3b 100644 --- a/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx +++ b/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx @@ -59,7 +59,7 @@ export const Content = (props: StackOverflowQuestionsContentProps) => { return could not load questions; } - const getSecondaryText = (answer_count: Number) => + const getSecondaryText = (answer_count: number) => answer_count > 1 ? `${answer_count} answers` : `${answer_count} answer`; return ( diff --git a/plugins/stackstorm/CHANGELOG.md b/plugins/stackstorm/CHANGELOG.md index 9899f2f05f..f939f4669e 100644 --- a/plugins/stackstorm/CHANGELOG.md +++ b/plugins/stackstorm/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-stackstorm +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.1.1-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/errors@1.1.5 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/stackstorm/package.json b/plugins/stackstorm/package.json index ff432f9199..0cba270449 100644 --- a/plugins/stackstorm/package.json +++ b/plugins/stackstorm/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-stackstorm", "description": "A Backstage plugin that integrates towards StackStorm", - "version": "0.1.1-next.0", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,17 +43,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "*", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index cc49a78340..d6c2ac84c6 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.28-next.2 + +### Patch Changes + +- 9cb1db6546a: When multiple fact retrievers are used for a check, allow for cases where only one returns a given fact +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.2 + +## 0.1.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.1 + ## 0.1.28-next.0 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/README.md b/plugins/tech-insights-backend-module-jsonfc/README.md index f61666d671..5940d39b15 100644 --- a/plugins/tech-insights-backend-module-jsonfc/README.md +++ b/plugins/tech-insights-backend-module-jsonfc/README.md @@ -86,6 +86,11 @@ export const exampleCheck: TechInsightJsonRuleCheck = { }; ``` +### More than one `factIds` for a check. + +When more than one is supplied, the requested fact **MUST** be present in at least one of the fact retrievers. +The order of the fact retrievers defined in the `factIds` array has no bearing on the checks, the check will merge all facts from the various retrievers, and then check against latest fact . + # Custom operators json-rules-engine supports a limited [number of built-in operators](https://github.com/CacheControl/json-rules-engine/blob/master/docs/rules.md#operators) that can be used in conditions. You can add your own operators by adding them to the `operators` array in the `JsonRulesEngineFactCheckerFactory` constructor. For example: diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index 3e6b08c65b..fb549384a0 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.28-next.0", + "version": "0.1.28-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.test.ts b/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.test.ts index 0d651be178..7fbc2e320b 100644 --- a/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.test.ts +++ b/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.test.ts @@ -129,6 +129,98 @@ const testChecks: Record = { }, ], + twoRetrieversSame: [ + { + id: 'twoRetrieversSameCheck', + name: 'twoRetrieversSameCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + description: 'Two Retriever Check For Testing', + factIds: [ + 'test-factretriever', + 'test-factretriever-same-fact', + 'non-existing-factretriever', + ], + rule: { + conditions: { + all: [ + { + fact: 'testnumberfact', + operator: 'greaterThan', + value: 2, + }, + ], + }, + }, + }, + ], + + twoRetrieversDifferent: [ + { + id: 'twoRetrieversDifferentCheck', + name: 'twoRetrieversDifferentCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + description: 'Two Retriever Check For Testing', + factIds: ['test-factretriever-different-fact', 'test-factretriever'], + rule: { + conditions: { + all: [ + { + fact: 'testnumberfact', + operator: 'greaterThan', + value: 2, + }, + ], + }, + }, + }, + ], + + twoRetrieversDifferentOrder: [ + { + id: 'twoRetrieversDifferentOrderCheck', + name: 'twoRetrieversDifferentOrderCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + description: 'Two Retriever Check For Testing', + factIds: ['test-factretriever', 'test-factretriever-different-fact'], + rule: { + conditions: { + all: [ + { + fact: 'testnumberfact', + operator: 'greaterThan', + value: 2, + }, + ], + }, + }, + }, + ], + + twoRetrieversOnlyOneData: [ + { + id: 'twoRetrieversOnlyOneDataCheck', + name: 'twoRetrieversOnlyOneDataCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + description: 'Two Retriever Check For Testing', + factIds: [ + 'test-factretriever', + 'test-factretriever-no-fact', + 'non-existing-factretriever', + ], + rule: { + conditions: { + all: [ + { + fact: 'testnumberfact', + operator: 'greaterThan', + value: 2, + }, + ], + }, + }, + }, + ], + customOperator: [ { id: 'customOperatorTestCheck', @@ -184,16 +276,75 @@ const latestSchemasMock = jest.fn().mockImplementation(() => [ description: '', }, }, -]); -const factsBetweenTimestampsByIdsMock = jest.fn(); -const latestFactsByIdsMock = jest.fn().mockResolvedValue({ - ['test-factretriever']: { - id: 'test-factretriever', - facts: { - testnumberfact: 3, + { + version: '0.0.1', + id: 3, + ref: 'test-factretriever-no-fact', + entityTypes: ['component'], + testnumberfact: { + type: 'integer', + description: '', }, }, -}); + { + version: '0.0.1', + id: 4, + ref: 'test-factretriever-same-fact', + entityTypes: ['component'], + testnumberfact: { + type: 'integer', + description: '', + }, + }, + { + version: '0.0.1', + id: 5, + ref: 'test-factretriever-different-fact', + entityTypes: ['users'], + testnumberfact: { + type: 'integer', + description: '', + }, + }, +]); +const factsBetweenTimestampsByIdsMock = jest.fn(); +const latestFactsByIdsMock = jest + .fn() + .mockImplementation((factIds: string[]) => { + const facts = [ + { + id: 'test-factretriever-different-fact', + facts: { + testnumberfact: 1, + }, + }, + { + id: 'test-factretriever-same-fact', + facts: { + testnumberfact: 3, + }, + }, + { + id: 'test-factretriever', + facts: { + testnumberfact: 3, + }, + }, + { + id: 'test-factretriever-no-fact', + facts: {}, + }, + ]; + + const factResults = Object.fromEntries( + factIds + .map(factId => facts.filter(fact => fact.id === factId)) + .flat() + .map(fact => [fact.id, fact]), + ); + + return factResults; + }); const mockCheckRegistry = { getAll(checks: string[]) { return checks.flatMap(check => testChecks[check]); @@ -281,6 +432,174 @@ describe('JsonRulesEngineFactChecker', () => { }); }); + it('should respond with result, facts, fact schemas and checks for multiple retrievers', async () => { + const results = await factChecker.runChecks('a/a/a', [ + 'twoRetrieversSame', + ]); + expect(results).toHaveLength(1); + expect(results[0]).toMatchObject({ + facts: { + testnumberfact: { + value: 3, + type: 'integer', + description: '', + }, + }, + result: true, + check: { + id: 'twoRetrieversSameCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + name: 'twoRetrieversSameCheck', + description: 'Two Retriever Check For Testing', + factIds: [ + 'test-factretriever', + 'test-factretriever-same-fact', + 'non-existing-factretriever', + ], + rule: { + conditions: { + all: [ + { + fact: 'testnumberfact', + factResult: 3, + operator: 'greaterThan', + result: true, + value: 2, + }, + ], + priority: 1, + }, + }, + }, + }); + }); + + it('should respond with result, facts, fact schemas and checks for multiple retrievers with the last fact winning', async () => { + const results = await factChecker.runChecks('a/a/a', [ + 'twoRetrieversDifferent', + 'twoRetrieversDifferentOrder', + ]); + + expect(results).toHaveLength(2); + expect(results[0]).toMatchObject({ + facts: { + testnumberfact: { + value: 3, + type: 'integer', + description: '', + }, + }, + result: true, + check: { + id: 'twoRetrieversDifferentCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + name: 'twoRetrieversDifferentCheck', + description: 'Two Retriever Check For Testing', + factIds: ['test-factretriever-different-fact', 'test-factretriever'], + rule: { + conditions: { + all: [ + { + fact: 'testnumberfact', + factResult: 3, + operator: 'greaterThan', + result: true, + value: 2, + }, + ], + priority: 1, + }, + }, + }, + }); + expect(results[1]).toMatchObject({ + facts: { + testnumberfact: { + value: 3, + type: 'integer', + description: '', + }, + }, + result: true, + check: { + id: 'twoRetrieversDifferentOrderCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + name: 'twoRetrieversDifferentOrderCheck', + description: 'Two Retriever Check For Testing', + factIds: ['test-factretriever', 'test-factretriever-different-fact'], + rule: { + conditions: { + all: [ + { + fact: 'testnumberfact', + factResult: 3, + operator: 'greaterThan', + result: true, + value: 2, + }, + ], + priority: 1, + }, + }, + }, + }); + }); + + it('the ordering of the factIds do not effect the result, its just which fact is last.', async () => { + const resultsDIfferentFirst = await factChecker.runChecks('a/a/a', [ + 'twoRetrieversDifferent', + ]); + const resultsDIfferentSecond = await factChecker.runChecks('a/a/a', [ + 'twoRetrieversDifferentOrder', + ]); + + expect(resultsDIfferentFirst[0].result).not.toEqual( + resultsDIfferentSecond[0].result, + ); + }); + + it('should respond with result, facts, fact schemas and checks for multiple retrievers one without data', async () => { + const results = await factChecker.runChecks('a/a/a', [ + 'twoRetrieversOnlyOneData', + ]); + expect(results).toHaveLength(1); + expect(results[0]).toMatchObject({ + facts: { + testnumberfact: { + value: 3, + type: 'integer', + description: '', + }, + }, + result: true, + check: { + id: 'twoRetrieversOnlyOneDataCheck', + type: JSON_RULE_ENGINE_CHECK_TYPE, + name: 'twoRetrieversOnlyOneDataCheck', + description: 'Two Retriever Check For Testing', + factIds: [ + 'test-factretriever', + 'test-factretriever-no-fact', + 'non-existing-factretriever', + ], + rule: { + conditions: { + all: [ + { + fact: 'testnumberfact', + factResult: 3, + operator: 'greaterThan', + result: true, + value: 2, + }, + ], + priority: 1, + }, + }, + }, + }); + }); + it('should use custom operators when defined', async () => { const results = await factChecker.runChecks('a/a/a', ['customOperator']); expect(results).toHaveLength(1); diff --git a/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.ts b/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.ts index c36c0ae6de..721c9b3c62 100644 --- a/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.ts +++ b/plugins/tech-insights-backend-module-jsonfc/src/service/JsonRulesEngineFactChecker.ts @@ -104,14 +104,13 @@ export class JsonRulesEngineFactChecker : await this.checkRegistry.list(); const factIds = techInsightChecks.flatMap(it => it.factIds); const facts = await this.repository.getLatestFactsByIds(factIds, entity); + techInsightChecks.forEach(techInsightCheck => { const rule = techInsightCheck.rule; rule.name = techInsightCheck.id; // Only run checks that have all the facts available: - const hasAllFacts = techInsightCheck.factIds.every( - factId => facts[factId], - ); - if (hasAllFacts) { + const hasFacts = techInsightCheck.factIds.some(factId => facts[factId]); + if (hasFacts) { engine.addRule({ ...techInsightCheck.rule, event: noopEvent }); } else { this.logger.debug( diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index 95497c3b88..1dc5782caf 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-tech-insights-backend +## 0.5.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.2 + +## 0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.2-next.1 + ## 0.5.10-next.0 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index f6bae36e6b..a8a90c7a1e 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.10-next.0", + "version": "0.5.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts index 37c7cdf3ca..5bf05cda98 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { FactRetriever, FactRetrieverRegistration, @@ -34,6 +35,7 @@ import { ConfigReader } from '@backstage/config'; import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; import { TaskScheduler } from '@backstage/backend-tasks'; +jest.setTimeout(60_000); jest.useFakeTimers(); const testFactRetriever: FactRetriever = { @@ -175,7 +177,6 @@ describe('FactRetrieverEngine', () => { ); expect(schemaAssertionCallback).toHaveBeenCalled(); }, - 60_000, ); it.each(databases.eachSupportedId())( @@ -227,6 +228,5 @@ describe('FactRetrieverEngine', () => { }), ); }, - 60_000, ); }); diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index 45583c194f..1baf8bcb35 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-tech-insights-node +## 0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + ## 0.4.2-next.0 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index d662258c3a..1b6a429fd0 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.4.2-next.0", + "version": "0.4.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index 52d6ce6102..3c729bf8df 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-tech-insights +## 0.3.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## 0.3.9-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + ## 0.3.9-next.0 ### Patch Changes diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 6bff5523dc..022b5bc24f 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.9-next.0", + "version": "0.3.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,12 +38,13 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", + "@types/react": "^16.13.1 || ^17.0.0", "qs": "^6.9.4", "react-use": "^17.2.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -51,6 +52,7 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index 0ce2e73a86..215aa011b5 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-tech-radar +## 0.6.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/theme@0.2.19-next.0 + +## 0.6.3-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + ## 0.6.3-next.0 ### Patch Changes diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index d02a4a0695..622930a67d 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-tech-radar", "description": "A Backstage plugin that lets you display a Tech Radar for your organization", - "version": "0.6.3-next.0", + "version": "0.6.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,13 +44,16 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index cd86a795f3..5c290d700d 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/plugin-techdocs@1.6.1-next.2 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/test-utils@1.3.0-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-catalog@1.10.0-next.2 + - @backstage/plugin-search-react@1.5.2-next.2 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + +## 1.0.12-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/plugin-techdocs@1.6.1-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/test-utils@1.3.0-next.1 + - @backstage/plugin-catalog@1.10.0-next.1 + - @backstage/theme@0.2.19-next.0 + ## 1.0.12-next.0 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 23917a52cb..61eb206494 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.12-next.0", + "version": "1.0.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -46,11 +46,11 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@testing-library/react": "^12.1.3", + "@types/react": "^16.13.1 || ^17.0.0", "react-use": "^17.2.4", "testing-library__dom": "^7.29.4-beta.1" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" @@ -58,6 +58,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 80eab46ee0..751848bab2 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-techdocs-backend +## 1.6.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-techdocs-node@1.6.1-next.2 + +## 1.6.1-next.1 + +### Patch Changes + +- 01ae205352e: Collator factories instantiated in new backend system modules and now marked as deprecated. Will be continued to be exported publicly until the new backend system is fully rolled out. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.0 + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-techdocs-node@1.6.1-next.1 + ## 1.6.1-next.0 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 74af0e1010..73043942eb 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.6.1-next.0", + "version": "1.6.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 7d4e087301..856576a3df 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.12-next.2 + +### Patch Changes + +- c657d0a610e: Bump `photoswipe` dependency to `^5.3.7`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + +## 1.0.12-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/theme@0.2.19-next.0 + ## 1.0.12-next.0 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 05989fed44..f27bc99e27 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.0.12-next.0", + "version": "1.0.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,11 +44,13 @@ "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^20.0.0", "git-url-parse": "^13.0.0", - "photoswipe": "^5.3.5", + "photoswipe": "^5.3.7", "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", @@ -56,6 +58,7 @@ "@backstage/dev-utils": "workspace:^", "@backstage/plugin-techdocs-addons-test-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 041437bc89..0a6d87e679 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-techdocs-node +## 1.6.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-aws-node@0.1.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 1.6.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration-aws-node@0.1.2 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 1.6.1-next.0 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 1b0977fbdd..ed0ca977dd 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.6.1-next.0", + "version": "1.6.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 434ab32835..d984aaa3a4 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-techdocs-react +## 1.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/version-bridge@1.0.4-next.0 + +## 1.1.5-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + ## 1.1.5-next.0 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index e77a153e65..048829476d 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-react", "description": "Shared frontend utilities for TechDocs and Addons", - "version": "1.1.5-next.0", + "version": "1.1.5-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -41,14 +41,15 @@ "@material-ui/core": "^4.12.2", "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/styles": "^4.11.0", + "@types/react": "^16.13.1 || ^17.0.0", "jss": "~10.10.0", "lodash": "^4.17.21", "react-helmet": "6.1.0", "react-use": "^17.2.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 0b44055461..ecc4671ed8 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/plugin-techdocs +## 1.6.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + +## 1.6.1-next.1 + +### Patch Changes + +- 6c809d1a41c: Minor visual tweaks to adapt to changes in mkdocs-material v9 +- 847a1eee3da: Change anchor links color in Techdocs content + + With the color (mkdocs supplied) used for anchor links the background and foreground colors do not have a sufficient contrast ratio. Using the link color from theme palette. + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-search-common@1.2.3-next.0 + ## 1.6.1-next.0 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 2fd4effcdc..e91e5d1318 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.6.1-next.0", + "version": "1.6.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -49,6 +49,7 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@material-ui/styles": "^4.10.0", + "@types/react": "^16.13.1 || ^17.0.0", "dompurify": "^2.2.9", "event-source-polyfill": "1.0.25", "git-url-parse": "^13.0.0", @@ -58,7 +59,6 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0", "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" @@ -69,6 +69,7 @@ "@backstage/dev-utils": "workspace:^", "@backstage/plugin-techdocs-module-addons-contrib": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx index 4e8f331c7f..e11b7b6e81 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx @@ -18,7 +18,11 @@ import { act } from '@testing-library/react'; import { scmIntegrationsApiRef } from '@backstage/integration-react'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; -import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { + MockConfigApi, + renderInTestApp, + TestApiProvider, +} from '@backstage/test-utils'; import { techdocsApiRef, techdocsStorageApiRef } from '../../../api'; @@ -31,6 +35,7 @@ import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib'; import { FlatRoutes } from '@backstage/core-app-api'; import { Page } from '@backstage/core-components'; +import { configApiRef } from '@backstage/core-plugin-api'; const mockEntityMetadata = { locationMetadata: { @@ -80,11 +85,18 @@ jest.mock('@backstage/core-components', () => ({ Page: jest.fn(), })); +const configApi = new MockConfigApi({ + app: { + baseUrl: 'http://localhost:3000', + }, +}); + const Wrapper = ({ children }: { children: React.ReactNode }) => { return ( { - const navigate = useNavigate(); + const navigate = useNavigateUrl(); const theme = useTheme(); const isMobileMedia = useMediaQuery(MOBILE_MEDIA_QUERY); const sanitizerTransformer = useSanitizerTransformer(); @@ -176,7 +176,6 @@ export const useTechDocsReaderDom = ( // detect if CTRL or META keys are pressed so that links can be opened in a new tab with `window.open` const modifierActive = event.ctrlKey || event.metaKey; const parsedUrl = new URL(url); - const fullPath = `${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`; // capture link clicks within documentation const linkText = @@ -187,9 +186,9 @@ export const useTechDocsReaderDom = ( // hash exists when anchor is clicked on secondary sidebar if (parsedUrl.hash) { if (modifierActive) { - window.open(fullPath, '_blank'); + window.open(url, '_blank'); } else { - navigate(fullPath); + navigate(url); // Scroll to hash if it's on the current page transformedElement ?.querySelector(`[id="${parsedUrl.hash.slice(1)}"]`) @@ -197,9 +196,9 @@ export const useTechDocsReaderDom = ( } } else { if (modifierActive) { - window.open(fullPath, '_blank'); + window.open(url, '_blank'); } else { - navigate(fullPath); + navigate(url); } } }, diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/useNavigateUrl.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/useNavigateUrl.test.tsx new file mode 100644 index 0000000000..383ee4d688 --- /dev/null +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/useNavigateUrl.test.tsx @@ -0,0 +1,120 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { + MockConfigApi, + renderInTestApp, + TestApiProvider, +} from '@backstage/test-utils'; +import { resolveUrlToRelative, useNavigateUrl } from './useNavigateUrl'; +import { configApiRef } from '@backstage/core-plugin-api'; + +const navigate = jest.fn(); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useNavigate: () => navigate, +})); + +describe('resolveUrlToRelative', () => { + it('does nothing when app.baseUrl has no subpath', () => { + const url = 'http://localhost:3000/test'; + const baseUrl = 'http://localhost:3000'; + expect(resolveUrlToRelative(url, baseUrl)).toBe('/test'); + }); + + it('removes the app.baseUrl subpath when present', () => { + const url = 'http://localhost:3000/instance/test'; + const baseUrl = 'http://localhost:3000/instance'; + expect(resolveUrlToRelative(url, baseUrl)).toBe('/test'); + }); + + it('removes trailing slashes on the URL when present', () => { + const url = 'http://localhost:3000/test//'; + const baseUrl = 'http://localhost:3000'; + expect(resolveUrlToRelative(url, baseUrl)).toBe('/test'); + }); +}); + +const Component = ({ to }: { to: string }) => { + const navigateTo = useNavigateUrl(); + return <>{navigateTo(to)}; +}; + +describe('useNavigateUrl', () => { + beforeEach(() => { + navigate.mockReset(); + }); + it('navigates to the desired page as expected', async () => { + const baseUrl = 'http://localhost:3000'; + await renderInTestApp( + + + , + ); + expect(navigate).toHaveBeenCalledWith('/test'); + }); + it('handles app.baseUrl subpaths', async () => { + const baseUrl = 'http://localhost:3000/instance'; + await renderInTestApp( + + + , + ); + expect(navigate).toHaveBeenCalledWith('/test'); + }); + it('handles relative urls', async () => { + const baseUrl = 'http://localhost:3000'; + await renderInTestApp( + + + , + ); + expect(navigate).toHaveBeenCalledWith('/test'); + }); +}); diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/useNavigateUrl.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/useNavigateUrl.tsx new file mode 100644 index 0000000000..dfe1058d75 --- /dev/null +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/useNavigateUrl.tsx @@ -0,0 +1,79 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { configApiRef, useApi } from '@backstage/core-plugin-api'; +import { useCallback } from 'react'; +import { useNavigate } from 'react-router-dom'; + +/** + * Resolve a URL to a relative URL given a base URL that may or may not include subpaths. + * @param url - URL to parse into a relative url based on the baseUrl. + * @param baseUrl - Application base url, where the application is currently hosted. + * @returns relative path without any subpaths from website config. + */ +export function resolveUrlToRelative(url: string, baseUrl: string) { + const parsedAppUrl = new URL(baseUrl); + const appUrlPath = `${parsedAppUrl.origin}${parsedAppUrl.pathname.replace( + /\/$/, + '', + )}`; + + const relativeUrl = url + .replace(appUrlPath, '') + // Remove any leading and trailing slashes. + .replace(/\/+$/, '') + .replace(/^\/+/, ''); + const parsedUrl = new URL(`http://localhost/${relativeUrl}`); + return `${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`; +} + +/** + * A helper hook that allows for full internal website urls to be processed through the navigate + * hook provided by `react-router-dom`. + * + * NOTE: This does not support routing to external URLs. That should be done with a `Link` or `a` + * element instead, or just `window.location.href`. + * + * TODO: Update this to use `useRouteRef` instead of `useApi`. + * + * @returns Navigation function that is a wrapper over `react-router-dom`'s + * to support passing full URLs for navigation. + * + * @public + */ +export function useNavigateUrl() { + const navigate = useNavigate(); + const configApi = useApi(configApiRef); + const appBaseUrl = configApi.getOptionalString('app.baseUrl'); + const navigateFn = useCallback( + (to: string) => { + let url = to; + /** + * This should always be true when running the application, this just allows + * test cases that do not have the configApi set up to run still. + */ + if (appBaseUrl) { + try { + url = resolveUrlToRelative(to, appBaseUrl); + } catch (err) { + // URL passed in was relative. + } + } + navigate(url); + }, + [navigate, appBaseUrl], + ); + return navigateFn; +} diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts b/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts index 908cb39faf..07a667ed8e 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/variables.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { RuleOptions } from './types'; import { alpha, lighten } from '@material-ui/core'; +import { RuleOptions } from './types'; export default ({ theme }: RuleOptions) => ` /*================== Variables ==================*/ @@ -133,7 +133,7 @@ export default ({ theme }: RuleOptions) => ` /* TYPESET */ --md-typeset-font-size: 1rem; --md-typeset-color: var(--md-default-fg-color); - --md-typeset-a-color: var(--md-accent-fg-color); + --md-typeset-a-color: ${theme.palette.link}; --md-typeset-table-color: ${theme.palette.text.primary}; --md-typeset-del-color: ${ theme.palette.type === 'dark' diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index 793b7886c9..3477e36061 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-todo-backend +## 0.1.41-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.2 + +## 0.1.41-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.4.4-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.5-next.1 + ## 0.1.41-next.0 ### Patch Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index 6251ba4391..1e064c4017 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo-backend", "description": "A Backstage backend plugin that lets you browse TODO comments in your source code", - "version": "0.1.41-next.0", + "version": "0.1.41-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md index 9488bf45cd..929abebf01 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-todo +## 0.2.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.2.19-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.2.19-next.0 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index 32e653bb5e..54c1aca6b5 100644 --- a/plugins/todo/package.json +++ b/plugins/todo/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo", "description": "A Backstage plugin that lets you browse TODO comments in your source code", - "version": "0.2.19-next.0", + "version": "0.2.19-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,6 +43,7 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { @@ -50,10 +51,12 @@ "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 770c0a35fb..2b26814d27 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-user-settings-backend +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 3e8dc0302c..6143705d61 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings-backend", "description": "The Backstage backend plugin to manage user settings", - "version": "0.1.8-next.0", + "version": "0.1.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 926c4b94d4..c44041ae2a 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-user-settings +## 0.7.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + - @backstage/types@1.0.2 + +## 0.7.2-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + ## 0.7.2-next.0 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 63d8e18dd0..0e3ea1ff2a 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings", "description": "A Backstage plugin that provides a settings page", - "version": "0.7.2-next.0", + "version": "0.7.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -48,12 +48,14 @@ }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index 4e4de7bd92..4576354dce 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-vault-backend +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + ## 0.3.0-next.0 ### Minor Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index cf199f5f33..23b4058c7c 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.3.0-next.0", + "version": "0.3.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index 20ba9bf3b5..586cd17a33 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-vault +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.1.11-next.1 + +### Patch Changes + +- 29ba8267d69: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/errors@1.1.5 + ## 0.1.11-next.0 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index 2195a378af..b43e2a4e1f 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.11-next.0", + "version": "0.1.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -45,17 +45,21 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "*", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/plugins/vault/src/api.test.ts b/plugins/vault/src/api.test.ts index 471cadc87e..ec88412303 100644 --- a/plugins/vault/src/api.test.ts +++ b/plugins/vault/src/api.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { MockFetchApi, setupRequestMockHandlers } from '@backstage/test-utils'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { VaultSecret, VaultClient } from './api'; @@ -26,6 +26,7 @@ describe('api', () => { const mockBaseUrl = 'https://api-vault.com/api/vault'; const discoveryApi = UrlPatternDiscovery.compile(mockBaseUrl); + const fetchApi = new MockFetchApi(); const mockSecretsResult: { items: VaultSecret[] } = { items: [ @@ -65,7 +66,7 @@ describe('api', () => { it('should return secrets', async () => { setupHandlers(); - const api = new VaultClient({ discoveryApi }); + const api = new VaultClient({ discoveryApi, fetchApi }); expect(await api.listSecrets('test/success')).toEqual( mockSecretsResult.items, ); @@ -73,19 +74,19 @@ describe('api', () => { it('should return empty secret list', async () => { setupHandlers(); - const api = new VaultClient({ discoveryApi }); + const api = new VaultClient({ discoveryApi, fetchApi }); expect(await api.listSecrets('test/empty')).toEqual([]); }); it('should return all the secrets if no path defined', async () => { setupHandlers(); - const api = new VaultClient({ discoveryApi }); + const api = new VaultClient({ discoveryApi, fetchApi }); expect(await api.listSecrets('')).toEqual(mockSecretsResult.items); }); it('should throw an error if the Vault API responds with an HTTP 404', async () => { setupHandlers(); - const api = new VaultClient({ discoveryApi }); + const api = new VaultClient({ discoveryApi, fetchApi }); await expect(api.listSecrets('test/not-found')).rejects.toThrow( "No secrets found in path 'v1/secrets/test%2Fnot-found'", ); @@ -93,7 +94,7 @@ describe('api', () => { it('should throw an error if the Vault API responds with a non-successful HTTP status code', async () => { setupHandlers(); - const api = new VaultClient({ discoveryApi }); + const api = new VaultClient({ discoveryApi, fetchApi }); await expect(api.listSecrets('test/error')).rejects.toThrow( 'Request failed with 400 Error', ); diff --git a/plugins/vault/src/api.ts b/plugins/vault/src/api.ts index 84843c9176..d924336a2e 100644 --- a/plugins/vault/src/api.ts +++ b/plugins/vault/src/api.ts @@ -13,7 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { DiscoveryApi, createApiRef } from '@backstage/core-plugin-api'; +import { + DiscoveryApi, + createApiRef, + FetchApi, +} from '@backstage/core-plugin-api'; import { NotFoundError, ResponseError } from '@backstage/errors'; /** @@ -52,9 +56,17 @@ export interface VaultApi { */ export class VaultClient implements VaultApi { private readonly discoveryApi: DiscoveryApi; + private readonly fetchApi: FetchApi; - constructor({ discoveryApi }: { discoveryApi: DiscoveryApi }) { + constructor({ + discoveryApi, + fetchApi, + }: { + discoveryApi: DiscoveryApi; + fetchApi: FetchApi; + }) { this.discoveryApi = discoveryApi; + this.fetchApi = fetchApi; } private async callApi( @@ -62,7 +74,7 @@ export class VaultClient implements VaultApi { query: { [key in string]: any }, ): Promise { const apiUrl = `${await this.discoveryApi.getBaseUrl('vault')}`; - const response = await fetch( + const response = await this.fetchApi.fetch( `${apiUrl}/${path}?${new URLSearchParams(query).toString()}`, { headers: { diff --git a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx index 27cc0ed91e..e5bd5b43de 100644 --- a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx +++ b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx @@ -17,6 +17,7 @@ import React from 'react'; import { setupServer } from 'msw/node'; import { + MockFetchApi, setupRequestMockHandlers, TestApiRegistry, } from '@backstage/test-utils'; @@ -33,6 +34,8 @@ describe('EntityVaultTable', () => { let apis: TestApiRegistry; const mockBaseUrl = 'https://api-vault.com/api/vault'; const discoveryApi = UrlPatternDiscovery.compile(mockBaseUrl); + const fetchApi = new MockFetchApi(); + const entity = (secretPath: string) => { return { apiVersion: 'backstage.io/v1alpha1', @@ -90,7 +93,7 @@ describe('EntityVaultTable', () => { beforeEach(() => { apis = TestApiRegistry.from([ vaultApiRef, - new VaultClient({ discoveryApi }), + new VaultClient({ discoveryApi, fetchApi }), ]); }); diff --git a/plugins/vault/src/plugin.ts b/plugins/vault/src/plugin.ts index 8275505abb..f62a8a73e4 100644 --- a/plugins/vault/src/plugin.ts +++ b/plugins/vault/src/plugin.ts @@ -19,9 +19,11 @@ import { createPlugin, DiscoveryApi, discoveryApiRef, + FetchApi, + fetchApiRef, } from '@backstage/core-plugin-api'; -import { VaultClient, vaultApiRef } from './api'; +import { vaultApiRef, VaultClient } from './api'; /** * The vault plugin. @@ -32,10 +34,17 @@ export const vaultPlugin = createPlugin({ apis: [ createApiFactory({ api: vaultApiRef, - deps: { discoveryApi: discoveryApiRef }, - factory: ({ discoveryApi }: { discoveryApi: DiscoveryApi }) => + deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef }, + factory: ({ + discoveryApi, + fetchApi, + }: { + discoveryApi: DiscoveryApi; + fetchApi: FetchApi; + }) => new VaultClient({ discoveryApi, + fetchApi, }), }), ], diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index 0cf8ce8d2c..bf01295b5a 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-xcmetrics +## 0.2.37-next.2 + +### Patch Changes + +- 55a969fe574: Bumped `recharts` dependency to `^2.5.0`. +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/errors@1.1.5 + - @backstage/theme@0.2.19-next.0 + +## 0.2.37-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/theme@0.2.19-next.0 + - @backstage/errors@1.1.5 + ## 0.2.37-next.0 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index b72d7ce72c..1a654fd52f 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-xcmetrics", "description": "A Backstage plugin that shows XCode build metrics for your components", - "version": "0.2.37-next.0", + "version": "0.2.37-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,21 +33,25 @@ "lodash": "^4.17.21", "luxon": "^3.0.0", "react-use": "^17.2.4", - "recharts": "^2.0.0" + "recharts": "^2.5.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^16.13.1 || ^17.0.0", + "react-dom": "^16.13.1 || ^17.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/dev-utils": "workspace:^", "@backstage/test-utils": "workspace:^", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/luxon": "^3.0.0", "@types/node": "^16.11.26", + "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, diff --git a/storybook/package.json b/storybook/package.json index d7cb2bda98..6e1243c6f2 100644 --- a/storybook/package.json +++ b/storybook/package.json @@ -25,8 +25,9 @@ "@storybook/manager-webpack5": "^6.5.9", "@storybook/node-logger": "^6.5.9", "@storybook/react": "^6.5.9", - "@storybook/testing-library": "^0.0.13", - "storybook-dark-mode": "^1.1.0" + "@storybook/testing-library": "^0.1.0", + "storybook-dark-mode": "^1.1.0", + "typescript": "~4.7.0" }, "resolutions": { "webpack": "^5.73.0" diff --git a/storybook/yarn.lock b/storybook/yarn.lock index d1b064f48c..d3c336de8c 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -331,17 +331,17 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.18.10": - version: 7.18.10 - resolution: "@babel/helper-string-parser@npm:7.18.10" - checksum: d554a4393365b624916b5c00a4cc21c990c6617e7f3fe30be7d9731f107f12c33229a7a3db9d829bfa110d2eb9f04790745d421640e3bd245bb412dc0ea123c1 +"@babel/helper-string-parser@npm:^7.19.4": + version: 7.19.4 + resolution: "@babel/helper-string-parser@npm:7.19.4" + checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-validator-identifier@npm:7.18.6" - checksum: e295254d616bbe26e48c196a198476ab4d42a73b90478c9842536cf910ead887f5af6b5c4df544d3052a25ccb3614866fa808dc1e3a5a4291acd444e243c0648 +"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/helper-validator-identifier@npm:7.19.1" + checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a languageName: node linkType: hard @@ -386,12 +386,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.12.11, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.18.10, @babel/parser@npm:^7.18.11": - version: 7.18.11 - resolution: "@babel/parser@npm:7.18.11" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.11, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.18.10, @babel/parser@npm:^7.18.11, @babel/parser@npm:^7.20.7": + version: 7.21.4 + resolution: "@babel/parser@npm:7.21.4" bin: parser: ./bin/babel-parser.js - checksum: 5ecc75b83e62ec53a947b1635a6ca75d6210d4a4f962f9f16f4239a6783f98e57f9662b598fa2fb1b8e12c0ad5c2bd86846ed0b97b85eb73dd7498b3a6d71a4b + checksum: de610ecd1bff331766d0c058023ca11a4f242bfafefc42caf926becccfb6756637d167c001987ca830dd4b34b93c629a4cef63f8c8c864a8564cdfde1989ac77 languageName: node linkType: hard @@ -1528,14 +1528,14 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.12.11, @babel/types@npm:^7.12.7, @babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.2.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.18.13 - resolution: "@babel/types@npm:7.18.13" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.7, @babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.3.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.21.4 + resolution: "@babel/types@npm:7.21.4" dependencies: - "@babel/helper-string-parser": ^7.18.10 - "@babel/helper-validator-identifier": ^7.18.6 + "@babel/helper-string-parser": ^7.19.4 + "@babel/helper-validator-identifier": ^7.19.1 to-fast-properties: ^2.0.0 - checksum: abc3ad1f3b6864df0ea0e778bcdf7d2c5ee2293811192962d50e8a8c05c1aeec90a48275f53b2a45aad882ed8bef9477ae1f8e70ac1d44d039e14930d1388dcc + checksum: 587bc55a91ce003b0f8aa10d70070f8006560d7dc0360dc0406d306a2cb2a10154e2f9080b9c37abec76907a90b330a536406cb75e6bdc905484f37b75c73219 languageName: node linkType: hard @@ -1952,28 +1952,6 @@ __metadata: languageName: node linkType: hard -"@storybook/addons@npm:6.5.10": - version: 6.5.10 - resolution: "@storybook/addons@npm:6.5.10" - dependencies: - "@storybook/api": 6.5.10 - "@storybook/channels": 6.5.10 - "@storybook/client-logger": 6.5.10 - "@storybook/core-events": 6.5.10 - "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.10 - "@storybook/theming": 6.5.10 - "@types/webpack-env": ^1.16.0 - core-js: ^3.8.2 - global: ^4.4.0 - regenerator-runtime: ^0.13.7 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 9143908c77ab77064a5da3de1fcfb218e5f0e561f4b8a083e59b4104e442567c87fb571a752bb11c469317fc3bbcb9c2e42ebd9a5a41f825b3fd67a920d90621 - languageName: node - linkType: hard - "@storybook/addons@npm:6.5.16, @storybook/addons@npm:^6.0.0, @storybook/addons@npm:^6.5.9": version: 6.5.16 resolution: "@storybook/addons@npm:6.5.16" @@ -1996,34 +1974,6 @@ __metadata: languageName: node linkType: hard -"@storybook/api@npm:6.5.10": - version: 6.5.10 - resolution: "@storybook/api@npm:6.5.10" - dependencies: - "@storybook/channels": 6.5.10 - "@storybook/client-logger": 6.5.10 - "@storybook/core-events": 6.5.10 - "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.10 - "@storybook/semver": ^7.3.2 - "@storybook/theming": 6.5.10 - core-js: ^3.8.2 - fast-deep-equal: ^3.1.3 - global: ^4.4.0 - lodash: ^4.17.21 - memoizerific: ^1.11.3 - regenerator-runtime: ^0.13.7 - store2: ^2.12.0 - telejson: ^6.0.8 - ts-dedent: ^2.0.0 - util-deprecate: ^1.0.2 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 49e01f35fa6de776329407533c0449aac84bbc9404bf717b1cebff5dc8961618956d7ba0003361c4e6cdc24e898619f778fea15db5a30eb320fc73a4b53adb40 - languageName: node - linkType: hard - "@storybook/api@npm:6.5.16, @storybook/api@npm:^6.0.0": version: 6.5.16 resolution: "@storybook/api@npm:6.5.16" @@ -2180,6 +2130,20 @@ __metadata: languageName: node linkType: hard +"@storybook/channel-postmessage@npm:7.0.2": + version: 7.0.2 + resolution: "@storybook/channel-postmessage@npm:7.0.2" + dependencies: + "@storybook/channels": 7.0.2 + "@storybook/client-logger": 7.0.2 + "@storybook/core-events": 7.0.2 + "@storybook/global": ^5.0.0 + qs: ^6.10.0 + telejson: ^7.0.3 + checksum: ef175027b4b5794af263c6ec40f6caab02deb3c189598493f5612cd5745d9cada1427914dbf39aef01dbf3e71f4299d35cfcaaaad727c06da47850b56044032c + languageName: node + linkType: hard + "@storybook/channel-websocket@npm:6.5.16": version: 6.5.16 resolution: "@storybook/channel-websocket@npm:6.5.16" @@ -2193,17 +2157,6 @@ __metadata: languageName: node linkType: hard -"@storybook/channels@npm:6.5.10": - version: 6.5.10 - resolution: "@storybook/channels@npm:6.5.10" - dependencies: - core-js: ^3.8.2 - ts-dedent: ^2.0.0 - util-deprecate: ^1.0.2 - checksum: 3837d2aff1575aa8d5af77162781b2824b909f18a7e7d3b961e6a14854b58011a56bd4f6c92bf065b8856fbcf7925a5849ffc56e42badac240701a560a26c627 - languageName: node - linkType: hard - "@storybook/channels@npm:6.5.16": version: 6.5.16 resolution: "@storybook/channels@npm:6.5.16" @@ -2215,6 +2168,13 @@ __metadata: languageName: node linkType: hard +"@storybook/channels@npm:7.0.2": + version: 7.0.2 + resolution: "@storybook/channels@npm:7.0.2" + checksum: 34ff0481a7f8bf613a9b1c9ffc3db4e48e8c80fea29d66b68a9c3b74d52040d87a5ed002d0e3e287813f33ad607440d46078e5e96367bf98713c72efb587d4a3 + languageName: node + linkType: hard + "@storybook/client-api@npm:6.5.16": version: 6.5.16 resolution: "@storybook/client-api@npm:6.5.16" @@ -2246,17 +2206,7 @@ __metadata: languageName: node linkType: hard -"@storybook/client-logger@npm:6.5.10": - version: 6.5.10 - resolution: "@storybook/client-logger@npm:6.5.10" - dependencies: - core-js: ^3.8.2 - global: ^4.4.0 - checksum: 6aa15e27e1f805b34332f647545eb53277c87492044073daf31ac6151b274cb7da6d2c8b3831484bb0c4c410f8adc1bb13322c3b80ee2f88e30856721c7d9ab1 - languageName: node - linkType: hard - -"@storybook/client-logger@npm:6.5.16, @storybook/client-logger@npm:^6.4.0": +"@storybook/client-logger@npm:6.5.16": version: 6.5.16 resolution: "@storybook/client-logger@npm:6.5.16" dependencies: @@ -2266,6 +2216,15 @@ __metadata: languageName: node linkType: hard +"@storybook/client-logger@npm:7.0.2, @storybook/client-logger@npm:^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0": + version: 7.0.2 + resolution: "@storybook/client-logger@npm:7.0.2" + dependencies: + "@storybook/global": ^5.0.0 + checksum: 3deb50e8cde7777025753938e21318ee34c10237e29664cfb2dfd08f70d84b073961e1b546629e536ef53f26a91a9aed2c83223d7cfe1680787ecee7e39ce8a8 + languageName: node + linkType: hard + "@storybook/components@npm:6.5.16, @storybook/components@npm:^6.0.0": version: 6.5.16 resolution: "@storybook/components@npm:6.5.16" @@ -2384,15 +2343,6 @@ __metadata: languageName: node linkType: hard -"@storybook/core-events@npm:6.5.10": - version: 6.5.10 - resolution: "@storybook/core-events@npm:6.5.10" - dependencies: - core-js: ^3.8.2 - checksum: 89139f3f34a4ea0f2bbc02ebaa2968664cdc17abd88cc2e0467a0dfb1c11577e85fa402e5804fe4d6a99edd696d365abf93d30c396fc177563478cdbb68bcb85 - languageName: node - linkType: hard - "@storybook/core-events@npm:6.5.16, @storybook/core-events@npm:^6.0.0": version: 6.5.16 resolution: "@storybook/core-events@npm:6.5.16" @@ -2402,6 +2352,13 @@ __metadata: languageName: node linkType: hard +"@storybook/core-events@npm:7.0.2": + version: 7.0.2 + resolution: "@storybook/core-events@npm:7.0.2" + checksum: 5bca4db82f582b939ba1aaba26aee3e8f9aa0a2d36728934b4d26dbe858b6f455a46ddcf4e8e6c7b3f5fa5b517716c503626febca08e53712d516f2ca105bf11 + languageName: node + linkType: hard + "@storybook/core-server@npm:6.5.16": version: 6.5.16 resolution: "@storybook/core-server@npm:6.5.16" @@ -2522,6 +2479,15 @@ __metadata: languageName: node linkType: hard +"@storybook/csf@npm:^0.1.0": + version: 0.1.0 + resolution: "@storybook/csf@npm:0.1.0" + dependencies: + type-fest: ^2.19.0 + checksum: f1784f2aff27d5c27ab897878b08e3b04a64e7f62da1ea95fd11bfe9f558300e55f0d483d58282e8254a4b4e8935201178e70c264ccc96104c67403215d651f0 + languageName: node + linkType: hard + "@storybook/docs-tools@npm:6.5.16": version: 6.5.16 resolution: "@storybook/docs-tools@npm:6.5.16" @@ -2537,16 +2503,23 @@ __metadata: languageName: node linkType: hard -"@storybook/instrumenter@npm:^6.4.0": - version: 6.5.10 - resolution: "@storybook/instrumenter@npm:6.5.10" +"@storybook/global@npm:^5.0.0": + version: 5.0.0 + resolution: "@storybook/global@npm:5.0.0" + checksum: ede0ad35ec411fe31c61150dbd118fef344d1d0e72bf5d3502368e35cf68126f6b7ae4a0ab5e2ffe2f0baa3b4286f03ad069ba3e098e1725449ef08b7e154ba8 + languageName: node + linkType: hard + +"@storybook/instrumenter@npm:^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0": + version: 7.0.2 + resolution: "@storybook/instrumenter@npm:7.0.2" dependencies: - "@storybook/addons": 6.5.10 - "@storybook/client-logger": 6.5.10 - "@storybook/core-events": 6.5.10 - core-js: ^3.8.2 - global: ^4.4.0 - checksum: cd393a8df6561561d416c6b36b46130040d91103a30e471a2161d6cb12a42c7b80d3134c2e8219a1fa1c08ad768a78194528467f5d0a15f4df0074dcc8bed057 + "@storybook/channels": 7.0.2 + "@storybook/client-logger": 7.0.2 + "@storybook/core-events": 7.0.2 + "@storybook/global": ^5.0.0 + "@storybook/preview-api": 7.0.2 + checksum: 1f0fcd2fd6561030897558ee6fb363da23bbbc67f08d12204f885da9ffc90f180703b3fbd85f01758e0f7a066437ebd6af415d4eefcb9ddb1e8ad16fd37e3eae languageName: node linkType: hard @@ -2677,6 +2650,29 @@ __metadata: languageName: node linkType: hard +"@storybook/preview-api@npm:7.0.2": + version: 7.0.2 + resolution: "@storybook/preview-api@npm:7.0.2" + dependencies: + "@storybook/channel-postmessage": 7.0.2 + "@storybook/channels": 7.0.2 + "@storybook/client-logger": 7.0.2 + "@storybook/core-events": 7.0.2 + "@storybook/csf": ^0.1.0 + "@storybook/global": ^5.0.0 + "@storybook/types": 7.0.2 + "@types/qs": ^6.9.5 + dequal: ^2.0.2 + lodash: ^4.17.21 + memoizerific: ^1.11.3 + qs: ^6.10.0 + synchronous-promise: ^2.0.15 + ts-dedent: ^2.0.0 + util-deprecate: ^1.0.2 + checksum: 350811420c996c9616b59615fe2fe7785ec6590301ed3a6a54b07ca4b2bb45614f47b4cacf037c72ed1d7dd04a8647d0e99a4e2e0f23f91a0dc5d1e8f3486ee2 + languageName: node + linkType: hard + "@storybook/preview-web@npm:6.5.16": version: 6.5.16 resolution: "@storybook/preview-web@npm:6.5.16" @@ -2787,22 +2783,6 @@ __metadata: languageName: node linkType: hard -"@storybook/router@npm:6.5.10": - version: 6.5.10 - resolution: "@storybook/router@npm:6.5.10" - dependencies: - "@storybook/client-logger": 6.5.10 - core-js: ^3.8.2 - memoizerific: ^1.11.3 - qs: ^6.10.0 - regenerator-runtime: ^0.13.7 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 118598867067344607cff7ef6fdef7b7a18a3e08a53f75fc4beaa65013f435ae18d800d25eea52376662bc1d98a2822a143531e701d8cea7130d42dc48e2cce7 - languageName: node - linkType: hard - "@storybook/router@npm:6.5.16": version: 6.5.16 resolution: "@storybook/router@npm:6.5.16" @@ -2898,31 +2878,16 @@ __metadata: languageName: node linkType: hard -"@storybook/testing-library@npm:^0.0.13": - version: 0.0.13 - resolution: "@storybook/testing-library@npm:0.0.13" +"@storybook/testing-library@npm:^0.1.0": + version: 0.1.0 + resolution: "@storybook/testing-library@npm:0.1.0" dependencies: - "@storybook/client-logger": ^6.4.0 - "@storybook/instrumenter": ^6.4.0 + "@storybook/client-logger": ^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0 + "@storybook/instrumenter": ^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0 "@testing-library/dom": ^8.3.0 "@testing-library/user-event": ^13.2.1 ts-dedent: ^2.2.0 - checksum: 759361ad3fbc89bdfddfa6d5a15eef06ed6fa9110bfa40c08fcf2497e7acd85e8d5c73c26ea4a46934168b21db294256befb55755fee4292d3d277c576284a1c - languageName: node - linkType: hard - -"@storybook/theming@npm:6.5.10": - version: 6.5.10 - resolution: "@storybook/theming@npm:6.5.10" - dependencies: - "@storybook/client-logger": 6.5.10 - core-js: ^3.8.2 - memoizerific: ^1.11.3 - regenerator-runtime: ^0.13.7 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 2082d7847785a307a18eb605282468d844af01f57752916766a60047b5543cf6f0c6664b9c7a693809b4fdc121415989c2170833d3de7ca8b07fa056741787d0 + checksum: a413110dafe80f8fe64da912fddb653bc3c695c94bd023b8cb918e519e9f94119bae559909bfb8ad229041a4f17a12b33425c61572270702c116d0b727b4d4ba languageName: node linkType: hard @@ -2941,6 +2906,18 @@ __metadata: languageName: node linkType: hard +"@storybook/types@npm:7.0.2": + version: 7.0.2 + resolution: "@storybook/types@npm:7.0.2" + dependencies: + "@storybook/channels": 7.0.2 + "@types/babel__core": ^7.0.0 + "@types/express": ^4.7.0 + file-system-cache: ^2.0.0 + checksum: 329e271af5621619a8d17fff222e4170b62ca4b451bcb48b5a899d63bb8df211c5d3d8dafa2266ac3c9801bf64c4ac1aed73950a2f21da82333b19c448ea32e0 + languageName: node + linkType: hard + "@storybook/ui@npm:6.5.16": version: 6.5.16 resolution: "@storybook/ui@npm:6.5.16" @@ -3116,6 +3093,66 @@ __metadata: languageName: node linkType: hard +"@types/babel__core@npm:^7.0.0": + version: 7.20.0 + resolution: "@types/babel__core@npm:7.20.0" + dependencies: + "@babel/parser": ^7.20.7 + "@babel/types": ^7.20.7 + "@types/babel__generator": "*" + "@types/babel__template": "*" + "@types/babel__traverse": "*" + checksum: 49b601a0a7637f1f387442c8156bd086cfd10ff4b82b0e1994e73a6396643b5435366fb33d6b604eade8467cca594ef97adcbc412aede90bb112ebe88d0ad6df + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.4 + resolution: "@types/babel__generator@npm:7.6.4" + dependencies: + "@babel/types": ^7.0.0 + checksum: 20effbbb5f8a3a0211e95959d06ae70c097fb6191011b73b38fe86deebefad8e09ee014605e0fd3cdaedc73d158be555866810e9166e1f09e4cfd880b874dcb0 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.1 + resolution: "@types/babel__template@npm:7.4.1" + dependencies: + "@babel/parser": ^7.1.0 + "@babel/types": ^7.0.0 + checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*": + version: 7.18.3 + resolution: "@types/babel__traverse@npm:7.18.3" + dependencies: + "@babel/types": ^7.3.0 + checksum: d20953338b2f012ab7750932ece0a78e7d1645b0a6ff42d49be90f55e9998085da1374a9786a7da252df89555c6586695ba4d1d4b4e88ab2b9f306bcd35e00d3 + languageName: node + linkType: hard + +"@types/body-parser@npm:*": + version: 1.19.2 + resolution: "@types/body-parser@npm:1.19.2" + dependencies: + "@types/connect": "*" + "@types/node": "*" + checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + languageName: node + linkType: hard + +"@types/connect@npm:*": + version: 3.4.35 + resolution: "@types/connect@npm:3.4.35" + dependencies: + "@types/node": "*" + checksum: fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641 + languageName: node + linkType: hard + "@types/eslint-scope@npm:^3.7.3": version: 3.7.4 resolution: "@types/eslint-scope@npm:3.7.4" @@ -3150,6 +3187,29 @@ __metadata: languageName: node linkType: hard +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.17.33 + resolution: "@types/express-serve-static-core@npm:4.17.33" + dependencies: + "@types/node": "*" + "@types/qs": "*" + "@types/range-parser": "*" + checksum: dce580d16b85f207445af9d4053d66942b27d0c72e86153089fa00feee3e96ae336b7bedb31ed4eea9e553c99d6dd356ed6e0928f135375d9f862a1a8015adf2 + languageName: node + linkType: hard + +"@types/express@npm:^4.7.0": + version: 4.17.17 + resolution: "@types/express@npm:4.17.17" + dependencies: + "@types/body-parser": "*" + "@types/express-serve-static-core": ^4.17.33 + "@types/qs": "*" + "@types/serve-static": "*" + checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da + languageName: node + linkType: hard + "@types/glob@npm:*, @types/glob@npm:^7.1.1": version: 7.2.0 resolution: "@types/glob@npm:7.2.0" @@ -3220,6 +3280,13 @@ __metadata: languageName: node linkType: hard +"@types/mime@npm:*": + version: 3.0.1 + resolution: "@types/mime@npm:3.0.1" + checksum: 4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 + languageName: node + linkType: hard + "@types/minimatch@npm:*": version: 3.0.5 resolution: "@types/minimatch@npm:3.0.5" @@ -3286,13 +3353,30 @@ __metadata: languageName: node linkType: hard -"@types/qs@npm:^6.9.5": +"@types/qs@npm:*, @types/qs@npm:^6.9.5": version: 6.9.7 resolution: "@types/qs@npm:6.9.7" checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba languageName: node linkType: hard +"@types/range-parser@npm:*": + version: 1.2.4 + resolution: "@types/range-parser@npm:1.2.4" + checksum: b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95 + languageName: node + linkType: hard + +"@types/serve-static@npm:*": + version: 1.15.1 + resolution: "@types/serve-static@npm:1.15.1" + dependencies: + "@types/mime": "*" + "@types/node": "*" + checksum: 2e078bdc1e458c7dfe69e9faa83cc69194b8896cce57cb745016580543c7ab5af07fdaa8ac1765eb79524208c81017546f66056f44d1204f812d72810613de36 + languageName: node + linkType: hard + "@types/source-list-map@npm:*": version: 0.1.2 resolution: "@types/source-list-map@npm:0.1.2" @@ -5203,6 +5287,13 @@ __metadata: languageName: node linkType: hard +"dequal@npm:^2.0.2": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -5902,6 +5993,16 @@ __metadata: languageName: node linkType: hard +"file-system-cache@npm:^2.0.0": + version: 2.0.2 + resolution: "file-system-cache@npm:2.0.2" + dependencies: + fs-extra: ^11.1.0 + ramda: ^0.28.0 + checksum: ac4f9065132ac4593dbfb7c8fc4683cccc0f58823279763690fb3fca859cc5e6b4446c846af718354059695fa90db316be4ce19e16578bbb0feab4a9159e9fbc + languageName: node + linkType: hard + "fill-range@npm:^4.0.0": version: 4.0.0 resolution: "fill-range@npm:4.0.0" @@ -6131,6 +6232,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.1.0": + version: 11.1.1 + resolution: "fs-extra@npm:11.1.1" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd + languageName: node + linkType: hard + "fs-extra@npm:^9.0.0, fs-extra@npm:^9.0.1": version: 9.1.0 resolution: "fs-extra@npm:9.1.0" @@ -10655,13 +10767,14 @@ __metadata: "@storybook/manager-webpack5": ^6.5.9 "@storybook/node-logger": ^6.5.9 "@storybook/react": ^6.5.9 - "@storybook/testing-library": ^0.0.13 + "@storybook/testing-library": ^0.1.0 "@swc/core": ^1.3.9 react: ^17.0.2 react-dom: ^17.0.2 react-hot-loader: ^4.13.0 storybook-dark-mode: ^1.1.0 swc-loader: ^0.2.3 + typescript: ~4.7.0 peerDependencies: "@backstage/core-app-api": "*" "@backstage/core-plugin-api": "*" @@ -10953,6 +11066,15 @@ __metadata: languageName: node linkType: hard +"telejson@npm:^7.0.3": + version: 7.1.0 + resolution: "telejson@npm:7.1.0" + dependencies: + memoizerific: ^1.11.3 + checksum: 8000e43dc862a87ab1ca342a2635641923d55c2585f85ea8c7c60293681d6f920e8b9570cc12d90ecef286f065c176da5f769f42f4828ba18a626627bed1ac07 + languageName: node + linkType: hard + "terser-webpack-plugin@npm:^4.2.3": version: 4.2.3 resolution: "terser-webpack-plugin@npm:4.2.3" @@ -11182,6 +11304,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^2.19.0": + version: 2.19.0 + resolution: "type-fest@npm:2.19.0" + checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 + languageName: node + linkType: hard + "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -11192,6 +11321,26 @@ __metadata: languageName: node linkType: hard +"typescript@npm:~4.7.0": + version: 4.7.4 + resolution: "typescript@npm:4.7.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 5750181b1cd7e6482c4195825547e70f944114fb47e58e4aa7553e62f11b3f3173766aef9c281783edfd881f7b8299cf35e3ca8caebe73d8464528c907a164df + languageName: node + linkType: hard + +"typescript@patch:typescript@~4.7.0#~builtin": + version: 4.7.4 + resolution: "typescript@patch:typescript@npm%3A4.7.4#~builtin::version=4.7.4&hash=a1c5e5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 9096d8f6c16cb80ef3bf96fcbbd055bf1c4a43bd14f3b7be45a9fbe7ada46ec977f604d5feed3263b4f2aa7d4c7477ce5f9cd87de0d6feedec69a983f3a4f93e + languageName: node + linkType: hard + "uglify-js@npm:^3.1.4": version: 3.17.0 resolution: "uglify-js@npm:3.17.0" diff --git a/yarn.lock b/yarn.lock index 96f12bf777..c960d48f18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -43,8 +43,8 @@ __metadata: linkType: hard "@apollo/client@npm:^3.0.0": - version: 3.7.10 - resolution: "@apollo/client@npm:3.7.10" + version: 3.7.11 + resolution: "@apollo/client@npm:3.7.11" dependencies: "@graphql-typed-document-node/core": ^3.1.1 "@wry/context": ^0.7.0 @@ -52,7 +52,7 @@ __metadata: "@wry/trie": ^0.3.0 graphql-tag: ^2.12.6 hoist-non-react-statics: ^3.3.2 - optimism: ^0.16.1 + optimism: ^0.16.2 prop-types: ^15.7.2 response-iterator: ^0.2.6 symbol-observable: ^4.0.0 @@ -74,7 +74,7 @@ __metadata: optional: true subscriptions-transport-ws: optional: true - checksum: d74a68f8042e76e3a81990c79a89aefc07c8899d354f3b469591356508001005106bba0fa953652c3ec19756d44bdec6730ac98f62fa836bd76acbcb7eff42ce + checksum: 56fa501dc27b68b01c054ffd5642fcfedb16ee4653e819fb92d1b6cae834160f1274a961f335812f4781bbbbdf3bb6f851f07a7351f95d8945740cc79fa2d58f languageName: node linkType: hard @@ -140,8 +140,8 @@ __metadata: linkType: hard "@apollo/server@npm:^4.0.0": - version: 4.5.0 - resolution: "@apollo/server@npm:4.5.0" + version: 4.6.0 + resolution: "@apollo/server@npm:4.6.0" dependencies: "@apollo/cache-control-types": ^1.0.2 "@apollo/server-gateway-interface": ^1.1.0 @@ -171,7 +171,7 @@ __metadata: whatwg-mimetype: ^3.0.0 peerDependencies: graphql: ^16.6.0 - checksum: 193b5f6913c945aafb8fc6b5b75fcfff250e5b84dc2727f6a0472b304da08a6cd90a21ae45591e6408e9413e8bee323bbf4c9586b511a4f426b562da5328e4d0 + checksum: 309d22df0caa73671d856c31f53d0eb8a5505a6dd0c1691223891e0fa2931667c7ccd680e418a678e1d2570f54596bcc514775854cbc16bfff9009c7cfe9febe languageName: node linkType: hard @@ -3644,7 +3644,18 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-client@^1.4.0, @backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client": +"@backstage/catalog-client@npm:^1.4.0": + version: 1.4.0 + resolution: "@backstage/catalog-client@npm:1.4.0" + dependencies: + "@backstage/catalog-model": ^1.2.1 + "@backstage/errors": ^1.1.5 + cross-fetch: ^3.1.5 + checksum: 8ffa95d74b2be83247beafce3aebe06cb688b018ada8ce4364b48ca09500293b1057cb48b90650a44b6252775bc3e09eeafcef79b8d8db4114271f8ec31bec80 + languageName: node + linkType: hard + +"@backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client": version: 0.0.0-use.local resolution: "@backstage/catalog-client@workspace:packages/catalog-client" dependencies: @@ -3714,6 +3725,7 @@ __metadata: "@spotify/eslint-config-react": ^14.0.0 "@spotify/eslint-config-typescript": ^14.0.0 "@sucrase/webpack-loader": ^2.0.0 + "@svgr/core": 6.5.x "@svgr/plugin-jsx": 6.5.x "@svgr/plugin-svgo": 6.5.x "@svgr/rollup": 6.5.x @@ -3807,6 +3819,7 @@ __metadata: tar: ^6.1.12 terser-webpack-plugin: ^5.1.3 ts-node: ^10.0.0 + type-fest: ^2.19.0 util: ^0.12.3 webpack: ^5.70.0 webpack-dev-server: ^4.7.3 @@ -3894,14 +3907,17 @@ __metadata: "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" "@backstage/version-bridge": "workspace:^" + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 "@types/prop-types": ^15.7.3 + "@types/react": ^16.13.1 || ^17.0.0 "@types/zen-observable": ^0.8.0 cross-fetch: ^3.1.5 + history: ^5.0.0 msw: ^1.0.0 prop-types: ^15.7.2 react-router-beta: "npm:react-router@6.0.0-beta.0" @@ -3912,8 +3928,8 @@ __metadata: zen-observable: ^0.10.0 zod: ^3.21.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -3980,11 +3996,13 @@ __metadata: "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@backstage/version-bridge": "workspace:^" + "@date-io/core": ^1.3.13 "@material-table/core": ^3.1.0 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -3997,6 +4015,7 @@ __metadata: "@types/dagre": ^0.7.44 "@types/google-protobuf": ^3.7.2 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 "@types/react-helmet": ^6.1.0 "@types/react-sparklines": ^1.7.0 "@types/react-syntax-highlighter": ^15.0.0 @@ -4026,20 +4045,37 @@ __metadata: react-syntax-highlighter: ^15.4.5 react-text-truncate: ^0.19.0 react-use: ^17.3.2 - react-virtualized-auto-sizer: ^1.0.6 + react-virtualized-auto-sizer: ^1.0.11 react-window: ^1.8.6 remark-gfm: ^3.0.1 zen-observable: ^0.10.0 zod: ^3.21.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft -"@backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@^1.5.0, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@npm:^1.3.0, @backstage/core-plugin-api@npm:^1.5.0": + version: 1.5.0 + resolution: "@backstage/core-plugin-api@npm:1.5.0" + dependencies: + "@backstage/config": ^1.0.7 + "@backstage/types": ^1.0.2 + "@backstage/version-bridge": ^1.0.3 + history: ^5.0.0 + prop-types: ^15.7.2 + zen-observable: ^0.10.0 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: 2c167377fd38680de12c213caabfe971c4d2798b49ad150c481c01abb9c031a3bba660b88af04772c90e762ffed82217bbf2390ce943dd5819f5ea663c6c5371 + languageName: node + linkType: hard + +"@backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": version: 0.0.0-use.local resolution: "@backstage/core-plugin-api@workspace:packages/core-plugin-api" dependencies: @@ -4049,12 +4085,14 @@ __metadata: "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" "@backstage/version-bridge": "workspace:^" + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 "@types/prop-types": ^15.7.3 + "@types/react": ^16.13.1 || ^17.0.0 "@types/zen-observable": ^0.8.0 cross-fetch: ^3.1.5 history: ^5.0.0 @@ -4062,8 +4100,8 @@ __metadata: prop-types: ^15.7.2 zen-observable: ^0.10.0 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4110,14 +4148,15 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.0.0 + "@types/react": ^16.13.1 || ^17.0.0 react-use: ^17.2.4 zen-observable: ^0.10.0 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 @@ -4199,19 +4238,39 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft -"@backstage/integration@^1.4.3, @backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": +"@backstage/integration@npm:^1.4.3": + version: 1.4.3 + resolution: "@backstage/integration@npm:1.4.3" + dependencies: + "@backstage/config": ^1.0.7 + "@backstage/errors": ^1.1.5 + "@octokit/auth-app": ^4.0.0 + "@octokit/rest": ^19.0.3 + cross-fetch: ^3.1.5 + git-url-parse: ^13.0.0 + lodash: ^4.17.21 + luxon: ^3.0.0 + checksum: b2934ce78a4f32f3a31e2b7c61332192dd35d90e4fcb97b1643579adc3709bc2f18fe4332332837dcc11859b3677305f6de92e11a1f907113138c51fb69777c1 + languageName: node + linkType: hard + +"@backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": version: 0.0.0-use.local resolution: "@backstage/integration@workspace:packages/integration" dependencies: @@ -4219,7 +4278,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/config-loader": "workspace:^" "@backstage/errors": "workspace:^" - "@backstage/test-utils": "workspace:^" "@octokit/auth-app": ^4.0.0 "@octokit/rest": ^19.0.3 "@types/luxon": ^3.0.0 @@ -4290,19 +4348,22 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/git-url-parse": ^9.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 + lodash: ^4.17.21 msw: ^1.0.0 react-markdown: ^8.0.0 react-use: ^17.2.4 remark-gfm: ^3.0.1 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4343,15 +4404,18 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4372,15 +4436,18 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4400,16 +4467,21 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 + prop-types: ^15.7.2 react-ga: ^3.3.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4426,16 +4498,20 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 qs: ^6.10.1 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4449,6 +4525,8 @@ __metadata: grpc-docs: ^1.1.2 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4470,10 +4548,12 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 "@types/swagger-ui-react": ^4.1.1 cross-fetch: ^3.1.5 graphiql: ^1.8.8 @@ -4484,8 +4564,8 @@ __metadata: react-use: ^17.2.4 swagger-ui-react: ^4.11.1 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4504,16 +4584,20 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 use-deep-compare-effect: ^1.8.1 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4560,7 +4644,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" - "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" "@davidzemon/passport-okta-oauth": ^0.0.5 "@google-cloud/firestore": ^6.0.0 @@ -4681,10 +4764,12 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 humanize-duration: ^3.27.0 luxon: ^3.0.0 @@ -4692,6 +4777,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4743,16 +4829,20 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 luxon: ^3.0.0 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4795,15 +4885,18 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4848,6 +4941,7 @@ __metadata: "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/pickers": ^3.3.10 "@testing-library/jest-dom": ^5.10.1 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 luxon: ^3.0.0 material-ui-search-bar: ^1.0.0 @@ -4855,6 +4949,8 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4887,10 +4983,12 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 "@types/recharts": ^1.8.15 cross-fetch: ^3.1.5 lodash: ^4.17.21 @@ -4898,9 +4996,11 @@ __metadata: msw: ^1.0.0 qs: ^6.9.6 react-use: ^17.2.4 - recharts: ^2.0.0 + recharts: ^2.5.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -4949,6 +5049,7 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" "@types/lodash": ^4.14.151 @@ -5293,7 +5394,18 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@^1.0.10, @backstage/plugin-catalog-common@^1.0.12, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@npm:^1.0.10, @backstage/plugin-catalog-common@npm:^1.0.12": + version: 1.0.12 + resolution: "@backstage/plugin-catalog-common@npm:1.0.12" + dependencies: + "@backstage/catalog-model": ^1.2.1 + "@backstage/plugin-permission-common": ^0.7.4 + "@backstage/plugin-search-common": ^1.2.2 + checksum: 06d276720e3c0c2e099bd610f65b2d40c1d05d0919b4e9a2d3213a4a4f747e54973da85ba111ad806846ca2ccdfcd55287c0f03026226c95aef0e84edbc62812 + languageName: node + linkType: hard + +"@backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-common@workspace:plugins/catalog-common" dependencies: @@ -5323,18 +5435,20 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 + "@types/react": ^16.13.1 || ^17.0.0 classnames: ^2.3.1 lodash: ^4.17.15 p-limit: ^3.1.0 qs: ^6.9.4 react-use: ^17.2.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5355,6 +5469,7 @@ __metadata: "@graphql-codegen/typescript": ^3.0.0 "@graphql-codegen/typescript-resolvers": ^3.0.0 "@graphql-tools/schema": ^9.0.0 + "@types/react": ^16.13.1 || ^17.0.0 graphql: ^16.0.0 graphql-modules: ^2.0.0 graphql-tag: ^2.11.0 @@ -5362,6 +5477,10 @@ __metadata: msw: ^1.0.0 node-fetch: ^2.6.7 winston: ^3.2.1 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5387,10 +5506,12 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 git-url-parse: ^13.0.0 js-base64: ^3.6.0 @@ -5400,8 +5521,8 @@ __metadata: react-use: ^17.2.4 yaml: ^2.0.0 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5480,11 +5601,13 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 "@types/jwt-decode": ^3.1.0 + "@types/react": ^16.13.1 || ^17.0.0 "@types/zen-observable": ^0.8.0 classnames: ^2.2.6 cross-fetch: ^3.1.5 @@ -5497,8 +5620,8 @@ __metadata: yaml: ^2.0.0 zen-observable: ^0.10.0 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5527,9 +5650,11 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 history: ^5.0.0 lodash: ^4.17.21 @@ -5538,8 +5663,8 @@ __metadata: react-use: ^17.2.4 zen-observable: ^0.10.0 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5554,8 +5679,13 @@ __metadata: "@backstage/plugin-cicd-statistics": "workspace:^" "@gitbeaker/browser": ^35.6.0 "@gitbeaker/core": ^35.6.0 + "@types/react": ^16.13.1 || ^17.0.0 luxon: ^3.0.0 p-limit: ^4.0.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5578,10 +5708,13 @@ __metadata: humanize-duration: ^3.27.0 lodash: ^4.17.21 luxon: ^3.0.0 + prop-types: ^15.7.2 react-use: ^17.3.1 - recharts: ^2.1.5 + recharts: ^2.5.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5601,11 +5734,13 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/humanize-duration": ^3.25.1 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 circleci-api: ^4.0.0 cross-fetch: ^3.1.5 humanize-duration: ^3.27.0 @@ -5615,6 +5750,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5635,10 +5771,12 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 luxon: ^3.0.0 msw: ^1.0.0 @@ -5646,6 +5784,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5665,12 +5804,14 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/humanize-duration": ^3.27.1 "@types/luxon": ^3.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 humanize-duration: ^3.27.1 luxon: ^3.0.0 @@ -5678,6 +5819,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5728,20 +5870,23 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/styles": ^4.11.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/highlightjs": ^10.1.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 "@types/recharts": ^1.8.15 cross-fetch: ^3.1.5 highlight.js: ^10.6.0 luxon: ^3.0.0 msw: ^1.0.0 react-use: ^17.2.4 - recharts: ^2.0.0 + recharts: ^2.5.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5762,16 +5907,19 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 rc-progress: 3.4.1 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5793,10 +5941,12 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 jsonschema: ^1.2.6 msw: ^1.0.0 @@ -5804,6 +5954,8 @@ __metadata: zen-observable: ^0.10.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5834,11 +5986,13 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/styles": ^4.9.6 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 "@types/pluralize": ^0.0.29 + "@types/react": ^16.13.1 || ^17.0.0 "@types/recharts": ^1.8.14 "@types/regression": ^2.0.0 "@types/yup": ^0.29.13 @@ -5851,12 +6005,12 @@ __metadata: pluralize: ^8.0.0 qs: ^6.9.4 react-use: ^17.2.4 - recharts: ^2.0.0 + recharts: ^2.5.0 regression: ^2.0.1 yup: ^0.32.9 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5876,16 +6030,20 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 express: ^4.18.1 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: "@backstage/plugin-catalog-react": "workspace:^" react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5940,17 +6098,19 @@ __metadata: "@material-ui/core": ^4.9.13 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.1 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -5978,10 +6138,12 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 "@uiw/react-codemirror": ^4.9.3 cross-fetch: ^3.1.5 lodash: ^4.17.21 @@ -5990,6 +6152,8 @@ __metadata: yaml: ^2.0.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6164,12 +6328,18 @@ __metadata: "@backstage/dev-utils": "workspace:^" "@backstage/plugin-explore-common": "workspace:^" "@backstage/test-utils": "workspace:^" + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6195,17 +6365,20 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 classnames: ^2.2.6 cross-fetch: ^3.1.5 msw: ^1.0.0 + pluralize: ^8.0.0 react-use: ^17.2.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6226,16 +6399,20 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 luxon: ^3.0.0 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6256,10 +6433,12 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 luxon: ^3.0.0 msw: ^1.0.0 @@ -6267,6 +6446,8 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6287,11 +6468,13 @@ __metadata: "@material-ui/lab": 4.0.0-alpha.61 "@maxim_mazurok/gapi.client.calendar": ^3.0.20220408 "@tanstack/react-query": ^4.1.3 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/dompurify": ^2.3.3 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 "@types/sanitize-html": ^2.6.2 classnames: ^2.3.1 cross-fetch: ^3.1.5 @@ -6303,6 +6486,8 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6321,14 +6506,17 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6349,21 +6537,23 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 "@types/recharts": ^1.8.15 cross-fetch: ^3.1.5 luxon: ^3.0.0 msw: ^1.0.0 qs: ^6.10.1 react-use: ^17.2.4 - recharts: ^2.0.0 + recharts: ^2.5.0 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6386,16 +6576,19 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 luxon: ^3.0.0 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6420,16 +6613,20 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@octokit/graphql": ^5.0.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 luxon: ^3.0.0 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6451,7 +6648,7 @@ __metadata: "@material-ui/core": ^4.12.4 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 - "@spotify/prettier-config": ^14.0.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6464,6 +6661,8 @@ __metadata: react-use: ^17.4.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6484,6 +6683,7 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -6497,6 +6697,7 @@ __metadata: peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6515,15 +6716,18 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6545,12 +6749,14 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/lodash": ^4.14.173 "@types/luxon": ^3.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 lodash: ^4.17.21 luxon: ^3.0.0 @@ -6559,6 +6765,8 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6576,11 +6784,13 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/codemirror": ^5.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 graphiql: ^1.5.12 graphql: ^16.0.0 @@ -6589,6 +6799,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6632,16 +6843,20 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 graphql-voyager: ^1.0.0-rc.31 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6685,17 +6900,19 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 lodash: ^4.17.21 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6719,17 +6936,22 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/pickers": ^3.3.10 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 humanize-duration: ^3.26.0 luxon: ^3.0.0 msw: ^1.0.0 + prop-types: ^15.7.2 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6787,10 +7009,12 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 "@types/testing-library__jest-dom": ^5.9.1 cross-fetch: ^3.1.5 luxon: ^3.0.0 @@ -6798,6 +7022,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6842,17 +7067,20 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 jest-when: ^3.1.0 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6866,6 +7094,7 @@ __metadata: "@aws-sdk/signature-v4": ^3.299.0 "@azure/identity": ^2.0.4 "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-client": "workspace:^" "@backstage/catalog-model": "workspace:^" @@ -6874,6 +7103,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/integration-aws-node": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" + "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-kubernetes-common": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" @@ -6935,6 +7165,7 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -6944,12 +7175,14 @@ __metadata: cronstrue: ^2.2.0 cross-fetch: ^3.1.5 js-yaml: ^4.0.0 + kubernetes-models: ^4.1.0 lodash: ^4.17.21 luxon: ^3.0.0 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -6997,6 +7230,7 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7008,6 +7242,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7069,10 +7304,12 @@ __metadata: "@material-ui/core": ^4.9.13 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 luxon: ^2.0.2 msw: ^1.0.0 @@ -7080,6 +7317,8 @@ __metadata: slugify: ^1.6.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7099,10 +7338,12 @@ __metadata: "@material-ui/icons": ^4.9.1 "@microsoft/microsoft-graph-types": ^2.25.0 "@tanstack/react-query": ^4.1.3 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 classnames: ^2.3.1 cross-fetch: ^3.1.5 dompurify: ^2.3.6 @@ -7113,6 +7354,8 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7136,6 +7379,8 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7153,15 +7398,19 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7181,15 +7430,19 @@ __metadata: "@material-ui/core": ^4.9.13 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7210,15 +7463,19 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7239,10 +7496,12 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 p-limit: ^3.1.0 @@ -7251,6 +7510,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7272,18 +7532,20 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 classnames: ^2.2.6 cross-fetch: ^3.1.5 luxon: ^3.0.0 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7325,11 +7587,13 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/luxon": ^3.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 luxon: ^3.0.0 msw: ^1.0.0 @@ -7337,6 +7601,7 @@ __metadata: peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7345,6 +7610,7 @@ __metadata: resolution: "@backstage/plugin-permission-backend@workspace:plugins/permission-backend" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" @@ -7367,7 +7633,21 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-common@^0.7.4, @backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": +"@backstage/plugin-permission-common@npm:^0.7.4": + version: 0.7.4 + resolution: "@backstage/plugin-permission-common@npm:0.7.4" + dependencies: + "@backstage/config": ^1.0.7 + "@backstage/errors": ^1.1.5 + "@backstage/types": ^1.0.2 + cross-fetch: ^3.1.5 + uuid: ^8.0.0 + zod: ~3.18.0 + checksum: 1252b6a646ead89d86db785c78aec4fa851bacda556636dbb58bcd733abcb5e5440343db3a442017f7ca8ab017c11821e95a4544073211624590e76074484b25 + languageName: node + linkType: hard + +"@backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-common@workspace:plugins/permission-common" dependencies: @@ -7387,6 +7667,7 @@ __metadata: resolution: "@backstage/plugin-permission-node@workspace:plugins/permission-node" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" @@ -7404,7 +7685,25 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-react@^0.4.11, @backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": +"@backstage/plugin-permission-react@npm:^0.4.11": + version: 0.4.11 + resolution: "@backstage/plugin-permission-react@npm:0.4.11" + dependencies: + "@backstage/config": ^1.0.7 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/plugin-permission-common": ^0.7.4 + cross-fetch: ^3.1.5 + react-use: ^17.2.4 + swr: ^2.0.0 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: 93d01833c55f589a91daf1fffa40d5e0446934ac8b2bfb29d9cfcac5b46099ddc832707a08269f8f3fd7883e4623ffa0ee79333e91aca1809307ce9e67ebaae2 + languageName: node + linkType: hard + +"@backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-react@workspace:plugins/permission-react" dependencies: @@ -7415,12 +7714,13 @@ __metadata: "@backstage/test-utils": "workspace:^" "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 react-use: ^17.2.4 swr: ^2.0.0 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7486,20 +7786,24 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 lodash: ^4.17.21 msw: ^1.0.0 + pluralize: ^8.0.0 qs: ^6.9.4 react-hook-form: ^7.13.0 react-use: ^17.2.4 swr: ^2.0.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7541,7 +7845,6 @@ __metadata: "@backstage/config": "workspace:^" "@types/express": ^4.17.6 "@types/supertest": ^2.0.8 - camelcase-keys: ^7.0.1 compression: ^1.7.4 cors: ^2.8.5 express: ^4.17.1 @@ -7573,6 +7876,7 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7586,6 +7890,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7595,13 +7900,13 @@ __metadata: resolution: "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdown" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" - "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" fs-extra: 10.1.0 git-url-parse: ^13.1.0 @@ -7824,11 +8129,12 @@ __metadata: "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 "@rjsf/core": ^3.2.1 - "@rjsf/core-v5": "npm:@rjsf/core@5.3.1" + "@rjsf/core-v5": "npm:@rjsf/core@5.5.0" "@rjsf/material-ui": ^3.2.1 - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.3.1" - "@rjsf/utils": 5.3.1 - "@rjsf/validator-ajv8": 5.3.1 + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.5.0" + "@rjsf/utils": 5.5.0 + "@rjsf/validator-ajv8": 5.5.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7836,6 +8142,7 @@ __metadata: "@types/humanize-duration": ^3.18.1 "@types/json-schema": ^7.0.9 "@types/luxon": ^3.0.0 + "@types/react": ^16.13.1 || ^17.0.0 classnames: ^2.2.6 humanize-duration: ^3.25.1 immer: ^9.0.1 @@ -7850,8 +8157,8 @@ __metadata: zod: ^3.21.4 zod-to-json-schema: ^3.20.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -7889,8 +8196,9 @@ __metadata: "@react-hookz/web": ^20.0.0 "@rjsf/core": ^3.2.1 "@rjsf/material-ui": ^3.2.1 - "@rjsf/utils": 5.3.1 - "@rjsf/validator-ajv8": 5.3.1 + "@rjsf/utils": 5.5.0 + "@rjsf/validator-ajv8": 5.5.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7898,6 +8206,7 @@ __metadata: "@types/humanize-duration": ^3.18.1 "@types/json-schema": ^7.0.9 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 "@uiw/react-codemirror": ^4.9.3 classnames: ^2.2.6 cross-fetch: ^3.1.5 @@ -7917,8 +8226,8 @@ __metadata: zod: ^3.21.4 zod-to-json-schema: ^3.20.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8079,6 +8388,16 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-search-common@npm:^1.2.2": + version: 1.2.2 + resolution: "@backstage/plugin-search-common@npm:1.2.2" + dependencies: + "@backstage/plugin-permission-common": ^0.7.4 + "@backstage/types": ^1.0.2 + checksum: 25d33bb4a35df4081844c4a8f86c1ebc69d80a350bc321f35b902fe4fbc888413c02e7eb407f5a89858714bb1ec99ded99faaed7b73a272fddf0cd15a0cd8752 + languageName: node + linkType: hard + "@backstage/plugin-search-common@workspace:^, @backstage/plugin-search-common@workspace:plugins/search-common": version: 0.0.0-use.local resolution: "@backstage/plugin-search-common@workspace:plugins/search-common" @@ -8105,16 +8424,18 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 + "@types/react": ^16.13.1 || ^17.0.0 lodash: ^4.17.21 qs: ^6.9.4 react-use: ^17.3.2 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8141,18 +8462,21 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 + history: ^5.0.0 msw: ^1.0.0 qs: ^6.9.4 react-use: ^17.2.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8170,10 +8494,12 @@ __metadata: "@backstage/plugin-catalog-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" + "@date-io/core": ^1.3.13 "@material-table/core": ^3.1.0 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8187,6 +8513,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8206,10 +8533,12 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 "@types/zen-observable": ^0.8.2 cross-fetch: ^3.1.5 msw: ^1.0.0 @@ -8219,6 +8548,7 @@ __metadata: zen-observable: ^0.10.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8228,10 +8558,10 @@ __metadata: resolution: "@backstage/plugin-sonarqube-backend@workspace:plugins/sonarqube-backend" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" - "@backstage/test-utils": "workspace:^" "@types/express": "*" "@types/supertest": ^2.0.12 express: ^4.18.1 @@ -8251,8 +8581,11 @@ __metadata: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/core-plugin-api": "workspace:^" + "@types/react": ^16.13.1 || ^17.0.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8274,16 +8607,20 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/styles": ^4.10.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 rc-progress: 3.4.1 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8303,11 +8640,13 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/luxon": ^3.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 classnames: ^2.2.6 cross-fetch: ^3.1.5 luxon: ^3.0.0 @@ -8315,6 +8654,7 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8353,18 +8693,21 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 lodash: ^4.17.21 msw: ^1.0.0 qs: ^6.9.4 react-use: ^17.2.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8382,15 +8725,19 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8491,17 +8838,19 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 qs: ^6.9.4 react-use: ^17.2.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8520,6 +8869,7 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8535,6 +8885,8 @@ __metadata: react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8557,16 +8909,17 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 testing-library__dom: ^7.29.4-beta.1 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 @@ -8627,6 +8980,7 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@react-hookz/web": ^20.0.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8635,10 +8989,12 @@ __metadata: cross-fetch: ^3.1.5 git-url-parse: ^13.0.0 msw: ^1.0.0 - photoswipe: ^5.3.5 + photoswipe: ^5.3.7 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8704,13 +9060,14 @@ __metadata: "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 + "@types/react": ^16.13.1 || ^17.0.0 jss: ~10.10.0 lodash: ^4.17.21 react-helmet: 6.1.0 react-use: ^17.2.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8740,6 +9097,7 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@material-ui/styles": ^4.10.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -8747,6 +9105,7 @@ __metadata: "@types/dompurify": ^2.2.2 "@types/event-source-polyfill": ^1.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 canvas: ^2.10.2 cross-fetch: ^3.1.5 dompurify: ^2.2.9 @@ -8758,7 +9117,6 @@ __metadata: react-helmet: 6.1.0 react-use: ^17.2.4 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 @@ -8807,15 +9165,18 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8860,6 +9221,7 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -8871,6 +9233,7 @@ __metadata: zen-observable: ^0.10.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8919,15 +9282,19 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": "*" + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8946,19 +9313,23 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/luxon": ^3.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 lodash: ^4.17.21 luxon: ^3.0.0 msw: ^1.0.0 react-use: ^17.2.4 - recharts: ^2.0.0 + recharts: ^2.5.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -8987,6 +9358,7 @@ __metadata: "@microsoft/api-extractor": ^7.33.7 "@types/is-glob": ^4.0.2 "@types/mock-fs": ^4.13.0 + "@types/node": ^16.11.26 chalk: ^4.0.0 commander: ^9.1.0 fs-extra: 10.1.0 @@ -9023,27 +9395,41 @@ __metadata: "@backstage/types": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 cross-fetch: ^3.1.5 msw: ^1.0.0 zen-observable: ^0.10.0 peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft -"@backstage/theme@^0.2.16, @backstage/theme@^0.2.18, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": +"@backstage/theme@npm:^0.2.16, @backstage/theme@npm:^0.2.18": + version: 0.2.18 + resolution: "@backstage/theme@npm:0.2.18" + dependencies: + "@material-ui/core": ^4.12.2 + checksum: e5a7f1870666e556c5436b2d0db66edd6372151874bf6238395adfeeb85175aa3649a8d1e66ea9673d8ba0e9d7f8bf1e60eec2bc1b32cbb5508d27c7f9cb7369 + languageName: node + linkType: hard + +"@backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": version: 0.0.0-use.local resolution: "@backstage/theme@workspace:packages/theme" dependencies: "@backstage/cli": "workspace:^" "@material-ui/core": ^4.12.2 + "@types/react": ^16.13.1 || ^17.0.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 languageName: unknown linkType: soft @@ -9058,7 +9444,17 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@^1.0.3, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@npm:^1.0.3": + version: 1.0.3 + resolution: "@backstage/version-bridge@npm:1.0.3" + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 + checksum: 7089a24f5e9dd312e3a0f1a5b4f9787ad6bcc36a96c99c49521b6c67affd90768a71b33c4d5ce22770c5bcd98a76e5c09a1680b14cc223190ec83f833fe295d1 + languageName: node + linkType: hard + +"@backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": version: 0.0.0-use.local resolution: "@backstage/version-bridge@workspace:packages/version-bridge" dependencies: @@ -9066,9 +9462,11 @@ __metadata: "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 - peerDependencies: "@types/react": ^16.13.1 || ^17.0.0 + peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -9631,9 +10029,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/android-arm64@npm:0.17.14" +"@esbuild/android-arm64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/android-arm64@npm:0.17.15" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -9652,9 +10050,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/android-arm@npm:0.17.14" +"@esbuild/android-arm@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/android-arm@npm:0.17.15" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -9666,9 +10064,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/android-x64@npm:0.17.14" +"@esbuild/android-x64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/android-x64@npm:0.17.15" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -9680,9 +10078,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/darwin-arm64@npm:0.17.14" +"@esbuild/darwin-arm64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/darwin-arm64@npm:0.17.15" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -9694,9 +10092,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/darwin-x64@npm:0.17.14" +"@esbuild/darwin-x64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/darwin-x64@npm:0.17.15" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -9708,9 +10106,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/freebsd-arm64@npm:0.17.14" +"@esbuild/freebsd-arm64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/freebsd-arm64@npm:0.17.15" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -9722,9 +10120,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/freebsd-x64@npm:0.17.14" +"@esbuild/freebsd-x64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/freebsd-x64@npm:0.17.15" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -9736,9 +10134,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/linux-arm64@npm:0.17.14" +"@esbuild/linux-arm64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/linux-arm64@npm:0.17.15" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -9750,9 +10148,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/linux-arm@npm:0.17.14" +"@esbuild/linux-arm@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/linux-arm@npm:0.17.15" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -9764,9 +10162,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/linux-ia32@npm:0.17.14" +"@esbuild/linux-ia32@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/linux-ia32@npm:0.17.15" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -9785,9 +10183,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/linux-loong64@npm:0.17.14" +"@esbuild/linux-loong64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/linux-loong64@npm:0.17.15" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -9799,9 +10197,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/linux-mips64el@npm:0.17.14" +"@esbuild/linux-mips64el@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/linux-mips64el@npm:0.17.15" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -9813,9 +10211,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/linux-ppc64@npm:0.17.14" +"@esbuild/linux-ppc64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/linux-ppc64@npm:0.17.15" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -9827,9 +10225,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/linux-riscv64@npm:0.17.14" +"@esbuild/linux-riscv64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/linux-riscv64@npm:0.17.15" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -9841,9 +10239,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/linux-s390x@npm:0.17.14" +"@esbuild/linux-s390x@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/linux-s390x@npm:0.17.15" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -9855,9 +10253,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/linux-x64@npm:0.17.14" +"@esbuild/linux-x64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/linux-x64@npm:0.17.15" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -9869,9 +10267,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/netbsd-x64@npm:0.17.14" +"@esbuild/netbsd-x64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/netbsd-x64@npm:0.17.15" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -9883,9 +10281,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/openbsd-x64@npm:0.17.14" +"@esbuild/openbsd-x64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/openbsd-x64@npm:0.17.15" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -9897,9 +10295,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/sunos-x64@npm:0.17.14" +"@esbuild/sunos-x64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/sunos-x64@npm:0.17.15" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -9911,9 +10309,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/win32-arm64@npm:0.17.14" +"@esbuild/win32-arm64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/win32-arm64@npm:0.17.15" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -9925,9 +10323,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/win32-ia32@npm:0.17.14" +"@esbuild/win32-ia32@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/win32-ia32@npm:0.17.15" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -9939,9 +10337,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.17.14": - version: 0.17.14 - resolution: "@esbuild/win32-x64@npm:0.17.14" +"@esbuild/win32-x64@npm:0.17.15": + version: 0.17.15 + resolution: "@esbuild/win32-x64@npm:0.17.15" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -10149,8 +10547,8 @@ __metadata: linkType: hard "@google-cloud/storage@npm:^6.0.0": - version: 6.9.4 - resolution: "@google-cloud/storage@npm:6.9.4" + version: 6.9.5 + resolution: "@google-cloud/storage@npm:6.9.5" dependencies: "@google-cloud/paginator": ^3.0.7 "@google-cloud/projectify": ^3.0.0 @@ -10169,7 +10567,7 @@ __metadata: retry-request: ^5.0.0 teeny-request: ^8.0.0 uuid: ^8.0.0 - checksum: d8ee110843e22d7141a9a93fae01590f5b15946e389544eda858d78abf3aaae2ab353548c15f219f53cac9af63ef52bd565540b638f8c7866ade5da414efc5ce + checksum: eff663cc44ee553fbd2f62b67ef422783f29210c67f55c86c13e63a40c36f3c9b78e076b2a08bb6a74a9fdc452de9240aac91e0fa11c3a4f782416a230d88b74 languageName: node linkType: hard @@ -10207,14 +10605,14 @@ __metadata: linkType: hard "@graphql-codegen/cli@npm:^3.0.0": - version: 3.2.2 - resolution: "@graphql-codegen/cli@npm:3.2.2" + version: 3.3.0 + resolution: "@graphql-codegen/cli@npm:3.3.0" dependencies: "@babel/generator": ^7.18.13 "@babel/template": ^7.18.10 "@babel/types": ^7.18.13 "@graphql-codegen/core": ^3.1.0 - "@graphql-codegen/plugin-helpers": ^4.1.0 + "@graphql-codegen/plugin-helpers": ^4.2.0 "@graphql-tools/apollo-engine-loader": ^7.3.6 "@graphql-tools/code-file-loader": ^7.3.17 "@graphql-tools/git-loader": ^7.2.13 @@ -10252,7 +10650,7 @@ __metadata: graphql-code-generator: cjs/bin.js graphql-codegen: cjs/bin.js graphql-codegen-esm: esm/bin.js - checksum: b94284ac538a3504f96c7d507c140b7cfee30042209c4230ffc3068f05b6b27c75e1922b31c696363ab43e34e472ed194cc72996bbb10f59991cd2a4a35ff36e + checksum: 7c3ae7ba62cfb5576e6c1fc78f81a2c59d399415b9ef2ba55818af00aff2337a047a61b1cedb6e89e73dac30d9a00e57045ff6052245934bc4c5cf35c9762250 languageName: node linkType: hard @@ -10271,24 +10669,24 @@ __metadata: linkType: hard "@graphql-codegen/graphql-modules-preset@npm:^3.0.0": - version: 3.1.1 - resolution: "@graphql-codegen/graphql-modules-preset@npm:3.1.1" + version: 3.1.2 + resolution: "@graphql-codegen/graphql-modules-preset@npm:3.1.2" dependencies: - "@graphql-codegen/plugin-helpers": ^4.1.0 - "@graphql-codegen/visitor-plugin-common": 3.0.2 + "@graphql-codegen/plugin-helpers": ^4.2.0 + "@graphql-codegen/visitor-plugin-common": 3.1.0 "@graphql-tools/utils": ^9.0.0 change-case-all: 1.0.15 parse-filepath: ^1.0.2 tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: f437590afa33ac308c075d214b501404ae2f99888cac8071d05cc2b8c7ceaea5aef8f86bb60e7a9a45902126dc99bd20d77e951c0beef665aaa31ac3c2217e26 + checksum: d3b4e9fe169742ce7973466045793ff0823c690f0736ba22aef3d4578be498746df108726ccad0c190d1c45a33816ab4e010b9c6e9931ced06ef7489d85a3691 languageName: node linkType: hard -"@graphql-codegen/plugin-helpers@npm:^4.1.0": - version: 4.1.0 - resolution: "@graphql-codegen/plugin-helpers@npm:4.1.0" +"@graphql-codegen/plugin-helpers@npm:^4.1.0, @graphql-codegen/plugin-helpers@npm:^4.2.0": + version: 4.2.0 + resolution: "@graphql-codegen/plugin-helpers@npm:4.2.0" dependencies: "@graphql-tools/utils": ^9.0.0 change-case-all: 1.0.15 @@ -10298,7 +10696,7 @@ __metadata: tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: a4d89909d7a62bd7a93041b6073b1d46e912b42f7af1d15c44f7ed595ab1185b6c257cccf8272e0ae36ba22724578449d0e21524e8dbc21fb375da0620687868 + checksum: 5d26adc132026916db061d23b06fc2c329f372f19ecf56e39bd2b30082bff642f2030cd6dc0bad8d2d3ab781c1e145384e040310a479b83d85ec804b2983646d languageName: node linkType: hard @@ -10316,41 +10714,41 @@ __metadata: linkType: hard "@graphql-codegen/typescript-resolvers@npm:^3.0.0": - version: 3.1.1 - resolution: "@graphql-codegen/typescript-resolvers@npm:3.1.1" + version: 3.2.0 + resolution: "@graphql-codegen/typescript-resolvers@npm:3.2.0" dependencies: - "@graphql-codegen/plugin-helpers": ^4.1.0 - "@graphql-codegen/typescript": ^3.0.2 - "@graphql-codegen/visitor-plugin-common": 3.0.2 + "@graphql-codegen/plugin-helpers": ^4.2.0 + "@graphql-codegen/typescript": ^3.0.3 + "@graphql-codegen/visitor-plugin-common": 3.1.0 "@graphql-tools/utils": ^9.0.0 auto-bind: ~4.0.0 tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 88faa1ca2335096aa9939101f3591007d9fa477836d969a3c622dbf67704505600387a2e9fbb416d61b5ef42dbd79a0d351003037c0756d8d0c7f32c7961e783 + checksum: d866b95775c95d1685e832a1d24df2a1e98feb67f35ef20a5d590c42b7314307b48399531b0cdc004e0be1062769ffe1e1a4757863ed1ca1f575dcd5e08b014d languageName: node linkType: hard -"@graphql-codegen/typescript@npm:^3.0.0, @graphql-codegen/typescript@npm:^3.0.2": - version: 3.0.2 - resolution: "@graphql-codegen/typescript@npm:3.0.2" +"@graphql-codegen/typescript@npm:^3.0.0, @graphql-codegen/typescript@npm:^3.0.3": + version: 3.0.3 + resolution: "@graphql-codegen/typescript@npm:3.0.3" dependencies: - "@graphql-codegen/plugin-helpers": ^4.1.0 + "@graphql-codegen/plugin-helpers": ^4.2.0 "@graphql-codegen/schema-ast": ^3.0.1 - "@graphql-codegen/visitor-plugin-common": 3.0.2 + "@graphql-codegen/visitor-plugin-common": 3.1.0 auto-bind: ~4.0.0 tslib: ~2.5.0 peerDependencies: graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: e92dc54804b6ad45fb2499b91cb89743e455a984684e2b1df1b1a8f479a0bbffa5c625be97ccb55874ac8b7316a820b546e9e312b22eda78012acd5c27594a28 + checksum: 5d292379b5f25f1df0dfdec62211f7e304a85910b6e30dcb28e89478dd15b565f05993913d9b8cf7f08b1e9166242f08e9cb68bd9688f486bd5eada7c6f82442 languageName: node linkType: hard -"@graphql-codegen/visitor-plugin-common@npm:3.0.2": - version: 3.0.2 - resolution: "@graphql-codegen/visitor-plugin-common@npm:3.0.2" +"@graphql-codegen/visitor-plugin-common@npm:3.1.0": + version: 3.1.0 + resolution: "@graphql-codegen/visitor-plugin-common@npm:3.1.0" dependencies: - "@graphql-codegen/plugin-helpers": ^4.1.0 + "@graphql-codegen/plugin-helpers": ^4.2.0 "@graphql-tools/optimize": ^1.3.0 "@graphql-tools/relay-operation-optimizer": ^6.5.0 "@graphql-tools/utils": ^9.0.0 @@ -10362,7 +10760,7 @@ __metadata: tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: c8f941df7f8304b722b492ceaf15dddcf33e3a69bc29b54970908ffa12b14d92276958005bd307648e0cdc55f9e243d0fb390862f73a17a26bd50f6484ac42d6 + checksum: 7532666c578680cda538d7b859ee7d5541113f3972f0f2396affa4dd6823a2e2d6f8b715c685912652b0906722dfafb4375c462aa3b4f991a12ec0a28f1b7ba7 languageName: node linkType: hard @@ -11022,6 +11420,8 @@ __metadata: "@types/react": ^16.13.1 || ^17.0.0 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -11077,14 +11477,18 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": ^16.13.1 || ^17.0.0 msw: ^1.0.0 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 languageName: unknown linkType: soft @@ -11507,21 +11911,54 @@ __metadata: linkType: hard "@keyv/memcache@npm:^1.3.5": - version: 1.3.6 - resolution: "@keyv/memcache@npm:1.3.6" + version: 1.3.7 + resolution: "@keyv/memcache@npm:1.3.7" dependencies: json-buffer: ^3.0.1 - memjs: ^1.3.0 - checksum: 3360055b6e22d1be7a77341dc99bafb5434d3288dace94067f3307f6d9498f984dcb0d8452a5b2d97ddca8f8c973caf7cc1332e0ffada1c6dbfb0b2a2d42451a + memjs: ^1.3.1 + checksum: 61c836c1b0c264c35281a38dbc380a102b2899eab46226a0e31614d3d7c4708ecdb06d8858f711893212ae5b357a79213c7a7b7a81b6196e56dd889dd1ca498b languageName: node linkType: hard "@keyv/redis@npm:^2.5.3": - version: 2.5.6 - resolution: "@keyv/redis@npm:2.5.6" + version: 2.5.7 + resolution: "@keyv/redis@npm:2.5.7" dependencies: ioredis: ^5.3.1 - checksum: ccd19ed1f3e9b0a820b5b537d978dadd2bae19988cbb136312a38cb8cc3d3b2d88a53d20aefdd96e85ce9f341ee3ab29f371379627bd27bd587cd3926d3115a3 + checksum: e0ed1b6602afcc339bb2bf014d8801e6b7a3b6392d0f8e4ccfc59d919f59229b8787c50c48fc51636625ffdf55cf1ef6c450425a73bd88f9b866e74f1b3e25f8 + languageName: node + linkType: hard + +"@kubernetes-models/apimachinery@npm:^1.1.0": + version: 1.1.0 + resolution: "@kubernetes-models/apimachinery@npm:1.1.0" + dependencies: + "@kubernetes-models/base": ^4.0.0 + "@kubernetes-models/validate": ^3.0.0 + tslib: ^2.4.0 + checksum: 71fc127a8e50c3686e32d9f9df94a307ae4d69995d6e82ea50a7eb9a5ce6a18e9950700ad0eb445e1451c997aabb22e2594ab1037c11faa9c0051b51bab569c6 + languageName: node + linkType: hard + +"@kubernetes-models/base@npm:^4.0.0": + version: 4.0.0 + resolution: "@kubernetes-models/base@npm:4.0.0" + dependencies: + "@kubernetes-models/validate": ^3.0.0 + is-plain-object: ^5.0.0 + tslib: ^2.4.0 + checksum: 3c44f2220e119c24b874d6d674f38f9796f0ab682ba0cff1516d39549a6536055348bcee6c3c5257ebb8d4d6c8d1865d84e519d8f8948e6dd29eb1d72f3830cb + languageName: node + linkType: hard + +"@kubernetes-models/validate@npm:^3.0.0": + version: 3.0.0 + resolution: "@kubernetes-models/validate@npm:3.0.0" + dependencies: + ajv: ^8.11.0 + ajv-formats: ^2.1.1 + tslib: ^2.4.0 + checksum: b53b7181ddaad7e8faf6ceac228cb23df239ef5da3784887f3378dd3a7f89e1936b7b1884ab123255a905627311bab4302a06668fba35d26152e69fbf208a855 languageName: node linkType: hard @@ -13142,19 +13579,19 @@ __metadata: languageName: node linkType: hard -"@rjsf/core-v5@npm:@rjsf/core@5.3.1": - version: 5.3.1 - resolution: "@rjsf/core@npm:5.3.1" +"@rjsf/core-v5@npm:@rjsf/core@5.5.0": + version: 5.5.0 + resolution: "@rjsf/core@npm:5.5.0" dependencies: lodash: ^4.17.15 lodash-es: ^4.17.15 - markdown-to-jsx: ^7.1.9 + markdown-to-jsx: ^7.2.0 nanoid: ^3.3.4 prop-types: ^15.7.2 peerDependencies: "@rjsf/utils": ^5.0.0 react: ^16.14.0 || >=17 - checksum: e7f5c05a594db0549c5289f1dc570977fa37c9ca0f1fed47ec17fa49dd4b6b85ffc3844c9c11d36455a66ff17f898469b6a2dca159223de348f84bdadd28ae32 + checksum: fc8f9de851526aaa61c800a2b2d181d6d51fee69c25be62e9e2a4af9f4b047369316a3a10c1e64444af22ca5cc96e8a024e6d376c774378e1b5f914337002736 languageName: node linkType: hard @@ -13177,16 +13614,16 @@ __metadata: languageName: node linkType: hard -"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.3.1": - version: 5.3.1 - resolution: "@rjsf/material-ui@npm:5.3.1" +"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.5.0": + version: 5.5.0 + resolution: "@rjsf/material-ui@npm:5.5.0" peerDependencies: "@material-ui/core": ^4.12.3 "@material-ui/icons": ^4.11.2 "@rjsf/core": ^5.0.0 "@rjsf/utils": ^5.0.0 react: ^16.14.0 || >=17 - checksum: 169d78e3983742b38008de95ab320cdc1f52995dabf2e75d44052c09fb0b734ecb45c58fbdf51dea18bf8bd45130aec01dc0b4b75a2635e82ef5c489d1d35af1 + checksum: ef247264f040ae1aec0e7f71225d8aba6f733dc0ef70e111ac69cb83801fa02c55582d8f33b68f5df09d051fb1ddbf41ae50179b0d43292bef88661e72163d36 languageName: node linkType: hard @@ -13202,9 +13639,9 @@ __metadata: languageName: node linkType: hard -"@rjsf/utils@npm:5.3.1": - version: 5.3.1 - resolution: "@rjsf/utils@npm:5.3.1" +"@rjsf/utils@npm:5.5.0": + version: 5.5.0 + resolution: "@rjsf/utils@npm:5.5.0" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -13213,13 +13650,13 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: 400a17bf99a043557adbd4e0dc3651b9d1b47ab61a40acb8756c5b986d044a329bd26bf45263a667eb963acf51084d612c043c9409aeaac4e4c6ab66af0bb700 + checksum: cf777657867a0ac58b12194a1a024bb6d9da21781bfb18183cd3c0658308c129db69417ffd067218f0bef9c465825a53a4fa2ddfc7f977dd47f3d5a0cca55d52 languageName: node linkType: hard -"@rjsf/validator-ajv8@npm:5.3.1": - version: 5.3.1 - resolution: "@rjsf/validator-ajv8@npm:5.3.1" +"@rjsf/validator-ajv8@npm:5.5.0": + version: 5.5.0 + resolution: "@rjsf/validator-ajv8@npm:5.5.0" dependencies: ajv: ^8.12.0 ajv-formats: ^2.1.1 @@ -13227,13 +13664,13 @@ __metadata: lodash-es: ^4.17.15 peerDependencies: "@rjsf/utils": ^5.0.0 - checksum: b99e0d2df6b6431438ea81c2e31636aa5a1939d054153236851e5d8e8b06f8a1958c8c16887dd2babfd1608e18aa1ce3f1c0a778b3b3198028b92f0553e0383e + checksum: 7f2cd3f4e3f2df2d487ab0f93011cfb11fd7d2173a6cdf322a6fd7978817b37d031ca049fe02f433268d5df2afc59f21c7a06238ed45d3aac0be17898e54a85e languageName: node linkType: hard "@roadiehq/backstage-plugin-buildkite@npm:^2.0.8": - version: 2.1.7 - resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.7" + version: 2.1.8 + resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.8" dependencies: "@backstage/catalog-model": ^1.2.1 "@backstage/core-components": ^0.12.5 @@ -13251,13 +13688,13 @@ __metadata: react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 1b84acf97e22f3b481d4b4fbc1ccb1d184f811ec00998b92cc8ee6f4be95af2acebd9932ad4337c611d17ca15f8c34cd44310a44d775008a1d845fe1a197ae37 + checksum: f35f5bb78cb415a894532e5af5879d47d6b61c2f52bc6f4274fde46bc7bba2bca974845a802fdd361591002d048b8f14a4ce4aee1b6a2d70df531b8bb60ae447 languageName: node linkType: hard "@roadiehq/backstage-plugin-github-insights@npm:^2.0.5": - version: 2.3.8 - resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.8" + version: 2.3.9 + resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.9" dependencies: "@backstage/catalog-model": ^1.2.1 "@backstage/core-components": ^0.12.5 @@ -13279,13 +13716,13 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: 0a9027a035d41e46344d88da361ec91fbf43adb018bb9e383e5659d4478b67951ef9e32381b020a2104bf16be5009ae7e97c07182dcbe04721d6385e93ec8ce2 + checksum: 49b95a6724cb1126686dc29fc6d949583209dc47cc299c30a84fa5f9ac951bd74bb15901110856ba410e86dd75027562277ce5a9456d5c07557a67ef04bb9d7f languageName: node linkType: hard "@roadiehq/backstage-plugin-github-pull-requests@npm:^2.2.7": - version: 2.5.5 - resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.5" + version: 2.5.6 + resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.6" dependencies: "@backstage/catalog-model": ^1.2.1 "@backstage/core-components": ^0.12.5 @@ -13308,13 +13745,13 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: 3a17a21665c397b3bd94c277e31b9f1005387b458a14b1c4c3bd28f6ef1400289fcf24e44bb8c54e07b99b59af49fe608c587f49e27d15cf01ef4d539cc25354 + checksum: 063a6a5802ec927e75c9616bac11b87721d66e168b59be57b860ce79f23c42714ef1b43cadcc530d2b4b98335deb2d074c27a8d004dce55c8eba787c479d83f2 languageName: node linkType: hard "@roadiehq/backstage-plugin-travis-ci@npm:^2.0.5": - version: 2.1.7 - resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.7" + version: 2.1.8 + resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.8" dependencies: "@backstage/catalog-model": ^1.2.1 "@backstage/core-components": ^0.12.5 @@ -13334,7 +13771,7 @@ __metadata: react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 1a00d0128e1bdacac93ffa7b1aa1534ec91b603899d40967ed387e3fd91f35bbc5f9babfc7b811279775d60e28db7747211fd5c0d368db23b5a184b054e918c1 + checksum: b135750b1fbf6f74743dd9142c2fcdec00379633ffd1b3793649eeea9ef6b015165da0dcb85f5442294364794c77592ef8ec1e83ada9f8bbb66ac394729a6f1a languageName: node linkType: hard @@ -13767,7 +14204,7 @@ __metadata: languageName: node linkType: hard -"@svgr/core@npm:^6.5.0": +"@svgr/core@npm:6.5.x, @svgr/core@npm:^6.5.0": version: 6.5.0 resolution: "@svgr/core@npm:6.5.0" dependencies: @@ -13864,9 +14301,9 @@ __metadata: languageName: node linkType: hard -"@swagger-api/apidom-core@npm:=0.69.0, @swagger-api/apidom-core@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-core@npm:0.69.0" +"@swagger-api/apidom-core@npm:>=0.69.2 <1.0.0, @swagger-api/apidom-core@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-core@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 "@swagger-api/apidom-ast": ^0.69.0 @@ -13876,194 +14313,194 @@ __metadata: ramda-adjunct: =3.4.0 short-unique-id: =4.4.4 stampit: =4.3.2 - checksum: 036dc1198014fff9d7e879529186c4b0db423ae4c933eecec90650985e198cb3745638feff8681f85940f124703484d1b071dfca4eaf7b9457a4f99186c98972 + checksum: c7820c1fb7e2e790796f5b124054f48f2153e0480f949a8baa3bfd7a507ae63da0303c252573f76a30844c9d8acc50bd6a29a7139f36ba57d7d582c7ca8eb29f languageName: node linkType: hard -"@swagger-api/apidom-json-pointer@npm:=0.69.0, @swagger-api/apidom-json-pointer@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-json-pointer@npm:0.69.0" +"@swagger-api/apidom-json-pointer@npm:>=0.69.2 <1.0.0, @swagger-api/apidom-json-pointer@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-json-pointer@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 - checksum: 7930d938011c608d5c227c3b1cbfcb120eeebd32aedd447220219b079d030af6387a9a61e74461fe53578c06ba29aa78e5e5fdfcd561d5611d5a07ef5534ee49 + checksum: 3485f1ed477a4c5b2982b996ab94695612d922da1c57432576936eb1ef22023f399f26fbc7b498d95f269ba37445393ea6f9548e82006483fd33e86c25dcf953 languageName: node linkType: hard -"@swagger-api/apidom-ns-api-design-systems@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-ns-api-design-systems@npm:0.69.0" +"@swagger-api/apidom-ns-api-design-systems@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-ns-api-design-systems@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-openapi-3-1": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 stampit: =4.3.2 - checksum: 1c3047d4081cd07bbbdce6fa19c62407d1c57f7bf05b85947fd1e9b3cc2c2792fb85a926a54d3376c761a123ce3b130b06e38830ca68743a20c684aae89275f1 + checksum: 63dc8eb922bf41896645d09cb012126fd25c59e9d4c82c688b2677080c850ee5917163c84eb27ceffbdb4302eef4c5d9aee8a9dae9c4e28a63956d1fbd0dbf7b languageName: node linkType: hard -"@swagger-api/apidom-ns-asyncapi-2@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:0.69.0" +"@swagger-api/apidom-ns-asyncapi-2@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-json-schema-draft-7": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-json-schema-draft-7": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 stampit: =4.3.2 - checksum: c5b9161166ddce0be047a474e7257520a756ed3fe426b806c19122334535d07b48529be60638dd560ab6ff23899641cee1110932cad16b4bf93f8fbe8f52ca05 + checksum: 067437e2f020a64824d6726b833e42c48776f1ebbe007552a2bf9659305a11cc1e852aa4860c529e730c792b698e77564cf8688131f6c48c63b0a230c049e030 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-4@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:0.69.0" +"@swagger-api/apidom-ns-json-schema-draft-4@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 stampit: =4.3.2 - checksum: d308227f5849071be3481bd8d4a8dc16d0e9e99edb61250927da88ed34595d176d59792003a2a666a49585643ff659a16774826790aab718a316beda9ce617c3 + checksum: 61d4ed9c69e7f4eeaa57cb56e789453deebc73209ecfaa9630c4ef9b90d54adb52424c877e039da266a80741521d41f3c02fd9792e244b4fec70803439b49070 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-6@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:0.69.0" +"@swagger-api/apidom-ns-json-schema-draft-6@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-json-schema-draft-4": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-json-schema-draft-4": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 stampit: =4.3.2 - checksum: df237753d0c9aa7d22029c22b5355310a14aa7a77aa484cc86d46850bd994db3f0901804510a6c62196e181c150e15fc7a031b97f0f45983b6f819fb7ed71ccb + checksum: fa37e493d6057739b1e18ba6bd21954e559185db1ea4318eed9d30cbe05e4b87c371712fdcd21bd81fccd9b94bdfda99c11f4260386764aaa95e0d8177921a7e languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-7@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:0.69.0" +"@swagger-api/apidom-ns-json-schema-draft-7@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-json-schema-draft-6": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-json-schema-draft-6": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 stampit: =4.3.2 - checksum: a2059092cfb1797c90b15384270df65fadd6d1e8b469350082ab46d25a1840fd05ff0bea72a8005068f77ab277a049110962a15f1fbeeac63b9c0a34d21d78c2 + checksum: f6ae001675eb918aed498c1cc71da735463047c2f5cfadcf33746b663535ed029164a2fc8cafeabb118ab1b00a53bc93a08296f6593688c4225bf2c12b1fa2b5 languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-3-0@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:0.69.0" +"@swagger-api/apidom-ns-openapi-3-0@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-json-schema-draft-4": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-json-schema-draft-4": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 stampit: =4.3.2 - checksum: e53bda9fada416e23a5220dd8987b3e4082b3020e3db40c5532fdd454aaa02953d4d72223fd0372897b0a6a73b321f89e83504d60bb8b52fa4fbcdfb5f097e59 + checksum: d876bde22b46d511ed74d0431d86f6d00e51567647e0d540288ab2965dfd7610189b1fe58f4a7accd9c83daa914ead87af572090daf2e07ef9df65c6c95e7bdd languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-3-1@npm:=0.69.0, @swagger-api/apidom-ns-openapi-3-1@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:0.69.0" +"@swagger-api/apidom-ns-openapi-3-1@npm:>=0.69.2 <1.0.0, @swagger-api/apidom-ns-openapi-3-1@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-openapi-3-0": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 stampit: =4.3.2 - checksum: 7f194ebb36891655fdcd8dfe88e664e70f6efcd713ac6defc75dadefb0087d3fd0358b656dec4920d876342d23c44ff1cee034fa32cfa1f8b3d49ceba9509dbb + checksum: 2862f9e7855687a997658d17681cbb89531d2713d49fad9eca972c1fb904769990c019a7082aab1f5750ea9e2e4f108fb62181d1e02e2519b027742a1cd9d02b languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:0.69.0" +"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-api-design-systems": ^0.69.0 - "@swagger-api/apidom-parser-adapter-json": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-api-design-systems": ^0.69.2 + "@swagger-api/apidom-parser-adapter-json": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 - checksum: 68b43e19effd7b9c26e52381903a39fff7ef0990ad3cbcbf4aa7de01cf3454d915dc10d8f688aa0fa4405b11f1a6d8f49bc160e6b72c482fadb484bd787bdebd + checksum: 062ad18d3fd402008558854415c725e94d9e1941b2049e40c54cbbdd190a9435c6f105808b7b8c36e0a3f0d8232bc17b2145d32f88957ff01e649aaa03fe2d8e languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:0.69.0" +"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-api-design-systems": ^0.69.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-api-design-systems": ^0.69.2 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 - checksum: 6ded590b93087ad4b848ba4f742c6baeb35a572195d763a1ae0b479b8de4ae7d331175d5042116dab26684413ca6a58680080fb4b28ca5c66c7d72d6e624e174 + checksum: 09deb1fe9234780c93d5cae4c25bfbe2b31e0f13726fafeeed3f79120ad3bfcf1a4ca85790b8e2ddd5d0120df4c7cd667b7ff7ba9270f07e66c56316008b90a3 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:0.69.0" +"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-asyncapi-2": ^0.69.0 - "@swagger-api/apidom-parser-adapter-json": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-asyncapi-2": ^0.69.2 + "@swagger-api/apidom-parser-adapter-json": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 - checksum: c13b4ea5a603d7422ebf4dd87851a72a999c0036ff451b080cd37b96aa1b455f6483c447e4962303af52b44ac0fca3517573dfeeddbdb7f8d04cb7ff8796089f + checksum: 7730bf99d5c57be4b5af56701f376b4b50009e9d6ddb854fd643ea331720e12855834c869a95fca06959971879ebc7227db3f76074b56ea1ee07bb7b14bcb18a languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:0.69.0" +"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-asyncapi-2": ^0.69.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-asyncapi-2": ^0.69.2 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 - checksum: f3415e86371f98e3677d22f432214f4b4e2267b80da2f505ed28d89c711fa32a627cea94040c6071e83d2ea3cf6aabc454331951d2fd3bcc138b091e78286423 + checksum: d3de29891320bed19f0a7ab161c73a2bef34cca634119f2c71dd782f41cd7086322f5f8e80a337e07585cd723d6cf1be8b1a7e7fe98154afb79fd88027b5b44e languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-json@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-parser-adapter-json@npm:0.69.0" +"@swagger-api/apidom-parser-adapter-json@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-parser-adapter-json@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 "@swagger-api/apidom-ast": ^0.69.0 - "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 "@types/ramda": =0.28.23 node-gyp: latest ramda: =0.28.0 @@ -14072,77 +14509,77 @@ __metadata: tree-sitter: =0.20.1 tree-sitter-json: =0.20.0 web-tree-sitter: =0.20.7 - checksum: e640ffbf749285f70ea4d125cbb030ff9920b011e8694e3cd5c379b3a6f3f387805c9535af7786c2bed6f0f67bfd9f6daad6eb65a64ca76b48b45f283933f4d5 + checksum: 30fbb4fd5f2c63440b4d64577997c33c5cc9d881a9eb07a08704fcfc5171a75e7ec9e9364c7de8aac829d08bf2e48be5e7803f22f3fdca72fa58e56bd90aaed6 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:0.69.0" +"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.69.0 - "@swagger-api/apidom-parser-adapter-json": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-openapi-3-0": ^0.69.2 + "@swagger-api/apidom-parser-adapter-json": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 - checksum: 50c61b46d16ed2a24816665ee810c295f6e82cad8a031ebc91d91aa3650bae92ddcede99ceea4346dcb69ca6edd811213018ebe8b23929012c08b425103a807d + checksum: 7c030340a7f9a24091dd0542377e5ea95b6c10967f9791ea065456301ac3766eb373ee402ed10766c4c215801308c7274f0dce925d4cab4b38b02bd3e2d58ed3 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:0.69.0" +"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.69.0 - "@swagger-api/apidom-parser-adapter-json": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-openapi-3-1": ^0.69.2 + "@swagger-api/apidom-parser-adapter-json": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 - checksum: 9c657b1eb82814958ed2b2c4e710a51378cbb11ca6957d0cc57ec544e0cba4a3bac412475f923e47c1fff8130f5a42cf8edcd99080703316150de8f1b30891b8 + checksum: b7535677eae57c5e4b6eadb834b17606e3bd4702e3753bdf4daaa675fbd1609691f3a76c355f6d8ad8e58a82d7f2e6089d0cff59edc3de7e5a505abf81f568f4 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:0.69.0" +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.69.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-openapi-3-0": ^0.69.2 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 - checksum: ee32fc65e053ccda7eae265ad1a43e5acd0688460620912363156ada3babf3115fbec0dd35423ca633aaf78e9e4ed71ee4be030385cfdcc9ed69e8438319cc19 + checksum: f8129919930c6f79e7ff16a7eef0f58d1f585d4df3c69c52cebd2fb21fdde58be0192ac4a1a16ba4e0efc6e5aee4adcd34c63c726dc71b88f154b8ce785fcd2b languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:0.69.0" +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.69.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-ns-openapi-3-1": ^0.69.2 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.2 "@types/ramda": =0.28.23 ramda: =0.28.0 ramda-adjunct: =3.4.0 - checksum: c21f6ad4b149f64bb5af24d7d7ba5bd8342c2ab2e0e37d85617ca0d4d3333ee45a4603ce7cdca460d4dcb17c6d41b47f733390d3ef6754664ae11705a628fe9c + checksum: fc9772e9e6028a67c089806207a289ac585b5c6ab4645377467fbf3d5c6f6f01d2ccddeb9324e5faca7495a2efb09f8d04570bf22acde58cecca682edc75d420 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:0.69.0" +"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^0.69.2": + version: 0.69.2 + resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 "@swagger-api/apidom-ast": ^0.69.0 - "@swagger-api/apidom-core": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 "@types/ramda": =0.28.23 node-gyp: latest ramda: =0.28.0 @@ -14151,33 +14588,33 @@ __metadata: tree-sitter: =0.20.1 tree-sitter-yaml: =0.5.0 web-tree-sitter: =0.20.7 - checksum: 6067347f6ab9d2cfbbe55f13345609c86b1660bebb7cea215c90739eab011498695d785bc7bb75fc95055ea98bafc765bbc0d304ad19f72647b72ee4308d249e + checksum: 9d4fb2638e84e756ce01b9115956885c6f00ecdfe745af105ba4328b6092b4073cf1dcbc7cf33e420a5c4191ce7a4173fc8b0abc7dcb22d8af4a10ac62818ec6 languageName: node linkType: hard -"@swagger-api/apidom-reference@npm:=0.69.0": - version: 0.69.0 - resolution: "@swagger-api/apidom-reference@npm:0.69.0" +"@swagger-api/apidom-reference@npm:>=0.69.2 <1.0.0": + version: 0.69.2 + resolution: "@swagger-api/apidom-reference@npm:0.69.2" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.69.0 - "@swagger-api/apidom-json-pointer": ^0.69.0 - "@swagger-api/apidom-ns-asyncapi-2": ^0.69.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.69.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.69.0 - "@swagger-api/apidom-parser-adapter-api-design-systems-json": ^0.69.0 - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": ^0.69.0 - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": ^0.69.0 - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": ^0.69.0 - "@swagger-api/apidom-parser-adapter-json": ^0.69.0 - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": ^0.69.0 - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": ^0.69.0 - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": ^0.69.0 - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": ^0.69.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.0 + "@swagger-api/apidom-core": ^0.69.2 + "@swagger-api/apidom-json-pointer": ^0.69.2 + "@swagger-api/apidom-ns-asyncapi-2": ^0.69.2 + "@swagger-api/apidom-ns-openapi-3-0": ^0.69.2 + "@swagger-api/apidom-ns-openapi-3-1": ^0.69.2 + "@swagger-api/apidom-parser-adapter-api-design-systems-json": ^0.69.2 + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": ^0.69.2 + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": ^0.69.2 + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": ^0.69.2 + "@swagger-api/apidom-parser-adapter-json": ^0.69.2 + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": ^0.69.2 + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": ^0.69.2 + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": ^0.69.2 + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": ^0.69.2 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.69.2 "@types/ramda": =0.28.23 axios: =1.3.4 - minimatch: =7.3.0 + minimatch: =7.4.3 process: =0.11.10 ramda: =0.28.0 ramda-adjunct: =3.4.0 @@ -14211,7 +14648,7 @@ __metadata: optional: true "@swagger-api/apidom-parser-adapter-yaml-1-2": optional: true - checksum: f176e51e64377c09449e9f5bf50438be7a05fa63d4ff2f9ec5c45cf0722439537aafbe4804e2197661a652cec013c1aaa78f6a2a7ac4f6d63083aa07875c8671 + checksum: 92bda2e2d905a184f005a9be51cbe02cbaa3791a349d9fc956bf24b3d42b9215a0d6ff036929a5104cb0402713e7b12760a4ceeda23b89e3936fbd799c8515f0 languageName: node linkType: hard @@ -14883,6 +15320,13 @@ __metadata: languageName: node linkType: hard +"@types/d3-array@npm:^3.0.3": + version: 3.0.4 + resolution: "@types/d3-array@npm:3.0.4" + checksum: b0e398365fc1f638d48442e865e036d671c731b2b18f7a92e5172db1f60f5a38d4cd992693a29ad64b38e7ba981eb8c63a2aef95fbdcfbc4bf8926a9cb9ca978 + languageName: node + linkType: hard + "@types/d3-color@npm:*": version: 3.0.2 resolution: "@types/d3-color@npm:3.0.2" @@ -14890,10 +15334,10 @@ __metadata: languageName: node linkType: hard -"@types/d3-color@npm:^2": - version: 2.0.3 - resolution: "@types/d3-color@npm:2.0.3" - checksum: b4a963b15f4fe0e7e49b0898df3e51b46392d91c21038b7ec61aef0f13e04bd7bcfebf06c9fad9ee92317c9682a105e18942c9295a7e2715855622d4d6fc415a +"@types/d3-ease@npm:^3.0.0": + version: 3.0.0 + resolution: "@types/d3-ease@npm:3.0.0" + checksum: 1be7c993643b5a08332e0ee146375a3845545d8deb423db5d152e0b061524385d2345ceccf968f75f605247b940dd3f9a144335fee2e7d935cddaf187afb7095 languageName: node linkType: hard @@ -14904,7 +15348,7 @@ __metadata: languageName: node linkType: hard -"@types/d3-interpolate@npm:*": +"@types/d3-interpolate@npm:*, @types/d3-interpolate@npm:^3.0.1": version: 3.0.1 resolution: "@types/d3-interpolate@npm:3.0.1" dependencies: @@ -14913,15 +15357,6 @@ __metadata: languageName: node linkType: hard -"@types/d3-interpolate@npm:^2.0.0": - version: 2.0.2 - resolution: "@types/d3-interpolate@npm:2.0.2" - dependencies: - "@types/d3-color": ^2 - checksum: 78c47193da3c114a7d78580c6f8d9915f11df92ce78fe08d13052cf49fab91dcdca938895a778cdc6f9820ebf16df3e0e339c17491a8c2b1140cdd2e09553084 - languageName: node - linkType: hard - "@types/d3-path@npm:*": version: 3.0.0 resolution: "@types/d3-path@npm:3.0.0" @@ -14936,19 +15371,12 @@ __metadata: languageName: node linkType: hard -"@types/d3-path@npm:^2": - version: 2.0.1 - resolution: "@types/d3-path@npm:2.0.1" - checksum: 2fe04503ec56de47e2b8482e5a55e2eaf2940444f2cea00a5fb740d52d24bddfe13e900e392c1edebf2127b11557db09aeae6f5669f49a35caac4fe1a9d43b84 - languageName: node - linkType: hard - -"@types/d3-scale@npm:^3.0.0": - version: 3.3.2 - resolution: "@types/d3-scale@npm:3.3.2" +"@types/d3-scale@npm:^4.0.2": + version: 4.0.3 + resolution: "@types/d3-scale@npm:4.0.3" dependencies: - "@types/d3-time": ^2 - checksum: 65dbf85f07a4d6ac26396075b0faa1930cfebb96dc248629d4b82c22457c89161d0f070f9a5554adccee80b959e2c6d7c1ef6b7355743afe91050d71014fe3cf + "@types/d3-time": "*" + checksum: 76684da8519ab5f2210e647f74f96ece9c6816dea4ad5d76131121703a5268cc65687a8bc9ebbf4a44039482247336d98811ecc3fbfeb7f0122fdce4bb295547 languageName: node linkType: hard @@ -14968,16 +15396,7 @@ __metadata: languageName: node linkType: hard -"@types/d3-shape@npm:^2.0.0": - version: 2.1.3 - resolution: "@types/d3-shape@npm:2.1.3" - dependencies: - "@types/d3-path": ^2 - checksum: d0855a1e2c11a4ab23367c86ef0cc104e12bf216f2c007fa5955da7179b60b0426d0e9ddbbbdf93d4342e7dd24c7bcfc3a2bc6258744e03fc44ca460a063dcc3 - languageName: node - linkType: hard - -"@types/d3-shape@npm:^3.0.1": +"@types/d3-shape@npm:^3.0.1, @types/d3-shape@npm:^3.1.0": version: 3.1.1 resolution: "@types/d3-shape@npm:3.1.1" dependencies: @@ -14986,10 +15405,17 @@ __metadata: languageName: node linkType: hard -"@types/d3-time@npm:^2": - version: 2.1.1 - resolution: "@types/d3-time@npm:2.1.1" - checksum: 115048d0cd312a3172ef7c03615dfbdbd8b92a93fd7b6d9ca93c49c704fcdb9575f4c57955eb54eb757b9834acaaf47fc52eae103d06246c59ae120de4559cbc +"@types/d3-time@npm:*, @types/d3-time@npm:^3.0.0": + version: 3.0.0 + resolution: "@types/d3-time@npm:3.0.0" + checksum: e76adb056daccf80107f4db190ac6deb77e8774f00362bb6c76f178e67f2f217422fe502b654edbc9ac6451f6619045b9f6f5fe0db1ec5520e2ada377af7c72e + languageName: node + linkType: hard + +"@types/d3-timer@npm:^3.0.0": + version: 3.0.0 + resolution: "@types/d3-timer@npm:3.0.0" + checksum: 1ec86b3808de6ecfa93cfdf34254761069658af0cc1d9540e8353dbcba161cdf1296a0724187bd17433b2ff16563115fd20b85fc89d5e809ff28f9b1ab134b42 languageName: node linkType: hard @@ -15037,12 +15463,12 @@ __metadata: linkType: hard "@types/dockerode@npm:^3.3.0, @types/dockerode@npm:^3.3.8": - version: 3.3.15 - resolution: "@types/dockerode@npm:3.3.15" + version: 3.3.16 + resolution: "@types/dockerode@npm:3.3.16" dependencies: "@types/docker-modem": "*" "@types/node": "*" - checksum: b8fa13f86c761175a5813eb41fbd1e46d0646f008e5c84738b51c1aa82ce4f3758502efe8c3c583463e7cb7dc77e2faadfff91f4e6274e844e68a0ebf9deeae5 + checksum: ef316e330f8a1a137962d6000cac53bb25b5ba4300e38dd5842f32a6c58bec420278d61526c68865351c48c7e843c9aa45bcbca332737630a0c251e09390bf5b languageName: node linkType: hard @@ -15510,9 +15936,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.151, @types/lodash@npm:^4.14.173, @types/lodash@npm:^4.14.175": - version: 4.14.185 - resolution: "@types/lodash@npm:4.14.185" - checksum: f81d13da5ecab110ca9c5c7cc2bedc3c9802a6acf668576aecd1b8f4b134ed81d06c15f1e600fb08f05975098280a0d97d30cddfc2cb39ec1c6b56e971ca53b3 + version: 4.14.192 + resolution: "@types/lodash@npm:4.14.192" + checksum: 31e1f0543a04158d2c429c45efd7c77882736630d0652f82eb337d6159ec0c249c5d175c0af731537b53271e665ff8d76f43221d75d03646d31cb4bd6f0056b1 languageName: node linkType: hard @@ -15648,28 +16074,28 @@ __metadata: linkType: hard "@types/node-fetch@npm:^2.5.0, @types/node-fetch@npm:^2.5.12, @types/node-fetch@npm:^2.5.7, @types/node-fetch@npm:^2.6.1": - version: 2.6.2 - resolution: "@types/node-fetch@npm:2.6.2" + version: 2.6.3 + resolution: "@types/node-fetch@npm:2.6.3" dependencies: "@types/node": "*" form-data: ^3.0.0 - checksum: 6f73b1470000d303d25a6fb92875ea837a216656cb7474f66cdd67bb014aa81a5a11e7ac9c21fe19bee9ecb2ef87c1962bceeaec31386119d1ac86e4c30ad7a6 + checksum: b68cda58e91535a42dd5337932443c37f8e198ca1e8deeb95bd92a64a9a84d92071867b91c5eb84ee8e13f33d45a70549fe2bc11dd070a894dd561909f4d39f5 languageName: node linkType: hard "@types/node-forge@npm:^1.3.0": - version: 1.3.1 - resolution: "@types/node-forge@npm:1.3.1" + version: 1.3.2 + resolution: "@types/node-forge@npm:1.3.2" dependencies: "@types/node": "*" - checksum: 88d1f85b5e2edfbb475d34c4a47b964edab408b20cec508dc4443b36258971062c2fef760d1eeb3f544fdb5321c710a4e5e2cd8a1a5923e81c53ca1cf6f3a722 + checksum: f532326a616e946e5f6733d1461e7b8d31911bbdfbc480a6337c422053d79c1e22a0776d114a325439e26ae382a640f939d0abf156e24a3c3ca5079d04aa73f6 languageName: node linkType: hard "@types/node@npm:*, @types/node@npm:>= 8, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:^18.11.17": - version: 18.11.19 - resolution: "@types/node@npm:18.11.19" - checksum: d7cd19fcfc59cbdd3f9ba0b4072cb7adc21bd575bd8eb7d7e698975e63564aaa83f03434f32b12331f84f73d0b369d9cbe2371e359d9d7f5c3361f4987f4f7da + version: 18.15.11 + resolution: "@types/node@npm:18.15.11" + checksum: 977b4ad04708897ff0eb049ecf82246d210939c82461922d20f7d2dcfd81bbc661582ba3af28869210f7e8b1934529dcd46bff7d448551400f9d48b9d3bddec3 languageName: node linkType: hard @@ -15688,9 +16114,9 @@ __metadata: linkType: hard "@types/node@npm:^14.14.31": - version: 14.18.33 - resolution: "@types/node@npm:14.18.33" - checksum: 4e23f95186d8ae1d38c999bc6b46fe94e790da88744b0a3bfeedcbd0d9ffe2cb0ff39e85f43014f6739e5270292c1a1f6f97a1fc606fd573a0c17fda9a1d42de + version: 14.18.42 + resolution: "@types/node@npm:14.18.42" + checksum: 1c92f04a482ab54a21342b3911fc6f0093f04d3314197bc0e2f20012e9efc929c44e2ea41990b9b3cde420d7859c9ed716733f3e65c0cd6c2910a55799465f6b languageName: node linkType: hard @@ -15702,9 +16128,9 @@ __metadata: linkType: hard "@types/node@npm:^16.0.0, @types/node@npm:^16.11.26, @types/node@npm:^16.9.2": - version: 16.18.12 - resolution: "@types/node@npm:16.18.12" - checksum: fc3271182414f8593018ef8f00b4718116a92f463f619081bd399d9460e7861e1dd7eebc7cf94c23567e418ff397babed077011711aae8d47171b5a81c5bd71d + version: 16.18.23 + resolution: "@types/node@npm:16.18.23" + checksum: 00e51db28fc7a182747f37215b3f25400b1c7a8525e09fa14e55be5798891a118ebf636a49d3197335a3580fcb8222fd4ecc20c2ccff69f1c0d233fc5697465d languageName: node linkType: hard @@ -16041,13 +16467,6 @@ __metadata: languageName: node linkType: hard -"@types/resize-observer-browser@npm:^0.1.6": - version: 0.1.7 - resolution: "@types/resize-observer-browser@npm:0.1.7" - checksum: 0377eaac8bb7a17b983b49a156006032380b459bfebefc54a5aa2f7f8a9786d2b60723e8837c61ef733330b478f4f26293e9edbdc8006238e4f80c878c56c988 - languageName: node - linkType: hard - "@types/resolve@npm:1.17.1": version: 1.17.1 resolution: "@types/resolve@npm:1.17.1" @@ -16281,11 +16700,11 @@ __metadata: linkType: hard "@types/swagger-ui-react@npm:^4.1.1": - version: 4.11.0 - resolution: "@types/swagger-ui-react@npm:4.11.0" + version: 4.18.0 + resolution: "@types/swagger-ui-react@npm:4.18.0" dependencies: "@types/react": "*" - checksum: cec88ffebaba7ce576d4945c901157a4aac360a669741abb6deacdf31435af5a679154d4f9281cc178214441ed1ac2cc800bd7a8f8588d1221984bef0c16c8aa + checksum: fa946a76ece76cdbaf8d8dc2945d690787f67b29a9ed14d95b706b8a7fca2d4161a62eeda74ce81c09b872c23b788f86dab36607e891744c91f425b92e302cef languageName: node linkType: hard @@ -16676,9 +17095,9 @@ __metadata: languageName: node linkType: hard -"@uiw/codemirror-extensions-basic-setup@npm:4.19.10": - version: 4.19.10 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.19.10" +"@uiw/codemirror-extensions-basic-setup@npm:4.19.11": + version: 4.19.11 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.19.11" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/commands": ^6.0.0 @@ -16695,19 +17114,19 @@ __metadata: "@codemirror/search": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: 2eca6545f29699bf938238f089a08c7134e04611473a338c7a59377ca1b0ebdfddb73402819921fc718c317fa52c0c473188e4dea20007e5ac68c83caaaa83f0 + checksum: c7bc3498ace8efa29492674ed94feb3c6d941f389302696136c1509ab5e3b55e590ca9887a7883b7e4972cee921d7120d9af7f78354094ccb341a72656ad8ac9 languageName: node linkType: hard "@uiw/react-codemirror@npm:^4.9.3": - version: 4.19.10 - resolution: "@uiw/react-codemirror@npm:4.19.10" + version: 4.19.11 + resolution: "@uiw/react-codemirror@npm:4.19.11" dependencies: "@babel/runtime": ^7.18.6 "@codemirror/commands": ^6.1.0 "@codemirror/state": ^6.1.1 "@codemirror/theme-one-dark": ^6.0.0 - "@uiw/codemirror-extensions-basic-setup": 4.19.10 + "@uiw/codemirror-extensions-basic-setup": 4.19.11 codemirror: ^6.0.0 peerDependencies: "@babel/runtime": ">=7.11.0" @@ -16717,7 +17136,7 @@ __metadata: codemirror: ">=6.0.0" react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 3210787e4ec717c1945ef31b8a7f066bc1b326da6e63f295f8bb790aa200359151e791ebc3420afbf9f615c03509a17fae62f4ab7eaeb1dec51f074a26ac9e08 + checksum: 5ff4c7d021b565bc578d0fce2f4b6761b8d55024fa3190288435d287028cc8770b8fe5b4b103a64c452eaf26ab88c8bfd25819782a4b4d7dcfd4361765e307ff languageName: node linkType: hard @@ -17219,7 +17638,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.12.0, ajv@npm:^8.8.0": +"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0, ajv@npm:^8.12.0, ajv@npm:^8.8.0": version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: @@ -18848,18 +19267,6 @@ __metadata: languageName: node linkType: hard -"camelcase-keys@npm:^7.0.1": - version: 7.0.2 - resolution: "camelcase-keys@npm:7.0.2" - dependencies: - camelcase: ^6.3.0 - map-obj: ^4.1.0 - quick-lru: ^5.1.1 - type-fest: ^1.2.1 - checksum: b5821cc48dd00e8398a30c5d6547f06837ab44de123f1b3a603d0a03399722b2fc67a485a7e47106eb02ef543c3b50c5ebaabc1242cde4b63a267c3258d2365b - languageName: node - linkType: hard - "camelcase@npm:5.0.0": version: 5.0.0 resolution: "camelcase@npm:5.0.0" @@ -18881,7 +19288,7 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^6.2.0, camelcase@npm:^6.3.0": +"camelcase@npm:^6.2.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d @@ -18915,14 +19322,14 @@ __metadata: linkType: hard "canvas@npm:^2.10.2": - version: 2.11.0 - resolution: "canvas@npm:2.11.0" + version: 2.11.2 + resolution: "canvas@npm:2.11.2" dependencies: "@mapbox/node-pre-gyp": ^1.0.0 nan: ^2.17.0 node-gyp: latest simple-get: ^3.0.3 - checksum: a69a6e0c90014a1b02e52c4c38a627d1a01ffe9539047bec84105cb3554907a947cf39b4a333be43fc1583dd142b641bb5480a4e23f59c6098618c33bf78f67f + checksum: 61e554aef80022841dc836964534082ec21435928498032562089dfb7736215f039c7d99ee546b0cf10780232d9bf310950f8b4d489dc394e0fb6f6adfc97994 languageName: node linkType: hard @@ -20702,19 +21109,12 @@ __metadata: languageName: node linkType: hard -"d3-array@npm:2, d3-array@npm:^2.3.0": - version: 2.12.1 - resolution: "d3-array@npm:2.12.1" +"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:^3.1.6": + version: 3.2.3 + resolution: "d3-array@npm:3.2.3" dependencies: - internmap: ^1.0.0 - checksum: 97853b7b523aded17078f37c67742f45d81e88dda2107ae9994c31b9e36c5fa5556c4c4cf39650436f247813602dfe31bf7ad067ff80f127a16903827f10c6eb - languageName: node - linkType: hard - -"d3-color@npm:1 - 2": - version: 2.0.0 - resolution: "d3-color@npm:2.0.0" - checksum: b887354aa383937abd04fbffed3e26e5d6a788472cd3737fb10735930e427763e69fe93398663bccf88c0b53ee3e638ac6fcf0c02226b00ed9e4327c2dfbf3dc + internmap: 1 - 2 + checksum: 41d6a4989b73e0d2649a880b2f29a7e7cc059db0eba36cd29a79e0118ebdf6b78922a84cde0733cd54cb4072f3442ec44f3563902e00ea42892442d60e99f961 languageName: node linkType: hard @@ -20742,7 +21142,7 @@ __metadata: languageName: node linkType: hard -"d3-ease@npm:1 - 3": +"d3-ease@npm:1 - 3, d3-ease@npm:^3.0.1": version: 3.0.1 resolution: "d3-ease@npm:3.0.1" checksum: 06e2ee5326d1e3545eab4e2c0f84046a123dcd3b612e68858219aa034da1160333d9ce3da20a1d3486d98cb5c2a06f7d233eee1bc19ce42d1533458bd85dedcd @@ -20760,14 +21160,14 @@ __metadata: languageName: node linkType: hard -"d3-format@npm:1 - 2": - version: 2.0.0 - resolution: "d3-format@npm:2.0.0" - checksum: c4d3c8f9941d097d514d3986f54f21434e08e5876dc08d1d65226447e8e167600d5b9210235bb03fd45327225f04f32d6e365f08f76d2f4b8bff81594851aaf7 +"d3-format@npm:1 - 3": + version: 3.1.0 + resolution: "d3-format@npm:3.1.0" + checksum: f345ec3b8ad3cab19bff5dead395bd9f5590628eb97a389b1dd89f0b204c7c4fc1d9520f13231c2c7cf14b7c9a8cf10f8ef15bde2befbab41454a569bd706ca2 languageName: node linkType: hard -"d3-interpolate@npm:1 - 3": +"d3-interpolate@npm:1 - 3, d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:^3.0.1": version: 3.0.1 resolution: "d3-interpolate@npm:3.0.1" dependencies: @@ -20776,22 +21176,6 @@ __metadata: languageName: node linkType: hard -"d3-interpolate@npm:1.2.0 - 2, d3-interpolate@npm:^2.0.0": - version: 2.0.1 - resolution: "d3-interpolate@npm:2.0.1" - dependencies: - d3-color: 1 - 2 - checksum: 4a2018ac34fbcc3e0e7241e117087ca1b2274b8b33673913658623efacc5db013b8d876586d167b23e3145bdb34ec8e441d301299b082e1a90985b2f18d4299c - languageName: node - linkType: hard - -"d3-path@npm:1 - 2": - version: 2.0.0 - resolution: "d3-path@npm:2.0.0" - checksum: e39e91dfb9abf9637962caede1f4ea4877f4b9e1c914868bdfc355688e9a637ba51bed0fb6180934eb596e50a4d0d1f001b5f2e98a4a3d23cc42558acfbd1f2c - languageName: node - linkType: hard - "d3-path@npm:^3.1.0": version: 3.1.0 resolution: "d3-path@npm:3.1.0" @@ -20806,16 +21190,16 @@ __metadata: languageName: node linkType: hard -"d3-scale@npm:^3.0.0": - version: 3.3.0 - resolution: "d3-scale@npm:3.3.0" +"d3-scale@npm:^4.0.2": + version: 4.0.2 + resolution: "d3-scale@npm:4.0.2" dependencies: - d3-array: ^2.3.0 - d3-format: 1 - 2 - d3-interpolate: 1.2.0 - 2 - d3-time: ^2.1.1 - d3-time-format: 2 - 3 - checksum: f77e73f0fb422292211d0687914c30d26e29011a936ad2a535a868ae92f306c3545af1fe7ea5db1b3e67dbce7a6c6cd952e53d02d1d557543e7e5d30e30e52f2 + d3-array: 2.10.0 - 3 + d3-format: 1 - 3 + d3-interpolate: 1.2.0 - 3 + d3-time: 2.1.1 - 3 + d3-time-format: 2 - 4 + checksum: a9c770d283162c3bd11477c3d9d485d07f8db2071665f1a4ad23eec3e515e2cefbd369059ec677c9ac849877d1a765494e90e92051d4f21111aa56791c98729e languageName: node linkType: hard @@ -20826,16 +21210,7 @@ __metadata: languageName: node linkType: hard -"d3-shape@npm:^2.0.0": - version: 2.1.0 - resolution: "d3-shape@npm:2.1.0" - dependencies: - d3-path: 1 - 2 - checksum: 4a82a83fbb15aadee3eb6661226a34bcd793cdbcd7aa5bf980a4724efc93eb94acc6c499f0ebedc9c3144c57c0f033867d137f41e86459acbd5d7181cb27b49c - languageName: node - linkType: hard - -"d3-shape@npm:^3.0.0": +"d3-shape@npm:^3.0.0, d3-shape@npm:^3.1.0": version: 3.2.0 resolution: "d3-shape@npm:3.2.0" dependencies: @@ -20844,25 +21219,25 @@ __metadata: languageName: node linkType: hard -"d3-time-format@npm:2 - 3": - version: 3.0.0 - resolution: "d3-time-format@npm:3.0.0" +"d3-time-format@npm:2 - 4": + version: 4.1.0 + resolution: "d3-time-format@npm:4.1.0" dependencies: - d3-time: 1 - 2 - checksum: c20c1667dbea653f81d923e741f84c23e4b966002ba0d6ed94cbc70692105566e55e89d18d175404534a879383fd1123300bd12885a3c924fe924032bb0060db + d3-time: 1 - 3 + checksum: 7342bce28355378152bbd4db4e275405439cabba082d9cd01946d40581140481c8328456d91740b0fe513c51ec4a467f4471ffa390c7e0e30ea30e9ec98fcdf4 languageName: node linkType: hard -"d3-time@npm:1 - 2, d3-time@npm:^2.1.1": - version: 2.1.1 - resolution: "d3-time@npm:2.1.1" +"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:^3.0.0": + version: 3.1.0 + resolution: "d3-time@npm:3.1.0" dependencies: - d3-array: 2 - checksum: d1c7b9658c20646e46c3dd19e11c38e02dec098e8baa7d2cd868af8eb01953668f5da499fa33dc63541cf74a26e788786f8828c4381dbbf475a76b95972979a6 + d3-array: 2 - 3 + checksum: 613b435352a78d9f31b7f68540788186d8c331b63feca60ad21c88e9db1989fe888f97f242322ebd6365e45ec3fb206a4324cd4ca0dfffa1d9b5feb856ba00a7 languageName: node linkType: hard -"d3-timer@npm:1 - 3": +"d3-timer@npm:1 - 3, d3-timer@npm:^3.0.1": version: 3.0.1 resolution: "d3-timer@npm:3.0.1" checksum: 1cfddf86d7bca22f73f2c427f52dfa35c49f50d64e187eb788dcad6e927625c636aa18ae4edd44d084eb9d1f81d8ca4ec305dae7f733c15846a824575b789d73 @@ -21596,10 +21971,10 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:=2.3.10": - version: 2.3.10 - resolution: "dompurify@npm:2.3.10" - checksum: ee343876b4c065e82d194818c66af76a6d2290264c7db583ad71761c11781fd626f0245f9f4670175d5707c4b8fcfb89adae80bed0418a9426a47ee7f36b0ffc +"dompurify@npm:=3.0.1": + version: 3.0.1 + resolution: "dompurify@npm:3.0.1" + checksum: 19447e6d96415a8ad3a67bc9c76ffe671eb31cf7c1e0a538cbe5037c8b8b03afe144d64cf96c6e0f7fe63b83721a33b5b913394d20a85e96550e42e31f7c086b languageName: node linkType: hard @@ -22287,31 +22662,31 @@ __metadata: linkType: hard "esbuild@npm:^0.17.0": - version: 0.17.14 - resolution: "esbuild@npm:0.17.14" + version: 0.17.15 + resolution: "esbuild@npm:0.17.15" dependencies: - "@esbuild/android-arm": 0.17.14 - "@esbuild/android-arm64": 0.17.14 - "@esbuild/android-x64": 0.17.14 - "@esbuild/darwin-arm64": 0.17.14 - "@esbuild/darwin-x64": 0.17.14 - "@esbuild/freebsd-arm64": 0.17.14 - "@esbuild/freebsd-x64": 0.17.14 - "@esbuild/linux-arm": 0.17.14 - "@esbuild/linux-arm64": 0.17.14 - "@esbuild/linux-ia32": 0.17.14 - "@esbuild/linux-loong64": 0.17.14 - "@esbuild/linux-mips64el": 0.17.14 - "@esbuild/linux-ppc64": 0.17.14 - "@esbuild/linux-riscv64": 0.17.14 - "@esbuild/linux-s390x": 0.17.14 - "@esbuild/linux-x64": 0.17.14 - "@esbuild/netbsd-x64": 0.17.14 - "@esbuild/openbsd-x64": 0.17.14 - "@esbuild/sunos-x64": 0.17.14 - "@esbuild/win32-arm64": 0.17.14 - "@esbuild/win32-ia32": 0.17.14 - "@esbuild/win32-x64": 0.17.14 + "@esbuild/android-arm": 0.17.15 + "@esbuild/android-arm64": 0.17.15 + "@esbuild/android-x64": 0.17.15 + "@esbuild/darwin-arm64": 0.17.15 + "@esbuild/darwin-x64": 0.17.15 + "@esbuild/freebsd-arm64": 0.17.15 + "@esbuild/freebsd-x64": 0.17.15 + "@esbuild/linux-arm": 0.17.15 + "@esbuild/linux-arm64": 0.17.15 + "@esbuild/linux-ia32": 0.17.15 + "@esbuild/linux-loong64": 0.17.15 + "@esbuild/linux-mips64el": 0.17.15 + "@esbuild/linux-ppc64": 0.17.15 + "@esbuild/linux-riscv64": 0.17.15 + "@esbuild/linux-s390x": 0.17.15 + "@esbuild/linux-x64": 0.17.15 + "@esbuild/netbsd-x64": 0.17.15 + "@esbuild/openbsd-x64": 0.17.15 + "@esbuild/sunos-x64": 0.17.15 + "@esbuild/win32-arm64": 0.17.15 + "@esbuild/win32-ia32": 0.17.15 + "@esbuild/win32-x64": 0.17.15 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -22359,7 +22734,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 8f4c05f5d3da04f05c48d65f60f3c6422253f406cd56a7ab7a898f0971b0366c454635a6340172874950771dc005a9928dd999b732a6d4caa504b537bfcbf2ff + checksum: 4e3640d7bc8f6edb3465c076eb519ccb7684382714a1b883e000a7a592f8e285501ec7e82cb68441dfec8f7be7f70f40b00129ceb05057f6fa87f95d2187370a languageName: node linkType: hard @@ -22568,13 +22943,13 @@ __metadata: linkType: hard "eslint-plugin-cypress@npm:^2.10.3": - version: 2.12.1 - resolution: "eslint-plugin-cypress@npm:2.12.1" + version: 2.13.2 + resolution: "eslint-plugin-cypress@npm:2.13.2" dependencies: globals: ^11.12.0 peerDependencies: eslint: ">= 3.2.1" - checksum: 1f1c36e149304e9a6f58e2292a761abad58274da33b3a48b24ad55ad20cbce3ac7467321f2b6fcb052f9563c89f67004de4766eba2e2bdbcb010a6a0666989cf + checksum: 81cc425cfced563cf50ad2553f887e20a39fe179275e95408c53989bcf8f65f0fac648b429d006130c84221edf99eada663a2c6419eb837bf81ece3d18998cf5 languageName: node linkType: hard @@ -23089,6 +23464,7 @@ __metadata: "@roadiehq/backstage-plugin-github-pull-requests": ^2.2.7 "@roadiehq/backstage-plugin-travis-ci": ^2.0.5 "@testing-library/cypress": ^9.0.0 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 @@ -23104,6 +23480,7 @@ __metadata: prop-types: ^15.7.2 react: ^17.0.2 react-dom: ^17.0.2 + react-router: ^6.3.0 react-router-dom: ^6.3.0 react-use: ^17.2.4 start-server-and-test: ^1.10.11 @@ -23118,7 +23495,12 @@ __metadata: "@backstage/backend-defaults": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/plugin-app-backend": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-kubernetes-backend": "workspace:^" + "@backstage/plugin-permission-backend": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-permission-node": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-search-backend": "workspace:^" "@backstage/plugin-search-backend-module-catalog": "workspace:^" @@ -23484,10 +23866,10 @@ __metadata: languageName: node linkType: hard -"fast-equals@npm:^2.0.0": - version: 2.0.4 - resolution: "fast-equals@npm:2.0.4" - checksum: 1aac8a2e16b33e5e402bb5cd46be65f1ca331903c2c44e3bd75324e8472ee04f0acdbc6889e45fc28f9707ca3964f2a86789b32305d4d8b85dc97f61e446ef4b +"fast-equals@npm:^4.0.3": + version: 4.0.3 + resolution: "fast-equals@npm:4.0.3" + checksum: 3d5935b757f9f2993e59b5164a7a9eeda0de149760495375cde14a4ed725186a7e6c1c0d58f7d42d2f91deb97f3fce1e0aad5591916ef0984278199a85c87c87 languageName: node linkType: hard @@ -25928,10 +26310,10 @@ __metadata: languageName: node linkType: hard -"internmap@npm:^1.0.0": - version: 1.0.1 - resolution: "internmap@npm:1.0.1" - checksum: 9d00f8c0cf873a24a53a5a937120dab634c41f383105e066bb318a61864e6292d24eb9516e8e7dccfb4420ec42ca474a0f28ac9a6cc82536898fa09bbbe53813 +"internmap@npm:1 - 2": + version: 2.0.3 + resolution: "internmap@npm:2.0.3" + checksum: 7ca41ec6aba8f0072fc32fa8a023450a9f44503e2d8e403583c55714b25efd6390c38a87161ec456bf42d7bc83aab62eb28f5aef34876b1ac4e60693d5e1d241 languageName: node linkType: hard @@ -28444,6 +28826,18 @@ __metadata: languageName: node linkType: hard +"kubernetes-models@npm:^4.1.0": + version: 4.1.0 + resolution: "kubernetes-models@npm:4.1.0" + dependencies: + "@kubernetes-models/apimachinery": ^1.1.0 + "@kubernetes-models/base": ^4.0.0 + "@kubernetes-models/validate": ^3.0.0 + tslib: ^2.4.0 + checksum: 1c3195a78ca422a6436f9c4143288a4d29f53b75ff597d72f44cc7f274714daab40a5bb99dd13e02edf3ce11a41f1df34d3d0bb1930b6401cc21c44666ad2b6b + languageName: node + linkType: hard + "kuler@npm:^2.0.0": version: 2.0.0 resolution: "kuler@npm:2.0.0" @@ -29323,7 +29717,7 @@ __metadata: languageName: node linkType: hard -"map-obj@npm:^4.0.0, map-obj@npm:^4.1.0": +"map-obj@npm:^4.0.0": version: 4.3.0 resolution: "map-obj@npm:4.3.0" checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e @@ -29369,7 +29763,7 @@ __metadata: languageName: node linkType: hard -"markdown-to-jsx@npm:^7.1.9": +"markdown-to-jsx@npm:^7.2.0": version: 7.2.0 resolution: "markdown-to-jsx@npm:7.2.0" peerDependencies: @@ -29649,10 +30043,10 @@ __metadata: languageName: node linkType: hard -"memjs@npm:^1.3.0": - version: 1.3.0 - resolution: "memjs@npm:1.3.0" - checksum: 5c7679c649ab18a7b29c8bf8795bd591df480e7ca96eec5958f56c5c3c87d919530a7b61c80ddf73f05975c929d88153d41df28e11ff680d2c6c4bb6dd668d2d +"memjs@npm:^1.3.1": + version: 1.3.1 + resolution: "memjs@npm:1.3.1" + checksum: cb70879055151f15292e95ab57765e745c84d2fedd363b453afc3e2f48bf185e3771eecf9544f95009a3a374e810e34c1e18948134e814d791c2f0f35359ddeb languageName: node linkType: hard @@ -30232,21 +30626,21 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:=7.3.0": - version: 7.3.0 - resolution: "minimatch@npm:7.3.0" +"minimatch@npm:=7.4.3": + version: 7.4.3 + resolution: "minimatch@npm:7.4.3" dependencies: brace-expansion: ^2.0.1 - checksum: c4d9af992958339d5fc593c9ce496f4b9615597e57cdd663e57bd3a745ebd208c2bba19c3290c25ed8dcf259586fa1f68e4e1acf304f8694927b84c5381167d0 + checksum: daa954231b6859e3ba0e5fbd2486986d3cae283bb69acb7ed3833c84a293f8d7edb8514360ea62c01426ba791446b2a1e1cc0d718bed15c0212cef35c59a6b95 languageName: node linkType: hard "minimatch@npm:^5.0.0, minimatch@npm:^5.0.1, minimatch@npm:^5.1.0, minimatch@npm:^5.1.1, minimatch@npm:^5.1.2": - version: 5.1.2 - resolution: "minimatch@npm:5.1.2" + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" dependencies: brace-expansion: ^2.0.1 - checksum: 32ffda25b9fb8270a1c1beafdb7489dc0e411af553495136509a945691f63c9b6b000eeeaaf8bffe3efa609c1d6d3bc0f5a106f6c3443b5c05da649100ded964 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 languageName: node linkType: hard @@ -31561,7 +31955,7 @@ __metadata: languageName: node linkType: hard -"optimism@npm:^0.16.1": +"optimism@npm:^0.16.2": version: 0.16.2 resolution: "optimism@npm:0.16.2" dependencies: @@ -32497,10 +32891,10 @@ __metadata: languageName: node linkType: hard -"photoswipe@npm:^5.3.5": - version: 5.3.6 - resolution: "photoswipe@npm:5.3.6" - checksum: 192004e33dbba7567744c96835b43f17a118653a24e099f9e31c2ddea9d7214ac7c28ff8994d4f7c20720c7f7fd00b62ad8ade5e3d59994f00a27390419ba11c +"photoswipe@npm:^5.3.7": + version: 5.3.7 + resolution: "photoswipe@npm:5.3.7" + checksum: adfbd76316b7aa140302ff2961fd128dfb23ad02ae1c0691b99a0c6a247f638218f1e6de77ae4d5191d0b5a6d4a1f3561ff1472166f2a636bc4525addee31a47 languageName: node linkType: hard @@ -33221,11 +33615,11 @@ __metadata: linkType: hard "prettier@npm:^2.2.1, prettier@npm:^2.7.1": - version: 2.8.6 - resolution: "prettier@npm:2.8.6" + version: 2.8.7 + resolution: "prettier@npm:2.8.7" bin: prettier: bin-prettier.js - checksum: 8ac94fa67aec0e65743ea15ebf954ef2f1e52638abd129dc04e8b49e8bb3224c0233c98df6b5c98efd31bd2a43866590486559438ee4ead09dc81be389068572 + checksum: fdc8f2616f099f5f0d685907f4449a70595a0fc1d081a88919604375989e0d5e9168d6121d8cc6861f21990b31665828e00472544d785d5940ea08a17660c3a6 languageName: node linkType: hard @@ -34187,17 +34581,15 @@ __metadata: languageName: node linkType: hard -"react-resize-detector@npm:^6.6.3": - version: 6.7.8 - resolution: "react-resize-detector@npm:6.7.8" +"react-resize-detector@npm:^8.0.4": + version: 8.0.4 + resolution: "react-resize-detector@npm:8.0.4" dependencies: - "@types/resize-observer-browser": ^0.1.6 lodash: ^4.17.21 - resize-observer-polyfill: ^1.5.1 peerDependencies: - react: ^16.0.0 || ^17.0.0 - react-dom: ^16.0.0 || ^17.0.0 - checksum: dc8acbe216f70a60466d55d4f47c1468fecf074544a1e07234461b36eefed2b222f6e550c91e7ae02983e2842308d2a48ba8383029efb5d27ac749c48e3a09ae + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + checksum: f53a99cc5413844a6fc2a713b0b1094d23947897c14ab64481938632f4e77fadded52d91a6619055abf6240c7cacd6cc7dd492ea866639b302f81df680709d45 languageName: node linkType: hard @@ -34264,7 +34656,7 @@ __metadata: languageName: node linkType: hard -"react-router@npm:6.9.0": +"react-router@npm:6.9.0, react-router@npm:^6.3.0": version: 6.9.0 resolution: "react-router@npm:6.9.0" dependencies: @@ -34284,17 +34676,17 @@ __metadata: languageName: node linkType: hard -"react-smooth@npm:^2.0.0": - version: 2.0.1 - resolution: "react-smooth@npm:2.0.1" +"react-smooth@npm:^2.0.2": + version: 2.0.2 + resolution: "react-smooth@npm:2.0.2" dependencies: - fast-equals: ^2.0.0 + fast-equals: ^4.0.3 react-transition-group: 2.9.0 peerDependencies: prop-types: ^15.6.0 react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 65678491cbd506573f2dba82778ebf8259714d68dd227e0ee7c0e204bcbc7839cf97401620b4223814066581f1dce0493f97162a03dc2a68058b5a7ad2b41085 + checksum: 6b0a40a17314657ac6a187a3ad01fcdaa61d498979b6a07c424e20832110c99b4394c33209a0b39b897c13d113d8cb044e7a691b4965386a11b15bbfbacfba25 languageName: node linkType: hard @@ -34416,13 +34808,13 @@ __metadata: languageName: node linkType: hard -"react-virtualized-auto-sizer@npm:^1.0.6": - version: 1.0.7 - resolution: "react-virtualized-auto-sizer@npm:1.0.7" +"react-virtualized-auto-sizer@npm:^1.0.11, react-virtualized-auto-sizer@npm:^1.0.6": + version: 1.0.11 + resolution: "react-virtualized-auto-sizer@npm:1.0.11" peerDependencies: react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - checksum: 7f2f013c422771828c6613c7890f792aa90a033ea2b41c489c67ca2c6793eefa94d25232c1050fdf69cdd626fad9e3821c5003d45fa6fc831184cd09232023c2 + checksum: 2bde1b9b44aa33d1aa6fe10fbfacb8365d0423bd24a83524cca0f152ef24278669fc7a691018e3a534b3b7d6714b3cdd1466f28c857045f5570f6642cf9081eb languageName: node linkType: hard @@ -34620,28 +35012,24 @@ __metadata: languageName: node linkType: hard -"recharts@npm:^2.0.0, recharts@npm:^2.1.5": - version: 2.1.9 - resolution: "recharts@npm:2.1.9" +"recharts@npm:^2.5.0": + version: 2.5.0 + resolution: "recharts@npm:2.5.0" dependencies: - "@types/d3-interpolate": ^2.0.0 - "@types/d3-scale": ^3.0.0 - "@types/d3-shape": ^2.0.0 classnames: ^2.2.5 - d3-interpolate: ^2.0.0 - d3-scale: ^3.0.0 - d3-shape: ^2.0.0 eventemitter3: ^4.0.1 lodash: ^4.17.19 react-is: ^16.10.2 - react-resize-detector: ^6.6.3 - react-smooth: ^2.0.0 + react-resize-detector: ^8.0.4 + react-smooth: ^2.0.2 recharts-scale: ^0.4.4 reduce-css-calc: ^2.1.8 + victory-vendor: ^36.6.8 peerDependencies: - react: ^16.0.0 || ^17.0.0 - react-dom: ^16.0.0 || ^17.0.0 - checksum: 5751ba78b08c9bf43b381750e302716df7ebc838a26bc8695892b1dd8293f858256d5b949defbb2d07395e7cf8873484b397ea804a60743e366e3211309c7433 + prop-types: ^15.6.0 + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + checksum: a40d1788589926fa8a5844868a338aae75a2077a2bc2ac57fc5d61ad21fb62660aed6f00ae8d8a94948b9143255c1760db0d386ecb257ed8290dd7f164b5bd5f languageName: node linkType: hard @@ -35508,7 +35896,7 @@ __metadata: semver: ^7.3.2 shx: ^0.3.2 ts-node: ^10.4.0 - typescript: ~4.7.0 + typescript: ~5.0.0 languageName: unknown linkType: soft @@ -37318,15 +37706,15 @@ __metadata: languageName: node linkType: hard -"swagger-client@npm:^3.19.1": - version: 3.19.2 - resolution: "swagger-client@npm:3.19.2" +"swagger-client@npm:^3.19.5": + version: 3.19.6 + resolution: "swagger-client@npm:3.19.6" dependencies: "@babel/runtime-corejs3": ^7.20.13 - "@swagger-api/apidom-core": =0.69.0 - "@swagger-api/apidom-json-pointer": =0.69.0 - "@swagger-api/apidom-ns-openapi-3-1": =0.69.0 - "@swagger-api/apidom-reference": =0.69.0 + "@swagger-api/apidom-core": ">=0.69.2 <1.0.0" + "@swagger-api/apidom-json-pointer": ">=0.69.2 <1.0.0" + "@swagger-api/apidom-ns-openapi-3-1": ">=0.69.2 <1.0.0" + "@swagger-api/apidom-reference": ">=0.69.2 <1.0.0" cookie: ~0.5.0 cross-fetch: ^3.1.5 deepmerge: ~4.3.0 @@ -37339,13 +37727,13 @@ __metadata: qs: ^6.10.2 traverse: ~0.6.6 url: ~0.11.0 - checksum: 9613387191b6e72afbe1e551d70646b7c74a136160d2a69ac3220cf23007175c500d3035b0c9ebf1ef0b49769a65d54cf343eb3b0c0d260c5797338776c872ba + checksum: de41a3cafd343f56478782cac463882305e73bd5c4298820bda2f6f35ad4bc65701e4599dbdd135f56592beebb2beca0fa5412051b52b1af8017cf981e692aa4 languageName: node linkType: hard "swagger-ui-react@npm:^4.11.1": - version: 4.18.1 - resolution: "swagger-ui-react@npm:4.18.1" + version: 4.18.2 + resolution: "swagger-ui-react@npm:4.18.2" dependencies: "@babel/runtime-corejs3": ^7.18.9 "@braintree/sanitize-url": =6.0.2 @@ -37353,7 +37741,7 @@ __metadata: classnames: ^2.3.1 css.escape: 1.5.1 deep-extend: 0.6.0 - dompurify: =2.3.10 + dompurify: =3.0.1 ieee754: ^1.2.1 immutable: ^3.x.x js-file-download: ^0.4.12 @@ -37376,7 +37764,7 @@ __metadata: reselect: ^4.1.5 serialize-error: ^8.1.0 sha.js: ^2.4.11 - swagger-client: ^3.19.1 + swagger-client: ^3.19.5 url-parse: ^1.5.8 xml: =1.0.1 xml-but-prettier: ^1.0.1 @@ -37384,7 +37772,7 @@ __metadata: peerDependencies: react: ">=17.0.0" react-dom: ">=17.0.0" - checksum: 183e15d7ccab2ef9197b3695029b66fe1e0556c48bab10f63150feabc304492ae87529a1f1b3e0ee689d19f8b3645a168dff0f3edf421737ac7e8a2d320d26c4 + checksum: 400a0fef6f00b82a8933a2698c12e8f9c9563debaf24901089d6bfa69408d9e1da66b2cb93abed659e4922d672c64609c67561363ab06c0d6d2577cdc670b755 languageName: node linkType: hard @@ -37408,13 +37796,13 @@ __metadata: linkType: hard "swr@npm:^2.0.0": - version: 2.1.1 - resolution: "swr@npm:2.1.1" + version: 2.1.2 + resolution: "swr@npm:2.1.2" dependencies: use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 - checksum: 77a7854f87c2a3244b4047eca5d88a0f5db6cb47f783fd13b8a38f5a611940142645c943e105fbfa64aac51e642361180366107ade0454744a80d6dedbe350db + checksum: 90010a1a1ba3ecd699f64ef5e3de9a40c291e220803e811c46fabb858d908fd74039f4a2c668cf8fd21dbb3f9d9b3d8300915292ed9933d0e4bdac1193ba8fb8 languageName: node linkType: hard @@ -37545,10 +37933,12 @@ __metadata: "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 + "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/user-event": ^14.0.0 "@types/node": ^16.11.26 + "@types/react": "*" "@types/react-dom": "*" cross-env: ^7.0.0 cypress: ^10.0.0 @@ -38296,13 +38686,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^1.2.1": - version: 1.4.0 - resolution: "type-fest@npm:1.4.0" - checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 - languageName: node - linkType: hard - "type-fest@npm:^2.19.0": version: 2.19.0 resolution: "type-fest@npm:2.19.0" @@ -38356,16 +38739,6 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~4.7.0": - version: 4.7.4 - resolution: "typescript@npm:4.7.4" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 5750181b1cd7e6482c4195825547e70f944114fb47e58e4aa7553e62f11b3f3173766aef9c281783edfd881f7b8299cf35e3ca8caebe73d8464528c907a164df - languageName: node - linkType: hard - "typescript@npm:~4.8.2, typescript@npm:~4.8.4": version: 4.8.4 resolution: "typescript@npm:4.8.4" @@ -38376,13 +38749,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@~4.7.0#~builtin": - version: 4.7.4 - resolution: "typescript@patch:typescript@npm%3A4.7.4#~builtin::version=4.7.4&hash=a1c5e5" +"typescript@npm:~5.0.0": + version: 5.0.3 + resolution: "typescript@npm:5.0.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 9096d8f6c16cb80ef3bf96fcbbd055bf1c4a43bd14f3b7be45a9fbe7ada46ec977f604d5feed3263b4f2aa7d4c7477ce5f9cd87de0d6feedec69a983f3a4f93e + checksum: 3cce0576d218cb4277ff8b6adfef1a706e9114a98b4261a38ad658a7642f1b274a8396394f6cbff8c0ba852996d7ed2e233e9b8431d5d55ac7c2f6fea645af02 languageName: node linkType: hard @@ -38396,6 +38769,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@~5.0.0#~builtin": + version: 5.0.3 + resolution: "typescript@patch:typescript@npm%3A5.0.3#~builtin::version=5.0.3&hash=a1c5e5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 9ec0a8eed38d46cc2c8794555b7674e413604c56c159f71b8ff21ce7f17334a44127a68724cb2ef8221ff3b19369f8f05654e8a5266621d7d962aeed889bd630 + languageName: node + linkType: hard + "ua-parser-js@npm:^0.7.18, ua-parser-js@npm:^0.7.30": version: 0.7.33 resolution: "ua-parser-js@npm:0.7.33" @@ -39095,6 +39478,28 @@ __metadata: languageName: node linkType: hard +"victory-vendor@npm:^36.6.8": + version: 36.6.8 + resolution: "victory-vendor@npm:36.6.8" + dependencies: + "@types/d3-array": ^3.0.3 + "@types/d3-ease": ^3.0.0 + "@types/d3-interpolate": ^3.0.1 + "@types/d3-scale": ^4.0.2 + "@types/d3-shape": ^3.1.0 + "@types/d3-time": ^3.0.0 + "@types/d3-timer": ^3.0.0 + d3-array: ^3.1.6 + d3-ease: ^3.0.1 + d3-interpolate: ^3.0.1 + d3-scale: ^4.0.2 + d3-shape: ^3.1.0 + d3-time: ^3.0.0 + d3-timer: ^3.0.1 + checksum: 6411f7c19a776cef3919946d429293cfe33c93a6e4dcfdfa2ba1edecad3a28ed2cd6b0d117169b8917ab6a7679e2bade5e7bfc1fed3fc8b464b842f21dac5f49 + languageName: node + linkType: hard + "vinyl-file@npm:^3.0.0": version: 3.0.0 resolution: "vinyl-file@npm:3.0.0"