diff --git a/.changeset/afraid-rules-yell.md b/.changeset/afraid-rules-yell.md new file mode 100644 index 0000000000..258a07dc89 --- /dev/null +++ b/.changeset/afraid-rules-yell.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Updated the backend database connection configuration schema to set the password visibility to secret diff --git a/.changeset/chatty-seals-tap.md b/.changeset/chatty-seals-tap.md new file mode 100644 index 0000000000..01d69e1562 --- /dev/null +++ b/.changeset/chatty-seals-tap.md @@ -0,0 +1,6 @@ +--- +'@backstage/create-app': patch +'@backstage/plugin-catalog': patch +--- + +Add link from Template entity to the scaffolder launch page for the template in the AboutCard. diff --git a/.changeset/clean-meals-pay.md b/.changeset/clean-meals-pay.md new file mode 100644 index 0000000000..629549112c --- /dev/null +++ b/.changeset/clean-meals-pay.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-jenkins-backend': patch +--- + +Don't expose username and authentication header if configured. diff --git a/.changeset/clean-years-whisper.md b/.changeset/clean-years-whisper.md new file mode 100644 index 0000000000..fd77430cd7 --- /dev/null +++ b/.changeset/clean-years-whisper.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-home': patch +--- + +Update set up documentation to export homepage as element instead of React component. diff --git a/.changeset/dull-bottles-teach.md b/.changeset/dull-bottles-teach.md new file mode 100644 index 0000000000..74203eb758 --- /dev/null +++ b/.changeset/dull-bottles-teach.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-home': patch +--- + +Allow more customization for the CustomHomepageGrid diff --git a/.changeset/famous-days-kneel.md b/.changeset/famous-days-kneel.md new file mode 100644 index 0000000000..418a1f6d4e --- /dev/null +++ b/.changeset/famous-days-kneel.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch +--- + +Added support for Confluence Cloud to the `confluence:transform:markdown` action in addition to the existing Confluence Server support, view the [README](https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend-module-confluence-to-markdown) for more details diff --git a/.changeset/fast-zebras-watch.md b/.changeset/fast-zebras-watch.md new file mode 100644 index 0000000000..7466565e79 --- /dev/null +++ b/.changeset/fast-zebras-watch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-devtools-backend': patch +--- + +Expose permissions through the metadata endpoint. diff --git a/.changeset/few-games-swim.md b/.changeset/few-games-swim.md new file mode 100644 index 0000000000..d0cd13ab11 --- /dev/null +++ b/.changeset/few-games-swim.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-cicd-statistics-module-gitlab': patch +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +--- + +Fixed publish configuration. diff --git a/.changeset/five-turtles-play.md b/.changeset/five-turtles-play.md new file mode 100644 index 0000000000..447cd60b3f --- /dev/null +++ b/.changeset/five-turtles-play.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +--- + +Add support for dry run for `gitlab:group:ensureExists` action. diff --git a/.changeset/gentle-turtles-applaud.md b/.changeset/gentle-turtles-applaud.md new file mode 100644 index 0000000000..f05d8b156c --- /dev/null +++ b/.changeset/gentle-turtles-applaud.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-analytics-module-ga4': patch +--- + +Fixed configuration visibility settings for `allowedContexts` and `allowedAttributes` diff --git a/.changeset/giant-maps-compete.md b/.changeset/giant-maps-compete.md new file mode 100644 index 0000000000..776332b308 --- /dev/null +++ b/.changeset/giant-maps-compete.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-pagerduty': patch +--- + +Add a homepage widget for the `Pagerduty` component. diff --git a/.changeset/good-rabbits-exist.md b/.changeset/good-rabbits-exist.md new file mode 100644 index 0000000000..df38293783 --- /dev/null +++ b/.changeset/good-rabbits-exist.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Fixed bug in KubernetesProxy where Host header was not propagated, leading to certificate issues diff --git a/.changeset/gorgeous-timers-act.md b/.changeset/gorgeous-timers-act.md new file mode 100644 index 0000000000..130ed5085f --- /dev/null +++ b/.changeset/gorgeous-timers-act.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +Fixed bug that caused ingestion errors when a user's name or profile picture is undefined. diff --git a/.changeset/grumpy-carrots-sin.md b/.changeset/grumpy-carrots-sin.md new file mode 100644 index 0000000000..8f2843ebd0 --- /dev/null +++ b/.changeset/grumpy-carrots-sin.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-unprocessed-entities': minor +'@backstage/plugin-catalog-backend-module-unprocessed': minor +--- + +Added a new plugin to expose entities which are unprocessed or have errors processing diff --git a/.changeset/heavy-ravens-fold.md b/.changeset/heavy-ravens-fold.md new file mode 100644 index 0000000000..f5f88c7662 --- /dev/null +++ b/.changeset/heavy-ravens-fold.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-node': patch +--- + +Use latest techdocs docker image by default. The latest image contains security updates. diff --git a/.changeset/hot-apples-cross.md b/.changeset/hot-apples-cross.md new file mode 100644 index 0000000000..3284c0ca8f --- /dev/null +++ b/.changeset/hot-apples-cross.md @@ -0,0 +1,5 @@ +--- +'@backstage/theme': patch +--- + +Tweaked `UnifiedThemeProvider` to avoid overlapping JSS class names in production. diff --git a/.changeset/hot-badgers-double.md b/.changeset/hot-badgers-double.md new file mode 100644 index 0000000000..835420b91a --- /dev/null +++ b/.changeset/hot-badgers-double.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': minor +--- + +`scaffolder/next`: Provide some default template components to `rjsf` to allow for standardization and markdown descriptions diff --git a/.changeset/hungry-lies-drop.md b/.changeset/hungry-lies-drop.md new file mode 100644 index 0000000000..4c6fead716 --- /dev/null +++ b/.changeset/hungry-lies-drop.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-badges-backend': patch +--- + +Adding migrations to the packages.json diff --git a/.changeset/itchy-mirrors-greet.md b/.changeset/itchy-mirrors-greet.md new file mode 100644 index 0000000000..3cd0dc6c35 --- /dev/null +++ b/.changeset/itchy-mirrors-greet.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Replace getBearerToken with library function of same diff --git a/.changeset/lazy-dancers-begin.md b/.changeset/lazy-dancers-begin.md new file mode 100644 index 0000000000..27282ec981 --- /dev/null +++ b/.changeset/lazy-dancers-begin.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': minor +--- + +Add credential provider for GitLab. diff --git a/.changeset/mean-insects-hope.md b/.changeset/mean-insects-hope.md new file mode 100644 index 0000000000..0a71a9c1ee --- /dev/null +++ b/.changeset/mean-insects-hope.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Make `useRelatedEntities` use `getEntitiesByRefs` under the hood diff --git a/.changeset/modern-dancers-sit.md b/.changeset/modern-dancers-sit.md new file mode 100644 index 0000000000..5894352707 --- /dev/null +++ b/.changeset/modern-dancers-sit.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Fix wrong gitlabUrl format in repoUrl input description diff --git a/.changeset/nice-peaches-reflect.md b/.changeset/nice-peaches-reflect.md new file mode 100644 index 0000000000..45c9f0ed6f --- /dev/null +++ b/.changeset/nice-peaches-reflect.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Set the expiration time of oidc `idToken` to be less than backstage session expiration time. diff --git a/.changeset/nice-readers-heal.md b/.changeset/nice-readers-heal.md new file mode 100644 index 0000000000..54534f8289 --- /dev/null +++ b/.changeset/nice-readers-heal.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Fixed typo in HostDiscovery's JSDoc diff --git a/.changeset/nine-bags-dream.md b/.changeset/nine-bags-dream.md new file mode 100644 index 0000000000..f0967775db --- /dev/null +++ b/.changeset/nine-bags-dream.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-adr': patch +--- + +Render table of front matter metadata when displaying MADR v3 formatted ADR diff --git a/.changeset/ninety-jeans-scream.md b/.changeset/ninety-jeans-scream.md new file mode 100644 index 0000000000..3465a67444 --- /dev/null +++ b/.changeset/ninety-jeans-scream.md @@ -0,0 +1,5 @@ +--- +'@backstage/errors': minor +--- + +Added `ServiceUnavailableError` diff --git a/.changeset/ninety-turkeys-knock.md b/.changeset/ninety-turkeys-knock.md new file mode 100644 index 0000000000..7f26f0eeda --- /dev/null +++ b/.changeset/ninety-turkeys-knock.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Switched startup strategy to initialize all plugins in parallel, as well as hook into the new startup lifecycle hooks. diff --git a/.changeset/olive-carpets-explode.md b/.changeset/olive-carpets-explode.md new file mode 100644 index 0000000000..6741355d58 --- /dev/null +++ b/.changeset/olive-carpets-explode.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-plugin-api': patch +--- + +Added startup hooks to the lifecycle services. diff --git a/.changeset/orange-taxis-exercise.md b/.changeset/orange-taxis-exercise.md new file mode 100644 index 0000000000..59a52b74bc --- /dev/null +++ b/.changeset/orange-taxis-exercise.md @@ -0,0 +1,9 @@ +--- +'@backstage/backend-common': minor +'@backstage/integration': minor +'@backstage/plugin-catalog-backend-module-azure': patch +--- + +Support authentication with a service principal or managed identity for Azure DevOps + +Azure DevOps recently released support, in public preview, for authenticating with a service principal or managed identity instead of a personal access token (PAT): https://devblogs.microsoft.com/devops/introducing-service-principal-and-managed-identity-support-on-azure-devops/. With this change the Azure integration now supports service principals and managed identities for Azure AD backed Azure DevOps organizations. Service principal and managed identity authentication is not supported on Azure DevOps Server (on-premises) organizations. diff --git a/.changeset/perfect-donkeys-cry.md b/.changeset/perfect-donkeys-cry.md new file mode 100644 index 0000000000..744dc19d64 --- /dev/null +++ b/.changeset/perfect-donkeys-cry.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Added `exact` prop to `SidebarSubmenuItem` which causes it to only highlight if the current location is an exact match. diff --git a/.changeset/pink-goats-talk.md b/.changeset/pink-goats-talk.md new file mode 100644 index 0000000000..3b67af81f4 --- /dev/null +++ b/.changeset/pink-goats-talk.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-search-react': patch +'@backstage/plugin-search': patch +'@backstage/plugin-techdocs': patch +--- + +Fix SearchBar styles & update StoryBook stories for custom styles for `notchedOutline` class. diff --git a/.changeset/plenty-roses-raise.md b/.changeset/plenty-roses-raise.md new file mode 100644 index 0000000000..71605705e3 --- /dev/null +++ b/.changeset/plenty-roses-raise.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-devtools-common': patch +--- + +Export the list of permissions diff --git a/.changeset/poor-months-switch.md b/.changeset/poor-months-switch.md new file mode 100644 index 0000000000..732152a965 --- /dev/null +++ b/.changeset/poor-months-switch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights': patch +--- + +The check description is now rendered with markdown. diff --git a/.changeset/pre.json b/.changeset/pre.json index 6ecb7483ef..fedefe5ccf 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -224,35 +224,77 @@ "@backstage/plugin-user-settings-backend": "0.1.9", "@backstage/plugin-vault": "0.1.12", "@backstage/plugin-vault-backend": "0.3.1", - "@backstage/plugin-xcmetrics": "0.2.38" + "@backstage/plugin-xcmetrics": "0.2.38", + "@backstage/plugin-catalog-backend-module-unprocessed": "0.0.0", + "@backstage/plugin-catalog-unprocessed-entities": "0.0.0" }, "changesets": [ + "afraid-rules-yell", "angry-jobs-ring", "beige-kangaroos-suffer", "beige-zebras-walk", "breezy-kids-obey", "chatty-ads-attack", + "chatty-seals-tap", + "clean-meals-pay", "clean-months-bake", + "clean-years-whisper", "create-app-1684855417", "curvy-years-smoke", + "dull-bottles-teach", + "famous-days-kneel", + "fast-ears-know", + "fast-zebras-watch", + "few-games-swim", "few-oranges-complain", "few-pugs-jam", + "gentle-turtles-applaud", + "giant-maps-compete", + "grumpy-carrots-sin", + "heavy-ravens-fold", + "hot-badgers-double", + "itchy-mirrors-greet", "khaki-radios-teach", + "lazy-dancers-begin", "light-cows-bow", "little-boats-think", "long-lobsters-brake", "lovely-impalas-sell", "lucky-keys-behave", + "nice-readers-heal", + "nine-bags-dream", + "ninety-jeans-scream", + "ninety-turkeys-knock", + "olive-carpets-explode", + "orange-taxis-exercise", "perfect-readers-attack", + "pink-goats-talk", + "plenty-roses-raise", + "real-donuts-brush", + "selfish-carrots-sneeze", "selfish-mugs-study", + "selfish-olives-end", "shaggy-gorillas-occur", + "shaggy-maps-whisper", + "shaggy-terms-travel", "short-seahorses-kiss", + "shy-numbers-try", "silver-cars-type", + "silver-ducks-drum", + "smart-berries-wash", + "sour-papayas-wink", + "strange-geese-argue", + "tasty-oranges-sleep", + "three-guests-beam", + "twenty-suns-breathe", + "two-mayflies-tell", "violet-pots-push", + "weak-rats-serve", "weak-snails-spar", "weak-snails-spark", "weak-snails-sparkl", "weak-snails-sparkle", + "wet-vans-drive", "yellow-crews-float" ] } diff --git a/.changeset/rare-bugs-chew.md b/.changeset/rare-bugs-chew.md new file mode 100644 index 0000000000..1b9f12c13e --- /dev/null +++ b/.changeset/rare-bugs-chew.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-github': patch +--- + +Properly handle `async` event callback diff --git a/.changeset/real-donuts-brush.md b/.changeset/real-donuts-brush.md new file mode 100644 index 0000000000..b6a875bd64 --- /dev/null +++ b/.changeset/real-donuts-brush.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-adr-backend': patch +--- + +Use front matter parser for MADR v3 formatted ADRs when indexing status/date diff --git a/.changeset/renovate-de04315.md b/.changeset/renovate-de04315.md new file mode 100644 index 0000000000..9b8f5bd72c --- /dev/null +++ b/.changeset/renovate-de04315.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-code-coverage-backend': patch +--- + +Updated dependency `xml2js` to `^0.6.0`. diff --git a/.changeset/selfish-carrots-sneeze.md b/.changeset/selfish-carrots-sneeze.md new file mode 100644 index 0000000000..0920f78f86 --- /dev/null +++ b/.changeset/selfish-carrots-sneeze.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-proxy-backend': patch +--- + +Marked headers `Authorization` and `X-Api-Key` as secret in order to not show up in frontend configuration. diff --git a/.changeset/selfish-olives-end.md b/.changeset/selfish-olives-end.md new file mode 100644 index 0000000000..cb3778f316 --- /dev/null +++ b/.changeset/selfish-olives-end.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Introduced built-in middleware into the default `HttpService` implementation that throws a `ServiceNotAvailable` error when plugins aren't able to serve request. Also introduced a request stalling mechanism that pauses incoming request until plugins have been fully initialized. diff --git a/.changeset/shaggy-maps-whisper.md b/.changeset/shaggy-maps-whisper.md new file mode 100644 index 0000000000..d67a98373c --- /dev/null +++ b/.changeset/shaggy-maps-whisper.md @@ -0,0 +1,6 @@ +--- +'@backstage/core-components': patch +'@backstage/plugin-api-docs': patch +--- + +Replaced usages of `theme.palette.theme.hint` with `theme.palette.text.secondary` as it has been removed in MUI v5 diff --git a/.changeset/shaggy-terms-travel.md b/.changeset/shaggy-terms-travel.md new file mode 100644 index 0000000000..a131608487 --- /dev/null +++ b/.changeset/shaggy-terms-travel.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend-module-pg': patch +--- + +Updated Postgres search query filter in DatabaseDocumentStore to support field value search in array. diff --git a/.changeset/shy-numbers-try.md b/.changeset/shy-numbers-try.md new file mode 100644 index 0000000000..a0af1bf12b --- /dev/null +++ b/.changeset/shy-numbers-try.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': minor +--- + +`scaffolder/next`: Don't render `TemplateGroups` when there's no results in with search query diff --git a/.changeset/silent-garlics-drum.md b/.changeset/silent-garlics-drum.md new file mode 100644 index 0000000000..64666521c8 --- /dev/null +++ b/.changeset/silent-garlics-drum.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +Added option to skip forked repos diff --git a/.changeset/silent-kangaroos-pay.md b/.changeset/silent-kangaroos-pay.md new file mode 100644 index 0000000000..f3da827a34 --- /dev/null +++ b/.changeset/silent-kangaroos-pay.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': patch +--- + +Extract `ui:*` fields from conditional `then` and `else` schema branches. diff --git a/.changeset/silver-ducks-drum.md b/.changeset/silver-ducks-drum.md new file mode 100644 index 0000000000..6cca57fdd4 --- /dev/null +++ b/.changeset/silver-ducks-drum.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +`EntityAutocompletePicker` add `initialSelectedOptions` prop diff --git a/.changeset/smart-berries-wash.md b/.changeset/smart-berries-wash.md new file mode 100644 index 0000000000..8d1454c837 --- /dev/null +++ b/.changeset/smart-berries-wash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-devtools': patch +--- + +Added note to README about how secrets are displayed in the Config tab of the DevTools plugin diff --git a/.changeset/sour-papayas-wink.md b/.changeset/sour-papayas-wink.md new file mode 100644 index 0000000000..30d5110fff --- /dev/null +++ b/.changeset/sour-papayas-wink.md @@ -0,0 +1,5 @@ +--- +'@backstage/catalog-model': minor +--- + +Deprecate target field and make targetRef required in common.schema.json diff --git a/.changeset/strange-geese-argue.md b/.changeset/strange-geese-argue.md new file mode 100644 index 0000000000..7be0886abb --- /dev/null +++ b/.changeset/strange-geese-argue.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-adr-common': patch +--- + +Add utility function for parsing MADR front matter diff --git a/.changeset/tame-buttons-smell.md b/.changeset/tame-buttons-smell.md new file mode 100644 index 0000000000..c7e51738e7 --- /dev/null +++ b/.changeset/tame-buttons-smell.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Fixed wrong `pluginID` in the `kubernetes` alpha backend support, that made the `kubernetes` plugin fail with the new experimental backend. diff --git a/.changeset/tasty-oranges-sleep.md b/.changeset/tasty-oranges-sleep.md new file mode 100644 index 0000000000..7c99ecc822 --- /dev/null +++ b/.changeset/tasty-oranges-sleep.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Added handling of `ServiceUnavailableError` to error handling middleware. diff --git a/.changeset/three-guests-beam.md b/.changeset/three-guests-beam.md new file mode 100644 index 0000000000..b46e80a13c --- /dev/null +++ b/.changeset/three-guests-beam.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +`EntityLifecycleFilter` loads data using the facets endpoint diff --git a/.changeset/tiny-hounds-cross.md b/.changeset/tiny-hounds-cross.md new file mode 100644 index 0000000000..822538423f --- /dev/null +++ b/.changeset/tiny-hounds-cross.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-home-react': patch +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-home': patch +--- + +bump `rjsf` dependencies to 5.7.3 diff --git a/.changeset/twenty-suns-breathe.md b/.changeset/twenty-suns-breathe.md new file mode 100644 index 0000000000..edc189a95e --- /dev/null +++ b/.changeset/twenty-suns-breathe.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': minor +--- + +`scaffolder/next`: provide a `ScaffolderField` component which is meant to replace some of the `FormControl` components from MUI, making it easier to write `FieldExtensions`. diff --git a/.changeset/two-mayflies-tell.md b/.changeset/two-mayflies-tell.md new file mode 100644 index 0000000000..a5226b5164 --- /dev/null +++ b/.changeset/two-mayflies-tell.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Add discovery feature to the onboard cli command. diff --git a/.changeset/warm-hornets-fetch.md b/.changeset/warm-hornets-fetch.md new file mode 100644 index 0000000000..eb84a72f0a --- /dev/null +++ b/.changeset/warm-hornets-fetch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Keyboard navigation to open EntityContextMenu now focus visible the first element. diff --git a/.changeset/weak-rats-serve.md b/.changeset/weak-rats-serve.md new file mode 100644 index 0000000000..fe7cd78510 --- /dev/null +++ b/.changeset/weak-rats-serve.md @@ -0,0 +1,9 @@ +--- +'@backstage/core-app-api': patch +'@backstage/core-plugin-api': patch +'@backstage/dev-utils': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. diff --git a/.changeset/wet-vans-drive.md b/.changeset/wet-vans-drive.md new file mode 100644 index 0000000000..75f4d96293 --- /dev/null +++ b/.changeset/wet-vans-drive.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/integration': patch +--- + +Add support for Repository Variables and Secrets to the `publish:github` and `github:repo:create` scaffolder actions. You will need to add `read/write` permissions to your GITHUB_TOKEN and/or Github Backstage App for Repository `Secrets` and `Variables` + +Upgrade octokit introduces some breaking changes. diff --git a/.changeset/wise-bats-repair.md b/.changeset/wise-bats-repair.md new file mode 100644 index 0000000000..fc383eb11d --- /dev/null +++ b/.changeset/wise-bats-repair.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes': patch +--- + +Add proposed fix dialog for pod errors diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7518fbab96..33097b505a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -66,6 +66,7 @@ yarn.lock @backstage/maintainers @back /plugins/kubernetes-* @backstage/maintainers @backstage/kubernetes-maintainers /plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer @NishkarshRaj /plugins/newrelic-dashboard @backstage/maintainers @mufaddal7 +/plugins/permission-* @backstage/permission-maintainers /plugins/playlist @backstage/maintainers @kuangp /plugins/playlist-* @backstage/maintainers @kuangp /plugins/puppetdb @backstage/maintainers @tdabasinskas diff --git a/.github/labeler.yml b/.github/labeler.yml index fb35f6e0e6..eaba199588 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,4 +1,4 @@ -catalog: +area:catalog: - plugins/catalog/**/* - plugins/catalog-*/**/* - packages/catalog-*/**/* @@ -9,19 +9,25 @@ search: - plugins/search/**/* - plugins/search-*/**/* - packages/search-*/**/* -techdocs: +homepage: + - plugins/home/**/* +area:discoverability: # search + home + - plugins/search/**/* + - plugins/search-*/**/* + - packages/search-*/**/* + - plugins/home/**/* +area:techdocs: - plugins/techdocs/**/* - plugins/techdocs-*/**/* - packages/techdocs-*/**/* -homepage: - - plugins/home/**/* documentation: - docs/**/* microsite: - microsite/**/* auth: - plugins/auth-backend/**/* - - plugins/permission-*/**/* - packages/core-app-api/src/apis/implementations/auth/**/* - packages/core-app-api/src/lib/Auth*/**/* - packages/core-plugin-api/src/apis/definitions/auth.ts +area:permission: + - plugins/permission-*/**/* diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index 68fbdabb00..e9fc74b874 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -364,6 +364,7 @@ SVGs talkdesk Talkdesk Tanzu +targetRef tasklist techdocs Telenor diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index 4ced080329..08d7c7c087 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -13,6 +13,10 @@ jobs: NODE_OPTIONS: --max-old-space-size=8192 DOCUSAURUS_SSR_CONCURRENCY: 5 + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + steps: - uses: actions/checkout@v3 @@ -52,7 +56,7 @@ jobs: run: ls microsite/build && ls microsite/build/storybook - name: Deploy both microsite and storybook to gh-pages - uses: JamesIves/github-pages-deploy-action@v4.4.1 + uses: JamesIves/github-pages-deploy-action@v4.4.2 with: branch: gh-pages folder: microsite/build diff --git a/.github/workflows/verify_microsite-noop.yml b/.github/workflows/verify_microsite-noop.yml index 0fa23812f5..cca7e512c5 100644 --- a/.github/workflows/verify_microsite-noop.yml +++ b/.github/workflows/verify_microsite-noop.yml @@ -6,7 +6,9 @@ on: pull_request: paths-ignore: - '.github/workflows/verify_microsite-next.yml' + - '.github/workflows/verify_microsite.yml' - 'microsite/**' + - 'mkdocs.yml' - 'docs/**' jobs: diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index e5037684e9..d219d0ea74 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -4,7 +4,9 @@ on: pull_request: paths: - '.github/workflows/verify_microsite-next.yml' + - '.github/workflows/verify_microsite.yml' - 'microsite/**' + - 'mkdocs.yml' - 'docs/**' jobs: @@ -37,6 +39,12 @@ jobs: - name: build API reference run: yarn build:api-docs + - name: Install MkDocs dependencies + run: pip3 install mkdocs mkdocs-techdocs-core + + - name: Build MkDocs for TechDocs + run: mkdocs build --strict + - name: verify yarn dependency duplicates run: node scripts/verify-lockfile-duplicates.js diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index 42326fd71d..92d6222b52 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -49,7 +49,7 @@ jobs: - uses: chromaui/action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} - # projetToken intentionally shared to allow collaborators to run Chromatic on forks + # projectToken intentionally shared to allow collaborators to run Chromatic on forks # https://www.chromatic.com/docs/custom-ci-provider#run-chromatic-on-external-forks-of-open-source-projects projectToken: 9tzak77m9nj workingDir: storybook diff --git a/ADOPTERS.md b/ADOPTERS.md index 98e156c9d4..864cc8945c 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -249,3 +249,5 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Worten](https://www.worten.pt) | [@elisiariocouto](https://github.com/elisiariocouto) | We are proud to be an adopter of Backstage. Our goal is to make our Backstage installation the go-to location for every developer. To achieve this, we developed a custom plugin to populate Backstage's catalog with information from our internal deployment tool. As a result, we now have full visibility of all Worten systems, components, APIs, messaging topics, and documentation. We also migrated the internal deployment tool's Web UI to Backstage. Currently, we are working on Backstage's Software Templates feature. | | [Inventa](https://www.inventa.shop) | [João Munhoz](https://github.com/joaovitormunhoz), [Lucca Fonte](https://github.com/luccafonte) | We use Backstage at Inventa to share knowledge between squads, in the form of technical documentation, API contracts, and service status/ownership info, fomenting a self-service and scalable engineering culture. We also developed a plugin that allows us to have a centralized view of all the engineering tools we have for each environment, making it easy to access each one of our tools and increasing productivity. | | [PITS Global Data Recovery Services](https://www.pitsdatarecovery.net/) | [@pheianox](https://github.com/pheianox) | The internal developer portal seeks to combine infrastructure tooling, services, and developer documentation into a single, user-friendly interface. By streamlining these components, the portal enhances productivity and simplifies the development process for the internal team. | +| [Ericsson](https://www.ericsson.com/) | [Shane Kelly](https://www.linkedin.com/in/shane-kelly-2367816/) | We are adopting backstage to use as our Internal Developer Portal. Our goal is to improve Developer Experience by reducing cognitive load through backstage as a single point for developer information, documentation, tools, software insights and developer metrics. To enable golden paths using the scaffolder and improve developer self service through automation of infrastructure provisioning and configuration. | +| [Paylocity](https://www.paylocity.com) | [@mharrah](https://www.linkedin.com/in/mattharrah/) | We're basing our internal developer hub we call Nucleus on Backstage. We're starting with the software catalog, then will gather feedback from our developers on what features they want next...integrations, templates, expanded catalog info, etc. | \ No newline at end of file diff --git a/OWNERS.md b/OWNERS.md index 25ada5853e..8d9a503c1c 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -66,6 +66,23 @@ Scope: The Kubernetes plugin and the base it provides for other plugins to build | Matthew Clarke | Spotify | | [mclarke47](http://github.com/mclarke47) | mclarke#0725 | | Jamie Klassen | VMware | | [jamieklassen](http://github.com/jamieklassen) | jamieklassen#3047 | +### Permission Framework + +Team: @backstage/permission-maintainers + +Scope: The Permission Framework and plugins integrating with the permission framework + +| Name | Organization | Team | GitHub | Discord | +| -------------------- | ------------ | --------------- | ---------------------------------------------- | ---------------- | +| Ainhoa Larumbe | Spotify | Imaginary Goats | [ainhoaL](http://github.com/ainhoaL) | ainhoa#8085 | +| Claire Casey | Spotify | Imaginary Goats | [clairelcasey](http://github.com/clairelcasey) | clairecasey#2710 | +| Eric Peterson | Spotify | Imaginary Goats | [iamEAP](http://github.com/iamEAP) | iamEAP#3058 | +| Harry Hogg | Spotify | Imaginary Goats | [HHogg](http://github.com/HHogg) | simplex#3451 | +| Joon Park | Spotify | Imaginary Goats | [Joonpark13](http://github.com/Joonpark13) | Sixpool#5060 | +| Mike Lewis | Spotify | Imaginary Goats | [mtlewis](http://github.com/mtlewis) | mtlewis#3658 | +| Tim Hansen | Spotify | Imaginary Goats | [timbonicus](http://github.com/timbonicus) | timbonicus#6871 | +| Vincenzo Scamporlino | Spotify | Imaginary Goats | [vinzscam](http://github.com/vinzscam) | vinzscam#6944 | + ### TechDocs Team: @backstage/techdocs-maintainers diff --git a/app-config.yaml b/app-config.yaml index e2b03786c4..95995025bc 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -274,6 +274,9 @@ catalog: # Example component for TechDocs - type: file target: ../../plugins/techdocs-backend/examples/documented-component/catalog-info.yaml + # Example component for ADRs + - type: file + target: ../../plugins/adr/examples/component/catalog-info.yaml # Backstage example templates - type: file target: ../../plugins/scaffolder-backend/sample-templates/all-templates.yaml diff --git a/contrib/docker/frontend-with-nginx/docker/default.conf.template b/contrib/docker/frontend-with-nginx/docker/default.conf.template index 23fdf271d3..72435b9954 100644 --- a/contrib/docker/frontend-with-nginx/docker/default.conf.template +++ b/contrib/docker/frontend-with-nginx/docker/default.conf.template @@ -6,6 +6,7 @@ server { #access_log /var/log/nginx/host.access.log main; location / { + include /etc/nginx/mime.types; root /usr/share/nginx/html; index index.html index.htm; try_files $uri /index.html; diff --git a/docs/FAQ.md b/docs/FAQ.md index 6f24786102..ffd293f92f 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -69,6 +69,14 @@ of Material-UI, you are able to adapt the interface to your brand guidelines. ## Technical FAQ +### What technology does Backstage use? + +Backstage is a large scale [TypeScript](https://www.typescriptlang.org/) +application whose frontend parts use [React](https://react.dev/) and +[Material-UI](https://mui.com/), while the backend parts use +[Node.js](https://nodejs.org/) and the [Express](https://expressjs.com/) +framework. + ### Why Material-UI? The short answer is that's what we've been using in Backstage internally. @@ -83,12 +91,6 @@ core focus of Backstage is to make plugin developers productive with as few hurdles as possible. Material-UI lets plugin makers get going easily with both well-known tech and a large flora of components. -### What technology does Backstage use? - -The codebase is a large-scale React application that uses TypeScript. For -[Phase 2](https://github.com/backstage/backstage#project-roadmap), we plan to -use Node.js and GraphQL. - ### What is the end-to-end user flow? The happy path story. There are three main user profiles for Backstage: the integrator, the diff --git a/docs/features/software-catalog/references.md b/docs/features/software-catalog/references.md index d347035950..6e0304b2e8 100644 --- a/docs/features/software-catalog/references.md +++ b/docs/features/software-catalog/references.md @@ -23,8 +23,7 @@ compound reference structure. ## String References -This is the most common alternative, that should be used in almost all -circumstances. +This is the most common alternative, that is used in almost all circumstances. The string is on the form `[:][/]`, that is, it is composed of between one and three parts in this specific order, without any @@ -75,30 +74,16 @@ essentially expand to `api:external-systems/petstore`, `api:internal/streetlights`, and `api:external-systems/hello-world`. We expect there to exist three API kind entities in the catalog matching those references. +Note that the remarks above in regards to shortening (leaving out kind and/or +namespace) _only_ apply for the entity input YAML data. In protocols, storage +systems, or when referring to entities externally, the entity ref always +consists of all three parts. + ## Compound References This is a more verbose version of a reference, where each part of the -kind-namespace-name triplet is expressed as a field in a structure. This format -can be used where necessary, such as if either of the three elements contains -colons or forward slashes. Avoid using it where possible, since it is harder to -read and write for humans. - -```yaml -# Example: -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: petstore - description: Petstore -spec: - type: service - lifecycle: experimental - owner: - kind: Group - name: aegis-imports/pet-managers -``` - -In this example, the `spec.owner` has been broken apart since the name was -complex. The kind happened to be written with an uppercase letter G, which also -works. The namespace was left out just like in the string version above, which -is handled identically. +kind-namespace-name triplet is expressed as a field in an object. You may see +this structure used in Backstage code, but it should normally not be used in any +form of protocol or between plugins and/or external systems. For those cases, +instead prefer to use the string form which has clearer semantics and can be +transported more easily since it's just a string. diff --git a/docs/features/techdocs/how-to-guides.md b/docs/features/techdocs/how-to-guides.md index 8bfd885b93..ab554db3bd 100644 --- a/docs/features/techdocs/how-to-guides.md +++ b/docs/features/techdocs/how-to-guides.md @@ -491,7 +491,7 @@ plugins: The `docs/index.md` can for example have the following content: -``` +```markdown # ${{ values.component_id }} ${{ values.description }} @@ -509,8 +509,8 @@ Done! You now have support for TechDocs in your own software template! ## How to enable iframes in TechDocs -TechDocs uses the [DOMPurify](https://github.com/cure53/DOMPurify) library to sanitize -HTML and prevent XSS attacks. +TechDocs uses the [DOMPurify](https://github.com/cure53/DOMPurify) library to +sanitize HTML and prevent XSS attacks. It's possible to allow some iframes based on a list of allowed hosts. To do this, add the allowed hosts in the `techdocs.sanitizer.allowedIframeHosts` @@ -530,20 +530,20 @@ This way, all iframes where the host in the src attribute is in the ## How to add Mermaid support in TechDocs -To add `Mermaid` support in Techdocs, you can use [`kroki`](https://kroki.io) +To add `Mermaid` support in TechDocs, you can use [`kroki`](https://kroki.io) that creates diagrams from Textual descriptions. It is a single rendering gateway for all popular diagrams-as-a-code tools. It supports an enormous number of diagram types. -1. **Create and Publish docker image:** Create the docker image from the - following Dockerfile and publish it to DockerHub. +1. **Create and Publish Docker image:** Create the Docker image from the + following `Dockerfile` and publish it to DockerHub. ```docker -FROM python:3.8-alpine +FROM python:3.10-alpine RUN apk update && apk --no-cache add gcc musl-dev openjdk11-jdk curl graphviz ttf-dejavu fontconfig -RUN pip install --upgrade pip && pip install mkdocs-techdocs-core==1.1.7 +RUN pip install --upgrade pip && pip install mkdocs-techdocs-core==1.2.0 RUN pip install mkdocs-kroki-plugin @@ -551,7 +551,7 @@ ENTRYPOINT [ "mkdocs" ] ``` Create a repository in your DockerHub and run the below command in the same -folder where your Dockerfile is present: +folder where your `Dockerfile` is present: ```shell docker build . -t dockerHub_Username/repositoryName:tagName @@ -559,7 +559,7 @@ docker build . -t dockerHub_Username/repositoryName:tagName Once the docker image is ready, push it to DockerHub. -2. **Update app-config.yaml:** So that when your app generates techdocs, it will +2. **Update app-config.yaml:** So that when your app generates TechDocs, it will pull your docker image from DockerHub. ```python @@ -573,7 +573,7 @@ techdocs: type: 'local' # Alternatives - 'googleGcs' or 'awsS3'. Read documentation for using alternatives. ``` -3. **Add the `kroki` plugin in mkdocs.yml:** +3. **Add the `kroki` plugin in `mkdocs.yml`:** ```yml plugins: @@ -588,7 +588,7 @@ plugins: > instead. Check out [mkdocs-kroki-plugin config](https://github.com/AVATEAM-IT-SYSTEMHAUS/mkdocs-kroki-plugin#config) > for more plugin configuration details. -4. **Add mermaid code into techdocs:** +4. **Add mermaid code into TechDocs:** ````md ```kroki-mermaid diff --git a/docs/features/techdocs/troubleshooting.md b/docs/features/techdocs/troubleshooting.md index d8b413be5c..3f0daba101 100644 --- a/docs/features/techdocs/troubleshooting.md +++ b/docs/features/techdocs/troubleshooting.md @@ -5,11 +5,24 @@ sidebar_label: Troubleshooting description: Troubleshooting for TechDocs --- -## Failure to clone +## Documentation not found when generating -TechDocs will fail to clone your docs if you have a git config which overrides -the `https` protocol with `ssh` or something else. Make sure to remove your git -config locally when you try TechDocs. +This may happen if you have TechDocs set up using the "out-of-the-box" +configuration, wherein documentation is built dynamically by the TechDocs +backend, and your TechDocs files are being pulled from a git-based source +control management system (e.g. GitHub, BitBucket, etc). + +If you experience this, check that TechDocs-related files (e.g. markdown, +assets, or the `mkdocs.yml` file) are not matched by an `export-ignore` +attribute in a `.gitattributes` file in the relevant repository. + +TechDocs' backend is not able to see such files, and therefore may generate +partial (or no) TechDocs as a result. + +You'll need to reconsider how you distribute tar archives based on your source +code (and how you prevent internal documentation from being included in those +archives). Alternatively, you could consider switching to the "recommended" +TechDocs architecture (documentation generated and published in CI/CD). ## MkDocs Build Errors diff --git a/docs/getting-started/homepage.md b/docs/getting-started/homepage.md index 63a97ec54f..9c6f6380a1 100644 --- a/docs/getting-started/homepage.md +++ b/docs/getting-started/homepage.md @@ -40,10 +40,10 @@ Inside your `packages/app` directory, create a new file where our new homepage c ```tsx import React from 'react'; -export const HomePage = () => { +export const homePage = ( /* We will shortly compose a pretty homepage here. */ - return

Welcome to Backstage!

; -}; +

Welcome to Backstage!

+); ``` #### 3. Update router for the root `/` route @@ -161,13 +161,11 @@ import React from 'react'; import Grid from '@material-ui/core/Grid'; import { HomePageCompanyLogo } from '@backstage/plugin-home'; -export const HomePage = () => { - return ( - - - - +export const homePage = ( + + + - ); -}; + +); ``` diff --git a/docs/integrations/azure/locations.md b/docs/integrations/azure/locations.md index 1fc476f418..5647a6cba4 100644 --- a/docs/integrations/azure/locations.md +++ b/docs/integrations/azure/locations.md @@ -13,6 +13,30 @@ or registered with the [catalog-import](https://github.com/backstage/backstage/tree/master/plugins/catalog-import) plugin. +Using a service principal: + +```yaml +integrations: + azure: + - host: dev.azure.com + credential: + clientId: ${CLIENT_ID} + clientSecret: ${CLIENT_SECRET} + tenantId: ${TENANT_ID} +``` + +Using a managed identity: + +```yaml +integrations: + azure: + - host: dev.azure.com + credential: + clientId: ${CLIENT_ID} +``` + +Using a personal access token (PAT): + ```yaml integrations: azure: @@ -22,11 +46,19 @@ integrations: > Note: An Azure DevOps provider is added automatically at startup for > convenience, so you only need to list it if you want to supply a -> [token](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate). +> [token](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate), +> a [service principal](https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/service-principal-managed-identity), +> or a [managed identity](https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/service-principal-managed-identity) -The configuration is a structure with two elements: +The configuration is a structure with these elements: - `host`: The DevOps host; only `dev.azure.com` is supported. - `token` (optional): A personal access token as expected by Azure DevOps. +- `credential`: (optional): A service principal or managed identity -> Note: The token should just be provided as the raw token generated by Azure DevOps using the format `raw_token` with no base64 encoding. Formatting and base64'ing is handled by dependent libraries handling the Azure DevOps API +> Note: +> +> - `token` and `credential` are mutually exclusive. +> - You cannot use a service principal or managed identity for Azure DevOps Server (on-premises) organizations +> - You can only use a service principal or managed identity for Azure AD backed Azure DevOps organizations +> - The token should just be provided as the raw token generated by Azure DevOps using the format `raw_token` with no base64 encoding. Formatting and base64'ing is handled by dependent libraries handling the Azure DevOps API diff --git a/docs/integrations/github/github-apps.md b/docs/integrations/github/github-apps.md index de313e48cd..3cad69f56d 100644 --- a/docs/integrations/github/github-apps.md +++ b/docs/integrations/github/github-apps.md @@ -136,3 +136,5 @@ integration: - `Issues`: `Read & write` - `Workflows`: `Read & write` (if templates include GitHub workflows) - `Commit statuses`: `Read-only` + - `Variables`: `Read & write` (if templates include GitHub Action Repository Variables) + - `Secrets`: `Read & write` (if templates include GitHub Action Repository Secrets) diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md index 39532e806f..39b60c76c5 100644 --- a/docs/integrations/github/org.md +++ b/docs/integrations/github/org.md @@ -261,8 +261,8 @@ returned identity. async (user, ctx): Promise => { const entity = await defaultUserTransformer(user, ctx); - if (entity && user.organizationVerifiedDomainEmails) { - entity.spec.profile!.email = user.organizationVerifiedDomainEmails[0] || ''; + if (entity && user.organizationVerifiedDomainEmails?.length) { + entity.spec.profile!.email = user.organizationVerifiedDomainEmails[0]; } return entity; diff --git a/docs/integrations/gitlab/discovery.md b/docs/integrations/gitlab/discovery.md index 45991b2cf5..4ddb0413b0 100644 --- a/docs/integrations/gitlab/discovery.md +++ b/docs/integrations/gitlab/discovery.md @@ -109,3 +109,5 @@ export default async function createPlugin( ``` If you don't want create location object if file with component definition do not exists in project, you can set the `skipReposWithoutExactFileMatch` option. That can reduce count of request to gitlab with 404 status code. + +If you don't want to create location object if the project is a fork, you can set the `skipForkedRepos` option. diff --git a/docs/plugins/url-reader.md b/docs/plugins/url-reader.md index fa9c341543..c8ff18952c 100644 --- a/docs/plugins/url-reader.md +++ b/docs/plugins/url-reader.md @@ -106,6 +106,16 @@ directly be used with a URL. Some example usages - Catalog using the `search` method to find files for a location URL containing a glob pattern. +Note that URL Readers which target git-based version control systems may, under +the hood, leverage the ability to create tar archives based on a specific git +commit-ish. A consequence of this is that files and directories configured with +[the `export-ignore` attribute](https://git-scm.com/docs/gitattributes#_creating_an_archive) +via `.gitattributes` will not be visible to the URL reader when using the +`readTree` or `search` methods. + +Be aware of this limitation and ensure that end-users of your plugin are also +aware via, for example, documentation. + ## Writing a new URL Reader If the available URL Readers are not sufficient for your use case and you want diff --git a/docs/releases/v1.15.0-next.1-changelog.md b/docs/releases/v1.15.0-next.1-changelog.md new file mode 100644 index 0000000000..950753978d --- /dev/null +++ b/docs/releases/v1.15.0-next.1-changelog.md @@ -0,0 +1,2638 @@ +# Release v1.15.0-next.1 + +## @backstage/backend-common@0.19.0-next.1 + +### Minor Changes + +- c7f848bcea3c: Support authentication with a service principal or managed identity for Azure DevOps + + Azure DevOps recently released support, in public preview, for authenticating with a service principal or managed identity instead of a personal access token (PAT): . With this change the Azure integration now supports service principals and managed identities for Azure AD backed Azure DevOps organizations. Service principal and managed identity authentication is not supported on Azure DevOps Server (on-premises) organizations. + +### Patch Changes + +- 4ef91ab46732: Updated the backend database connection configuration schema to set the password visibility to secret +- 9f47a743632c: Fixed typo in HostDiscovery's JSDoc +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-app-api@0.4.4-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/integration-aws-node@0.1.4-next.0 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/catalog-model@1.4.0-next.0 + +### Minor Changes + +- 33eae4b39a95: Deprecate target field and make targetRef required in common.schema.json + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/errors@1.2.0-next.0 + +### Minor Changes + +- c4e8fefd9f13: Added `ServiceUnavailableError` + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.0.2 + +## @backstage/integration@1.5.0-next.0 + +### Minor Changes + +- a316d226c780: Add credential provider for GitLab. +- c7f848bcea3c: Support authentication with a service principal or managed identity for Azure DevOps + + Azure DevOps recently released support, in public preview, for authenticating with a service principal or managed identity instead of a personal access token (PAT): . With this change the Azure integration now supports service principals and managed identities for Azure AD backed Azure DevOps organizations. Service principal and managed identity authentication is not supported on Azure DevOps Server (on-premises) organizations. + +### Patch Changes + +- df8411779da1: Add support for Repository Variables and Secrets to the `publish:github` and `github:repo:create` scaffolder actions. You will need to add `read/write` permissions to your GITHUB_TOKEN and/or Github Backstage App for Repository `Secrets` and `Variables` + + Upgrade octokit introduces some breaking changes. + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.0 + +### Minor Changes + +- d44fcd9829c2: Added a new plugin to expose entities which are unprocessed or have errors processing + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + +## @backstage/plugin-catalog-unprocessed-entities@0.1.0-next.0 + +### Minor Changes + +- d44fcd9829c2: Added a new plugin to expose entities which are unprocessed or have errors processing + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-scaffolder-backend@1.15.0-next.1 + +### Minor Changes + +- df8411779da1: Add support for Repository Variables and Secrets to the `publish:github` and `github:repo:create` scaffolder actions. You will need to add `read/write` permissions to your GITHUB_TOKEN and/or Github Backstage App for Repository `Secrets` and `Variables` + + Upgrade octokit introduces some breaking changes. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-react@1.5.0-next.1 + +### Minor Changes + +- 6b571405f806: `scaffolder/next`: Provide some default template components to `rjsf` to allow for standardization and markdown descriptions +- 4505dc3b4598: `scaffolder/next`: Don't render `TemplateGroups` when there's no results in with search query +- 6b571405f806: `scaffolder/next`: provide a `ScaffolderField` component which is meant to replace some of the `FormControl` components from MUI, making it easier to write `FieldExtensions`. + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + +## @backstage/app-defaults@1.4.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-permission-react@0.4.13-next.0 + +## @backstage/backend-app-api@0.4.4-next.1 + +### Patch Changes + +- 3bb4158a8aa4: Switched startup strategy to initialize all plugins in parallel, as well as hook into the new startup lifecycle hooks. +- 2c9f67e6f166: Introduced built-in middleware into the default `HttpService` implementation that throws a `ServiceNotAvailable` error when plugins aren't able to serve request. Also introduced a request stalling mechanism that pauses incoming request until plugins have been fully initialized. +- c4e8fefd9f13: Added handling of `ServiceUnavailableError` to error handling middleware. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/backend-defaults@0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-app-api@0.4.4-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + +## @backstage/backend-plugin-api@0.5.3-next.1 + +### Patch Changes + +- 3bb4158a8aa4: Added startup hooks to the lifecycle services. +- Updated dependencies + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/backend-tasks@0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/backend-test-utils@0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-app-api@0.4.4-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/catalog-client@1.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + +## @backstage/cli@0.22.8-next.1 + +### Patch Changes + +- 6816352500a7: Add discovery feature to the onboard cli command. +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli-node@0.1.1-next.0 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/eslint-plugin@0.1.3 + - @backstage/release-manifests@0.0.9 + - @backstage/types@1.0.2 + +## @backstage/cli-node@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/types@1.0.2 + +## @backstage/config-loader@1.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/core-app-api@1.8.1-next.0 + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + +## @backstage/core-components@0.13.2-next.1 + +### Patch Changes + +- 83bdc3a555c1: Replaced usages of `theme.palette.theme.hint` with `theme.palette.text.secondary` as it has been removed in MUI v5 +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/version-bridge@1.0.4 + +## @backstage/core-plugin-api@1.5.2-next.0 + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + +## @backstage/create-app@0.5.2-next.1 + +### Patch Changes + +- 08f177b91084: Add link from Template entity to the scaffolder launch page for the template in the AboutCard. +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/dev-utils@1.0.16-next.1 + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/app-defaults@1.4.0-next.1 + - @backstage/test-utils@1.4.0-next.1 + - @backstage/theme@0.4.0-next.0 + +## @backstage/integration-aws-node@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + +## @backstage/integration-react@1.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + +## @backstage/repo-tools@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/cli-node@0.1.1-next.0 + - @backstage/cli-common@0.1.12 + +## @techdocs/cli@1.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-techdocs-node@1.7.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + +## @backstage/test-utils@1.4.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.13-next.0 + +## @backstage/plugin-adr@0.6.1-next.1 + +### Patch Changes + +- 58524588448c: Render table of front matter metadata when displaying MADR v3 formatted ADR +- Updated dependencies + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-adr-common@0.2.10-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-adr-backend@0.3.4-next.1 + +### Patch Changes + +- 58524588448c: Use front matter parser for MADR v3 formatted ADRs when indexing status/date +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-adr-common@0.2.10-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-adr-common@0.2.10-next.0 + +### Patch Changes + +- 58524588448c: Add utility function for parsing MADR front matter +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-airbrake@0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/dev-utils@1.0.16-next.1 + - @backstage/test-utils@1.4.0-next.1 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-airbrake-backend@0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-allure@0.1.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-analytics-module-ga@0.1.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-analytics-module-ga4@0.1.1-next.1 + +### Patch Changes + +- 99056db6169e: Fixed configuration visibility settings for `allowedContexts` and `allowedAttributes` +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-apache-airflow@0.2.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + +## @backstage/plugin-api-docs@0.9.4-next.1 + +### Patch Changes + +- 83bdc3a555c1: Replaced usages of `theme.palette.theme.hint` with `theme.palette.text.secondary` as it has been removed in MUI v5 +- Updated dependencies + - @backstage/plugin-catalog@1.11.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-apollo-explorer@0.1.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-app-backend@0.3.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-backend@0.18.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-node@0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-azure-devops@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-devops-backend@0.3.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-sites@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-azure-sites-backend@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-badges@0.2.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-badges-backend@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-bazaar@0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.11.1-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli@0.22.8-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-bazaar-backend@0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-bitbucket-cloud-common@0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + +## @backstage/plugin-bitrise@0.1.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-catalog@1.11.1-next.1 + +### Patch Changes + +- 08f177b91084: Add link from Template entity to the scaffolder launch page for the template in the AboutCard. +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-catalog-backend@1.9.2-next.1 + +### Patch Changes + +- 77e04a2d55be: Replace getBearerToken with library function of same +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.2-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/integration-aws-node@0.1.4-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/plugin-kubernetes-common@0.6.4-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-azure@0.1.17-next.1 + +### Patch Changes + +- c7f848bcea3c: Support authentication with a service principal or managed identity for Azure DevOps + + Azure DevOps recently released support, in public preview, for authenticating with a service principal or managed identity instead of a personal access token (PAT): . With this change the Azure integration now supports service principals and managed identities for Azure AD backed Azure DevOps organizations. Service principal and managed identity authentication is not supported on Azure DevOps Server (on-premises) organizations. + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.7-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.7-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-github@0.3.1-next.1 + +### Patch Changes + +- df8411779da1: Add support for Repository Variables and Secrets to the `publish:github` and `github:repo:create` scaffolder actions. You will need to add `read/write` permissions to your GITHUB_TOKEN and/or Github Backstage App for Repository `Secrets` and `Variables` + + Upgrade octokit introduces some breaking changes. + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-gitlab@0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-common@1.0.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-catalog-graph@0.2.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-catalog-graphql@0.3.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-import@0.9.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-node@1.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-react@1.7.0-next.1 + +### Patch Changes + +- 429319d080cd: `EntityAutocompletePicker` add `initialSelectedOptions` prop +- 429319d080cd: `EntityLifecycleFilter` loads data using the facets endpoint +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + - @backstage/plugin-permission-react@0.4.13-next.0 + +## @backstage/plugin-cicd-statistics@0.1.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.15-next.1 + +### Patch Changes + +- 50c4457119ec: Fixed publish configuration. +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-cicd-statistics@0.1.21-next.1 + +## @backstage/plugin-circleci@0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-cloudbuild@0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-code-climate@0.1.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-code-coverage@0.2.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-code-coverage-backend@0.2.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-codescene@0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-config-schema@0.1.42-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-cost-insights@0.12.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-cost-insights-common@0.1.1 + +## @backstage/plugin-devtools@0.1.1-next.1 + +### Patch Changes + +- bbe15f70c5cc: Added note to README about how secrets are displayed in the Config tab of the DevTools plugin +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-devtools-common@0.1.1-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.13-next.0 + +## @backstage/plugin-devtools-backend@0.1.1-next.1 + +### Patch Changes + +- c312192e61dd: Expose permissions through the metadata endpoint. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-devtools-common@0.1.1-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-devtools-common@0.1.1-next.0 + +### Patch Changes + +- 459331f657ec: Export the list of permissions +- Updated dependencies + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-dynatrace@6.0.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-entity-feedback@0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-entity-feedback-common@0.1.1 + +## @backstage/plugin-entity-feedback-backend@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-entity-feedback-common@0.1.1 + +## @backstage/plugin-entity-validation@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-events-backend@0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-events-backend-module-aws-sqs@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-events-backend-module-azure@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + +## @backstage/plugin-events-backend-module-gerrit@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + +## @backstage/plugin-events-backend-module-github@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-events-backend-module-gitlab@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-events-backend-test-utils@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.7-next.1 + +## @backstage/plugin-events-node@0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + +## @backstage/plugin-explore@0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.29-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-explore-backend@0.0.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.2-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-explore-react@0.0.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-explore-common@0.0.1 + +## @backstage/plugin-firehydrant@0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-fossa@0.2.51-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-gcalendar@0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-gcp-projects@0.3.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-git-release-manager@0.3.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-github-actions@0.6.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-github-deployments@0.1.50-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-github-issues@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-github-pull-requests-board@0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-gitops-profiles@0.3.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-gocd@0.1.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-graphiql@0.2.51-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-graphql-backend@0.1.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-catalog-graphql@0.3.21-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-graphql-voyager@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-home@0.5.3-next.1 + +### Patch Changes + +- d1cfb4e4c4cd: Update set up documentation to export homepage as element instead of React component. +- 2e4940e1a8f8: Allow more customization for the CustomHomepageGrid +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-home-react@0.1.0-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-home-react@0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + +## @backstage/plugin-ilert@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-jenkins@0.8.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-jenkins-common@0.1.16-next.1 + +## @backstage/plugin-jenkins-backend@0.2.1-next.1 + +### Patch Changes + +- 0f93b6707e04: Don't expose username and authentication header if configured. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-jenkins-common@0.1.16-next.1 + +## @backstage/plugin-jenkins-common@0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + +## @backstage/plugin-kafka@0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-kafka-backend@0.2.39-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-kubernetes@0.9.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-kubernetes-common@0.6.4-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-kubernetes-backend@0.11.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/integration-aws-node@0.1.4-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-kubernetes-common@0.6.4-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-kubernetes-common@0.6.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + +## @backstage/plugin-lighthouse@0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-lighthouse-backend@0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-linguist@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-linguist-backend@0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-microsoft-calendar@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-newrelic@0.3.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-newrelic-dashboard@0.2.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + +## @backstage/plugin-octopus-deploy@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-org@0.6.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-org-react@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-pagerduty@0.5.12-next.1 + +### Patch Changes + +- 9512f13eb3af: Add a homepage widget for the `Pagerduty` component. +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-home-react@0.1.0-next.1 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-periskop@0.1.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-periskop-backend@0.1.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-backend@0.5.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-common@0.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-permission-node@0.7.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-react@0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-playlist@0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-permission-react@0.4.13-next.0 + - @backstage/plugin-playlist-common@0.1.7-next.0 + +## @backstage/plugin-playlist-backend@0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-playlist-common@0.1.7-next.0 + +## @backstage/plugin-playlist-common@0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.6-next.0 + +## @backstage/plugin-proxy-backend@0.2.40-next.1 + +### Patch Changes + +- 95987388f26b: Marked headers `Authorization` and `X-Api-Key` as secret in order to not show up in frontend configuration. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-puppetdb@0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-rollbar@0.4.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-rollbar-backend@0.1.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-scaffolder@1.13.2-next.1 + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.5.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.13-next.0 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3-next.1 + +### Patch Changes + +- c59a4b2b9e0a: Added support for Confluence Cloud to the `confluence:transform:markdown` action in addition to the existing Confluence Server support, view the [README](https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend-module-confluence-to-markdown) for more details +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.2.1-next.1 + +### Patch Changes + +- 50c4457119ec: Fixed publish configuration. +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-common@1.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-node@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-search@1.3.1-next.1 + +### Patch Changes + +- 2f660eb573cc: Fix SearchBar styles & update StoryBook stories for custom styles for `notchedOutline` class. +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-search-backend@1.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-search-backend-module-catalog@0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/integration-aws-node@0.1.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-search-backend-module-explore@0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-search-backend-module-pg@0.5.7-next.1 + +### Patch Changes + +- 3c09e8d3cb0c: Updated Postgres search query filter in DatabaseDocumentStore to support field value search in array. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-search-backend-module-techdocs@0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-techdocs-node@1.7.2-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-search-backend-node@1.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-search-common@1.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-search-react@1.6.1-next.1 + +### Patch Changes + +- 2f660eb573cc: Fix SearchBar styles & update StoryBook stories for custom styles for `notchedOutline` class. +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-sentry@0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-shortcuts@0.3.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-sonarqube@0.6.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-sonarqube-react@0.1.6-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-sonarqube-backend@0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-sonarqube-react@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + +## @backstage/plugin-splunk-on-call@0.4.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-stack-overflow@0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-home-react@0.1.0-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-stack-overflow-backend@0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-stackstorm@0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-tech-insights@0.3.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-insights-backend@0.5.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-tech-insights-node@0.4.4-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-tech-insights-node@0.4.4-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-insights-node@0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-tasks@0.5.3-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.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-techdocs@1.6.3-next.1 + +### Patch Changes + +- 2f660eb573cc: Fix SearchBar styles & update StoryBook stories for custom styles for `notchedOutline` class. +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.11.1-next.1 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/plugin-techdocs@1.6.3-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/test-utils@1.4.0-next.1 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-techdocs-backend@1.6.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-techdocs-node@1.7.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-techdocs-node@1.7.2-next.1 + +### Patch Changes + +- 7d4a09304f67: Use latest techdocs docker image by default. The latest image contains security updates. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/integration-aws-node@0.1.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## @backstage/plugin-techdocs-react@1.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/version-bridge@1.0.4 + +## @backstage/plugin-todo@0.2.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-todo-backend@0.1.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-user-settings@0.7.4-next.1 + +### Patch Changes + +- 5362a7c58eaa: Improved the user experience of the feature flags list. It now sorts the enabled flags to the top of the list to increase the visibilities of the toggled flags. +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + +## @backstage/plugin-user-settings-backend@0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-vault@0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-vault-backend@0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-xcmetrics@0.2.39-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## example-app@0.2.84-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.5.3-next.1 + - @backstage/plugin-user-settings@0.7.4-next.1 + - @backstage/plugin-pagerduty@0.5.12-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.0-next.0 + - @backstage/plugin-scaffolder-react@1.5.0-next.1 + - @backstage/plugin-adr@0.6.1-next.1 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/plugin-search@1.3.1-next.1 + - @backstage/plugin-techdocs@1.6.3-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-api-docs@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/plugin-devtools@0.1.1-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli@0.22.8-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-scaffolder@1.13.2-next.1 + - @internal/plugin-catalog-customized@0.0.11-next.1 + - @backstage/plugin-catalog-graph@0.2.31-next.1 + - @backstage/plugin-explore@0.4.4-next.1 + - @backstage/plugin-org@0.6.9-next.1 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/plugin-catalog-import@0.9.9-next.1 + - @backstage/plugin-github-actions@0.6.0-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.14-next.1 + - @backstage/plugin-azure-devops@0.3.1-next.1 + - @backstage/plugin-badges@0.2.43-next.1 + - @backstage/plugin-code-coverage@0.2.12-next.1 + - @backstage/plugin-entity-feedback@0.2.2-next.1 + - @backstage/plugin-gcalendar@0.3.15-next.1 + - @backstage/plugin-gocd@0.1.25-next.1 + - @backstage/plugin-jenkins@0.8.1-next.1 + - @backstage/plugin-kubernetes@0.9.2-next.1 + - @backstage/plugin-linguist@0.1.4-next.1 + - @backstage/plugin-microsoft-calendar@0.1.4-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.12-next.1 + - @backstage/plugin-playlist@0.1.10-next.1 + - @backstage/plugin-puppetdb@0.1.2-next.1 + - @backstage/plugin-stackstorm@0.1.3-next.1 + - @backstage/plugin-tech-insights@0.3.11-next.1 + - @backstage/plugin-todo@0.2.21-next.1 + - @backstage/plugin-stack-overflow@0.1.16-next.1 + - @backstage/app-defaults@1.4.0-next.1 + - @backstage/plugin-airbrake@0.3.19-next.1 + - @backstage/plugin-apache-airflow@0.2.12-next.1 + - @backstage/plugin-azure-sites@0.1.8-next.1 + - @backstage/plugin-circleci@0.3.19-next.1 + - @backstage/plugin-cloudbuild@0.3.19-next.1 + - @backstage/plugin-cost-insights@0.12.8-next.1 + - @backstage/plugin-dynatrace@6.0.0-next.1 + - @backstage/plugin-gcp-projects@0.3.38-next.1 + - @backstage/plugin-graphiql@0.2.51-next.1 + - @backstage/plugin-kafka@0.3.19-next.1 + - @backstage/plugin-lighthouse@0.4.4-next.1 + - @backstage/plugin-newrelic@0.3.37-next.1 + - @backstage/plugin-octopus-deploy@0.2.1-next.1 + - @backstage/plugin-rollbar@0.4.19-next.1 + - @backstage/plugin-sentry@0.5.4-next.1 + - @backstage/plugin-shortcuts@0.3.11-next.1 + - @backstage/plugin-tech-radar@0.6.5-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-permission-react@0.4.13-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + +## example-backend@0.2.84-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-jenkins-backend@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3-next.1 + - @backstage/plugin-devtools-backend@0.1.1-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.0 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/plugin-adr-backend@0.3.4-next.1 + - @backstage/plugin-proxy-backend@0.2.40-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.7-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-app-backend@0.3.46-next.1 + - @backstage/plugin-auth-backend@0.18.4-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-azure-devops-backend@0.3.25-next.1 + - @backstage/plugin-azure-sites-backend@0.1.8-next.1 + - @backstage/plugin-badges-backend@0.2.1-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-code-coverage-backend@0.2.12-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.4-next.1 + - @backstage/plugin-events-backend@0.2.7-next.1 + - @backstage/plugin-explore-backend@0.0.8-next.1 + - @backstage/plugin-graphql-backend@0.1.36-next.1 + - @backstage/plugin-kafka-backend@0.2.39-next.1 + - @backstage/plugin-kubernetes-backend@0.11.1-next.1 + - @backstage/plugin-lighthouse-backend@0.2.2-next.1 + - @backstage/plugin-linguist-backend@0.3.0-next.1 + - @backstage/plugin-permission-backend@0.5.21-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-playlist-backend@0.3.2-next.1 + - @backstage/plugin-rollbar-backend@0.1.43-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.1 + - @backstage/plugin-search-backend@1.3.2-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.1-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/plugin-tech-insights-backend@0.5.12-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30-next.1 + - @backstage/plugin-tech-insights-node@0.4.4-next.1 + - @backstage/plugin-techdocs-backend@1.6.3-next.1 + - @backstage/plugin-todo-backend@0.1.43-next.1 + - example-app@0.2.84-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## example-backend-next@0.0.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.0 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/backend-defaults@0.1.11-next.1 + - @backstage/plugin-app-backend@0.3.46-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-kubernetes-backend@0.11.1-next.1 + - @backstage/plugin-permission-backend@0.5.21-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-search-backend@1.3.2-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.2-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.2-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/plugin-techdocs-backend@1.6.3-next.1 + - @backstage/plugin-todo-backend@0.1.43-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + +## e2e-test@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.2-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/cli-common@0.1.12 + +## techdocs-cli-embedded-app@0.2.83-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.11.1-next.1 + - @backstage/plugin-techdocs@1.6.3-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli@0.22.8-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/app-defaults@1.4.0-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/config@1.0.7 + - @backstage/test-utils@1.4.0-next.1 + - @backstage/theme@0.4.0-next.0 + +## @internal/plugin-catalog-customized@0.0.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.11.1-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + +## @internal/plugin-todo-list@1.0.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @internal/plugin-todo-list-backend@1.0.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/config@1.0.7 + +## @internal/plugin-todo-list-common@1.0.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.6-next.0 diff --git a/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx b/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx new file mode 100644 index 0000000000..cc0f3ee1a9 --- /dev/null +++ b/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx @@ -0,0 +1,78 @@ +--- +title: 'Welcome: Backstage Deploy CLI (Alpha)' +author: Djamaile Rahamat, Spotify +authorURL: https://github.com/djamaile +authorImageURL: https://avatars.githubusercontent.com/u/15789670?v=4 +--- + +_This blog post is co-authored by Emma White ([@ewhite1997](https://github.com/ewhite1997)), Spotify._ + +![Backstage Deploy banner](assets/2023-05-06/Welcome-Backstage-Deploy.png) + +TL;DR: Backstage released a new CLI earlier this year as part of a [new Backstage project](https://github.com/backstage/backstage-deploy). This new capability allows early adopters to deploy their Backstage proof of concept faster than before. In this blog, you’ll learn a little bit more about the Deploy CLI and how you can get started with it. + +{/* truncate */} + +## Why Backstage Deploy + +We’ve heard from Backstage adopters that before reaching widespread adoption at their organizations, teams test out a Backstage proof of concept (POC). To create the POC, teams scaffold an instance, set up the catalog, and change the UI to suit their company’s branding. Once these milestones are completed, there's just one last step before showing off the awesomeness of a Backstage POC internally... deploying the Backstage POC from a local machine to the cloud. This final step often introduces a lot of questions that attempt to determine the easiest and fastest way to do that. + +Let’s say you’re at this last step: your POC is ready for deployment, but you have some lingering questions. + +For example: + +- What Dockerfile should you use? +- Should the POC be deployed on Kubernetes? +- How do you deploy the POC on my cloud provider? + +To address these questions and reduce friction from deploying a POC, we built a [new CLI](https://github.com/backstage/backstage-deploy). The CLI is simply called `deploy` and is invokable with `npx`. With this new CLI, you can generate a Dockerfile and deploy a Backstage instance onto a preferred cloud provider. While the package’s infrastructure is built to support all cloud providers, currently the CLI only offers an AWS implementation. In the future, we plan to add additional cloud providers to the package and [welcome any contributions](https://github.com/backstage/backstage/blob/6996b3338d678efc03307112524060e9dc2ad769/CONTRIBUTING.md) extending the suite of cloud provider implementations! + +**So, what about Kubernetes?** Since the CLI is designed specifically for the POC phase, we believe that Kubernetes isn’t the right fit – as Kubernetes is better suited for production workloads. So, we explored lightweight, container-based solutions, and landed on [Amazon Lightsail](https://docs.aws.amazon.com/lightsail/index.html) as a hosting service for the POC. +Amazon Lightsail supports [lightweight container](https://lightsail.aws.amazon.com/ls/docs/en_us/articles/amazon-lightsail-container-services) deployments [at a low cost](https://aws.amazon.com/lightsail/pricing/), and has a [free trial for new users](https://aws.amazon.com/lightsail/pricing/?loc=ft#AWS_Free_Tier)! Given Lightsail’s ease of use and affordability, we recommend using Lightsail over Kubernetes to test out your Backstage POC. + +With the Dockerfile and Kubernetes questions answered, we just have to address how to actually deploy the POC. And that is where the new CLI comes in. + +## Get started with Deploy CLI + +It's now time to put the Deploy CLI into action and deploy a Backstage POC. The following steps guide you through the deployment process. + +Deploy CLI makes use of [Pulumi](https://www.pulumi.com/docs/) which is an infrastructure-as-code tool that helps provision resources in the cloud. Before you get started, ensure you have the [Pulumi CLI](https://www.pulumi.com/docs/cli/) and [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) installed on your local machine. + +You can find the step-by-step installation documentation for Pulumi under the [Deployment section](https://backstage.io/docs/deployment/pulumi/aws). + +But we summarize the steps to deploy your POC here. You can invoke the the CLI you can use the following command: + +```bash +$ npx backstage-deploy aws --create-dockerfile +Starting Pulumi +successfully initialized stack +installing aws plugin... +plugins installed +setting up config +refreshing stack... +Refreshing (backstage): + +Instance will live at: +https://backstage-container-service.xxx.us-east-1.cs.amazonlightsail.com/ +``` + +Once you kick off the command it will create a Dockerfile for you in the root and Pulumi will start provisioning resources in AWS. +Pulumi will then create a container based deployment in Amazon Lightsail. + +After you’re done with the POC, it’s easy to delete the AWS resources you provisioned and save you costs within AWS. You can do so with the following command: + +```bash +$ npx backstage-deploy aws --destroy +``` + +## Looking ahead + +As mentioned earlier in this blog, we released the Backstage Deploy CLI with an AWS implementation only. In the next few months, we are excited to collect feedback from our end users to understand how the AWS implementation works. With those learnings, we plan to iterate on the Deploy CLI and build out implementations for other cloud providers. Of course, contributions are always welcome! + +So, please try this new CLI out and let us know what you think on [Discord](https://discord.com/channels/687207715902193673/995973463208644678)! + +Useful links: + +- [Backstage Deploy](https://github.com/backstage/backstage-deploy) +- [Pulumi docs](https://www.pulumi.com/docs/) +- [#deployment](https://discord.com/channels/687207715902193673/995973463208644678) channel in Discord diff --git a/microsite/blog/assets/2023-05-06/Welcome-Backstage-Deploy.png b/microsite/blog/assets/2023-05-06/Welcome-Backstage-Deploy.png new file mode 100644 index 0000000000..403f12f2bb Binary files /dev/null and b/microsite/blog/assets/2023-05-06/Welcome-Backstage-Deploy.png differ diff --git a/microsite/data/plugins/analytics-module-ga.yaml b/microsite/data/plugins/analytics-module-ga.yaml index d58ca322eb..54dea6454a 100644 --- a/microsite/data/plugins/analytics-module-ga.yaml +++ b/microsite/data/plugins/analytics-module-ga.yaml @@ -2,7 +2,7 @@ title: 'Analytics Module: Google Analytics' author: Spotify authorUrl: https://github.com/spotify -category: Analytics +category: Monitoring description: Track usage of your Backstage instance using Google Analytics. documentation: https://github.com/backstage/backstage/blob/master/plugins/analytics-module-ga/README.md iconUrl: /img/ga-icon.png diff --git a/microsite/data/plugins/chatgpt-plugin b/microsite/data/plugins/chatgpt-playground.yaml similarity index 86% rename from microsite/data/plugins/chatgpt-plugin rename to microsite/data/plugins/chatgpt-playground.yaml index fdf6c162b8..2c8b6ed09a 100644 --- a/microsite/data/plugins/chatgpt-plugin +++ b/microsite/data/plugins/chatgpt-playground.yaml @@ -3,8 +3,8 @@ title: 'ChatGPT Plugin' author: Enfuse authorUrl: https://enfuse.io/ category: Development -description: Experiment with the OpenAI playground to help you develop more efficiently +description: Experiment with the OpenAI playground to help you develop more efficiently documentation: https://github.com/enfuse/backstage-chatgpt-plugin/blob/main/README.md iconUrl: /img/enfuse.png npmPackageName: '@enfuse/chatgpt-plugin-frontend' -addedDate: '2023-04-21' +addedDate: '2023-05-23' diff --git a/microsite/data/plugins/firehydrant.yaml b/microsite/data/plugins/firehydrant.yaml index b52357e808..8a1f122051 100644 --- a/microsite/data/plugins/firehydrant.yaml +++ b/microsite/data/plugins/firehydrant.yaml @@ -2,7 +2,7 @@ title: FireHydrant author: FireHydrant authorUrl: https://firehydrant.io/ -category: Incident Management +category: Monitoring description: View service incidents information from FireHydrant, such as active incidents and incident metrics, directly within Backstage. documentation: https://github.com/backstage/backstage/blob/master/plugins/firehydrant/README.md iconUrl: https://raw.githubusercontent.com/backstage/backstage/master/plugins/firehydrant/doc/firehydrant_logo.png diff --git a/microsite/data/plugins/git-release-manager.yaml b/microsite/data/plugins/git-release-manager.yaml index 6d357a23f6..947209e6d5 100644 --- a/microsite/data/plugins/git-release-manager.yaml +++ b/microsite/data/plugins/git-release-manager.yaml @@ -2,7 +2,7 @@ title: GitHub Release Manager author: Spotify authorUrl: https://github.com/spotify -category: Release management +category: Source Control Mgmt description: Manage releases without having to juggle git commands. documentation: https://github.com/backstage/backstage/tree/master/plugins/git-release-manager iconUrl: /img/git-release-manager-logo.svg diff --git a/microsite/data/plugins/keycloak.yaml b/microsite/data/plugins/keycloak.yaml index 882d43f515..ea657c74f2 100644 --- a/microsite/data/plugins/keycloak.yaml +++ b/microsite/data/plugins/keycloak.yaml @@ -2,7 +2,7 @@ title: Authentication and Authorization with Keycloak author: Red Hat authorUrl: https://redhat.com -category: Authentication +category: Authentication/Authorization description: Load users and groups from Keycloak, enabling use of multiple authentication providers to be applied to Backstage entities. documentation: https://janus-idp.io/plugins/keycloak iconUrl: http://janus-idp.io/images/plugins/keycloak.svg diff --git a/microsite/data/plugins/kpt-config-as-data.yaml b/microsite/data/plugins/kpt-config-as-data.yaml index 2ed67262a8..af157a70c3 100644 --- a/microsite/data/plugins/kpt-config-as-data.yaml +++ b/microsite/data/plugins/kpt-config-as-data.yaml @@ -2,7 +2,7 @@ title: Configuration as Data author: kpt authorUrl: https://kpt.dev -category: Configuration +category: Configuration Management description: Configuration GUI over GitOps using kpt, with WYSIWYG editing, review and approval, versioning and undo, and package cloning and upgrades. documentation: https://github.com/GoogleContainerTools/kpt-backstage-plugins/tree/main/plugins/cad iconUrl: https://github.com/GoogleContainerTools/kpt/blob/main/logo/KptLogoSmall.png?raw=true diff --git a/microsite/data/plugins/ldap-auth.yml b/microsite/data/plugins/ldap-auth.yml index 1800f7370c..7446f28f6f 100644 --- a/microsite/data/plugins/ldap-auth.yml +++ b/microsite/data/plugins/ldap-auth.yml @@ -2,7 +2,7 @@ title: LDAP Auth author: ImmobiliareLabs authorUrl: https://github.com/immobiliare -category: Authentication +category: Authentication/Authorization description: Authenticate users to an external LDAP server documentation: https://github.com/immobiliare/backstage-plugin-ldap-auth/blob/main/README.md iconUrl: https://avatars.githubusercontent.com/u/10090828 diff --git a/microsite/data/plugins/ocm.yaml b/microsite/data/plugins/ocm.yaml index 15c23a0fb7..9e9b8ff1b7 100644 --- a/microsite/data/plugins/ocm.yaml +++ b/microsite/data/plugins/ocm.yaml @@ -2,7 +2,7 @@ title: Multi Cluster View with OCM author: Red Hat authorUrl: https://redhat.com -category: OCM +category: Infrastructure description: View clusters from OCM's MultiClusterHub and MultiCluster Engine in Backstage. documentation: https://janus-idp.io/plugins/ocm iconUrl: http://janus-idp.io/images/plugins/ocm.svg diff --git a/microsite/data/plugins/okta-entity-providers.yaml b/microsite/data/plugins/okta-entity-providers.yaml index 047992e785..4544c9eae7 100644 --- a/microsite/data/plugins/okta-entity-providers.yaml +++ b/microsite/data/plugins/okta-entity-providers.yaml @@ -2,7 +2,7 @@ title: Okta Organization Entity Provider author: roadie.io authorUrl: https://roadie.io/?utm_source=backstage.io&utm_medium=marketplace&utm_campaign=okta-entity-provider -category: Identity +category: Authentication/Authorization description: Load users and groups from Okta into the Backstage catalog. documentation: https://github.com/RoadieHQ/roadie-backstage-plugins/tree/main/plugins/backend/catalog-backend-module-okta iconUrl: https://roadie.io/images/logos/okta.png diff --git a/microsite/data/plugins/rootly.yaml b/microsite/data/plugins/rootly.yaml index 4aaf10ee7b..fa65e2d6ef 100644 --- a/microsite/data/plugins/rootly.yaml +++ b/microsite/data/plugins/rootly.yaml @@ -2,7 +2,7 @@ title: Rootly author: Rootly authorUrl: https://rootly.com/ -category: Incident Management +category: Monitoring description: Import your Backstage entities into Rootly services and view incidents & analytics. documentation: https://github.com/rootlyhq/backstage-plugin/blob/master/README.md iconUrl: https://raw.githubusercontent.com/rootlyhq/backstage-plugin/master/docs/logo.png diff --git a/microsite/data/plugins/s3-viewer.yaml b/microsite/data/plugins/s3-viewer.yaml index 2eeeb23415..57d5b22ba1 100644 --- a/microsite/data/plugins/s3-viewer.yaml +++ b/microsite/data/plugins/s3-viewer.yaml @@ -2,7 +2,7 @@ title: S3 Viewer author: Spreadgroup authorUrl: https://github.com/spreadshirt -category: AWS +category: Infrastructure description: Visualization of S3 buckets and their contents in file explorer style. documentation: https://github.com/spreadshirt/backstage-plugin-s3/ iconUrl: /img/s3-bucket.svg diff --git a/microsite/data/plugins/solo-io-gloo-platform-portal.yaml b/microsite/data/plugins/solo-io-gloo-platform-portal.yaml new file mode 100644 index 0000000000..fe7f4d78da --- /dev/null +++ b/microsite/data/plugins/solo-io-gloo-platform-portal.yaml @@ -0,0 +1,10 @@ +--- +title: Solo.io Gloo Platform Portal +author: Solo.io +authorUrl: https://solo.io +category: Infrastructure +description: View, test, and manage your Gloo Platform Portal APIs through our Backstage plugin. +documentation: https://github.com/solo-io/dev-portal-backstage-public#readme +iconUrl: /img/solo-io-glooy-circle.png.webp +npmPackageName: '@solo.io/dev-portal-backstage-plugin' +addedDate: '2023-05-19' diff --git a/microsite/data/plugins/statusneo-github-plugin.yaml b/microsite/data/plugins/statusneo-github-plugin.yaml index 9c56dd4ae4..2497a99c1b 100644 --- a/microsite/data/plugins/statusneo-github-plugin.yaml +++ b/microsite/data/plugins/statusneo-github-plugin.yaml @@ -1,7 +1,7 @@ title: Statusneo GitHub Plugin author: Statusneo authorUrl: https://statusneo.com/ -category: GitHub +category: Source Control Mgmt description: Provides status cards GitHub pull requests and GitHub actions. documentation: https://github.com/StatusNeo/backstage-plugin-github iconUrl: /img/github-statusneo.png diff --git a/microsite/data/plugins/tekton-pipelines.yaml b/microsite/data/plugins/tekton-pipelines.yaml index 2da80d34bf..fe19ab2af2 100644 --- a/microsite/data/plugins/tekton-pipelines.yaml +++ b/microsite/data/plugins/tekton-pipelines.yaml @@ -2,7 +2,7 @@ title: Tekton Pipelines author: JQuad Group authorUrl: https://github.com/jquad-group -category: CI +category: CI/CD description: View the status of the Tekton PipelineRun resources. documentation: https://github.com/jquad-group/backstage-jquad#readme iconUrl: https://raw.githubusercontent.com/jquad-group/backstage-jquad/main/img/tekton-horizontal-color.png diff --git a/microsite/data/plugins/tekton.yaml b/microsite/data/plugins/tekton.yaml index b1ebfb1349..fa94b89c35 100644 --- a/microsite/data/plugins/tekton.yaml +++ b/microsite/data/plugins/tekton.yaml @@ -2,7 +2,7 @@ title: Pipelines with Tekton author: Red Hat authorUrl: https://redhat.com -category: CI +category: CI/CD description: Easily view Tekton PipelineRun status for your services in Backstage. documentation: https://janus-idp.io/plugins/tekton iconUrl: http://janus-idp.io/images/plugins/tekton.svg diff --git a/microsite/package.json b/microsite/package.json index 98301ce2d0..720179093a 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -17,9 +17,10 @@ "docusaurus": "docusaurus" }, "devDependencies": { - "@docusaurus/module-type-aliases": "0.0.0-5580", + "@docusaurus/module-type-aliases": "0.0.0-5591", "@spotify/prettier-config": "^14.0.0", "@tsconfig/docusaurus": "^1.0.6", + "@types/luxon": "^3.0.0", "@types/webpack-env": "^1.18.0", "js-yaml": "^4.1.0", "prettier": "^2.6.2", @@ -28,12 +29,13 @@ }, "prettier": "@spotify/prettier-config", "dependencies": { - "@docusaurus/core": "0.0.0-5580", - "@docusaurus/plugin-client-redirects": "0.0.0-5580", - "@docusaurus/preset-classic": "0.0.0-5580", + "@docusaurus/core": "0.0.0-5591", + "@docusaurus/plugin-client-redirects": "0.0.0-5591", + "@docusaurus/preset-classic": "0.0.0-5591", "@swc/core": "^1.3.46", "clsx": "^1.1.1", "docusaurus-plugin-sass": "^0.2.3", + "luxon": "^3.0.0", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2", diff --git a/microsite/src/components/contentBlock/contentBlock.tsx b/microsite/src/components/contentBlock/contentBlock.tsx index aae065db44..983f684927 100644 --- a/microsite/src/components/contentBlock/contentBlock.tsx +++ b/microsite/src/components/contentBlock/contentBlock.tsx @@ -1,6 +1,6 @@ import Link from '@docusaurus/Link'; import clsx from 'clsx'; -import React, { FC, PropsWithChildren, ReactNode } from 'react'; +import React, { PropsWithChildren, ReactNode } from 'react'; import contentBlockStyles from './contentBlock.module.scss'; diff --git a/microsite/src/pages/plugins/_pluginCard.tsx b/microsite/src/pages/plugins/_pluginCard.tsx index d6b4017db5..ba8e8069d2 100644 --- a/microsite/src/pages/plugins/_pluginCard.tsx +++ b/microsite/src/pages/plugins/_pluginCard.tsx @@ -1,5 +1,6 @@ import Link from '@docusaurus/Link'; import { SimpleCard } from '@site/src/components/simpleCard/simpleCard'; +import clsx from 'clsx'; import React from 'react'; export interface IPluginData { @@ -10,6 +11,8 @@ export interface IPluginData { documentation: string; iconUrl: string; title: string; + addedDate: string; + isNew: boolean; order?: number; } @@ -22,14 +25,17 @@ export const PluginCard = ({ description, documentation, iconUrl, + isNew = false, title, }: IPluginData) => ( + {isNew &&
NEW
} + {title} -

{title}

+

{title}

by {author} diff --git a/microsite/src/pages/plugins/index.tsx b/microsite/src/pages/plugins/index.tsx index b1c9601110..94e9df0e8d 100644 --- a/microsite/src/pages/plugins/index.tsx +++ b/microsite/src/pages/plugins/index.tsx @@ -1,12 +1,19 @@ import Link from '@docusaurus/Link'; +import PluginsFilter from '@site/src/components/pluginsFilter/pluginsFilter'; +import { calcIsNewPlugin } from '@site/src/util/calcIsNewPlugin'; +import { truncateDescription } from '@site/src/util/truncateDescription'; +import { ChipCategory } from '@site/src/util/types'; import Layout from '@theme/Layout'; import clsx from 'clsx'; import React, { useState } from 'react'; + import { IPluginData, PluginCard } from './_pluginCard'; import pluginsStyles from './plugins.module.scss'; -import { ChipCategory } from '@site/src/util/types'; -import { truncateDescription } from '@site/src/util/truncateDescription'; -import PluginsFilter from '@site/src/components/pluginsFilter/pluginsFilter'; + +interface IPluginsList { + corePlugins: IPluginData[]; + otherPlugins: IPluginData[]; +} const pluginsContext = require.context( '../../../data/plugins', @@ -14,17 +21,20 @@ const pluginsContext = require.context( /\.ya?ml/, ); -const plugins = pluginsContext.keys().reduce( +const plugins: IPluginsList = pluginsContext.keys().reduce( (acum, id) => { - const pluginData: IPluginData = pluginsContext(id).default; + let pluginData: IPluginData = pluginsContext(id).default; + const category: keyof IPluginsList = + pluginData.category === 'Core Feature' ? 'corePlugins' : 'otherPlugins'; - acum[ - pluginData.category === 'Core Feature' ? 'corePlugins' : 'otherPlugins' - ].push(truncateDescription(pluginData)); + pluginData = calcIsNewPlugin(pluginData); + pluginData = truncateDescription(pluginData); + + acum[category].push(pluginData); return acum; }, - { corePlugins: [] as IPluginData[], otherPlugins: [] as IPluginData[] }, + { corePlugins: [], otherPlugins: [] } as IPluginsList, ); plugins.corePlugins.sort((a, b) => a.order - b.order); diff --git a/microsite/src/pages/plugins/plugins.module.scss b/microsite/src/pages/plugins/plugins.module.scss index d5ea5de6e7..ba2ab970a4 100644 --- a/microsite/src/pages/plugins/plugins.module.scss +++ b/microsite/src/pages/plugins/plugins.module.scss @@ -11,6 +11,7 @@ :global(.card .card__header) { display: grid; row-gap: 0.25rem; + position: relative; column-gap: 1rem; align-items: center; grid-template-columns: auto 1fr; @@ -19,6 +20,29 @@ margin: 0; } + :global(.newRibbon) { + --paddingX: 1.2lh; + --rotation: 45deg; + --translateX: 30%; + --translateY: -100%; + + top: 0; + right: 0; + padding: 0 var(--paddingX); + position: absolute; + text-align: center; + font-weight: bold; + + transform: translateY(var(--translateY)) translateX(var(--translateX)) + rotate(var(--rotation)); + transform-origin: bottom left; + background-color: var(--ifm-color-primary); + } + + :global(.newRibbonPadding) { + padding-right: 1.2lh; + } + :global(img) { width: 80px; grid-row: 1/4; diff --git a/microsite/src/util/calcIsNewPlugin.tsx b/microsite/src/util/calcIsNewPlugin.tsx new file mode 100644 index 0000000000..4b23e1d47d --- /dev/null +++ b/microsite/src/util/calcIsNewPlugin.tsx @@ -0,0 +1,18 @@ +import { DateTime } from 'luxon'; + +export const newDaysLimit = 100; + +export const calcIsNewPlugin = < + T extends { addedDate: string; isNew: boolean }, +>( + itemData: T, +) => { + const addedDate = DateTime.fromISO(itemData.addedDate); + const daysOld = Math.abs(addedDate.diffNow('days').days); + const isNew = !isNaN(daysOld) && daysOld < newDaysLimit; + + return { + ...itemData, + isNew, + }; +}; diff --git a/microsite/static/img/solo-io-glooy-circle.png.webp b/microsite/static/img/solo-io-glooy-circle.png.webp new file mode 100644 index 0000000000..4decd3bf50 Binary files /dev/null and b/microsite/static/img/solo-io-glooy-circle.png.webp differ diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 7097fb337e..3c19a6e05c 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -1620,9 +1620,9 @@ __metadata: languageName: node linkType: hard -"@docusaurus/core@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/core@npm:0.0.0-5580" +"@docusaurus/core@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/core@npm:0.0.0-5591" dependencies: "@babel/core": ^7.20.12 "@babel/generator": ^7.21.1 @@ -1634,13 +1634,13 @@ __metadata: "@babel/runtime": ^7.21.0 "@babel/runtime-corejs3": ^7.21.0 "@babel/traverse": ^7.21.2 - "@docusaurus/cssnano-preset": 0.0.0-5580 - "@docusaurus/logger": 0.0.0-5580 - "@docusaurus/mdx-loader": 0.0.0-5580 + "@docusaurus/cssnano-preset": 0.0.0-5591 + "@docusaurus/logger": 0.0.0-5591 + "@docusaurus/mdx-loader": 0.0.0-5591 "@docusaurus/react-loadable": 5.5.2 - "@docusaurus/utils": 0.0.0-5580 - "@docusaurus/utils-common": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/utils": 0.0.0-5591 + "@docusaurus/utils-common": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 "@slorber/static-site-generator-webpack-plugin": ^4.0.7 "@svgr/webpack": ^6.5.1 autoprefixer: ^10.4.13 @@ -1700,41 +1700,41 @@ __metadata: react-dom: ^16.8.4 || ^17.0.0 bin: docusaurus: bin/docusaurus.mjs - checksum: 1160559109aa834bcd3dc0210ca824ad6cbdea363951c5cba690c1882c78a7da6e1e52b8a5c35fef3bfc23f9f66e84880c354727b7987d371cac8ec6fb77d1bb + checksum: 95dc10c721c1ec9b4912b772fc21f7ed79a4d27e3ab50c5acf30a86609ac8c4b544639fa6590705a3fac82ed72d3ae9b4b197d2db432d1af45d55b21bace6994 languageName: node linkType: hard -"@docusaurus/cssnano-preset@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/cssnano-preset@npm:0.0.0-5580" +"@docusaurus/cssnano-preset@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/cssnano-preset@npm:0.0.0-5591" dependencies: cssnano-preset-advanced: ^5.3.10 postcss: ^8.4.21 postcss-sort-media-queries: ^4.3.0 tslib: ^2.5.0 - checksum: 4a46af1e9327d6ebbed3f0f6e60cc1ca59d5c07d39be35c42c13b0a64795b0b1565585adfca063798be79100aca425ee0c12f28a816b56686fb97726bec00f40 + checksum: 256397caffd2c3d993b8a1e37b9a4f02b8baf4d78ff86df368e47d8e61c5933fc1258e26edac5a1823db0472896196e6a88f16f85cc81834f6a5edb04dfb4bf9 languageName: node linkType: hard -"@docusaurus/logger@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/logger@npm:0.0.0-5580" +"@docusaurus/logger@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/logger@npm:0.0.0-5591" dependencies: chalk: ^4.1.2 tslib: ^2.5.0 - checksum: 5792b6672623b70d38871713c47ba88cc0df6c8d224c28ac58d0512b8bf1b672786cc2fa0b1a79cc045c473e1e14b5a9cce4b01e623dd252893294d6aff9d1c2 + checksum: 0a59f232fec86170e9fbdca3f6bf7805ed0a38f1c83ff96aabdeb310c1de357c89db540e55d007086f76da701d0ffe89b283959856668894e8e2bae983f141b4 languageName: node linkType: hard -"@docusaurus/mdx-loader@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/mdx-loader@npm:0.0.0-5580" +"@docusaurus/mdx-loader@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/mdx-loader@npm:0.0.0-5591" dependencies: "@babel/parser": ^7.21.2 "@babel/traverse": ^7.21.2 - "@docusaurus/logger": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/logger": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 "@mdx-js/mdx": ^2.1.5 escape-html: ^1.0.3 estree-util-value-to-estree: ^2.1.0 @@ -1758,16 +1758,16 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: b32812e0bca91a29761fda742a790f67077bb7e8860e20e83f009e297ca49017192fa14051ab82f1a3e66800de9e5a0b561b32ce2dffb4eecc0aee48116d3490 + checksum: 919c5f0a0d815674bbf8777ba4ce758d26bb13f046e772d11b7f688b183a31d58bb9ba55d8a484f181996ea16f9f967529337ab98bc62b9d6c806d4dde374d15 languageName: node linkType: hard -"@docusaurus/module-type-aliases@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/module-type-aliases@npm:0.0.0-5580" +"@docusaurus/module-type-aliases@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/module-type-aliases@npm:0.0.0-5591" dependencies: "@docusaurus/react-loadable": 5.5.2 - "@docusaurus/types": 0.0.0-5580 + "@docusaurus/types": 0.0.0-5591 "@types/history": ^4.7.11 "@types/react": "*" "@types/react-router-config": "*" @@ -1777,19 +1777,19 @@ __metadata: peerDependencies: react: "*" react-dom: "*" - checksum: b5b3544f2f2d395c1d406a1b3f03f719aee3aa3fd7603c54af3b09c4fb8bb153cf2ee6697bc9cfc9fb2550a11a3e474a52c9f2c132924e2be60662ffc6379ace + checksum: 9009e4f6edbfd274b42f5a0c2821c90606103404ec7df9e916940799ee8e810605549178d6a3e7ad6531554402d60a3db822268c88ddbff119a5c10f85f833d4 languageName: node linkType: hard -"@docusaurus/plugin-client-redirects@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/plugin-client-redirects@npm:0.0.0-5580" +"@docusaurus/plugin-client-redirects@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/plugin-client-redirects@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/logger": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 - "@docusaurus/utils-common": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/logger": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 + "@docusaurus/utils-common": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 eta: ^2.0.1 fs-extra: ^11.1.0 lodash: ^4.17.21 @@ -1797,21 +1797,21 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 7414d2026446862505d0c679ad3757107f28100ea76309d2a024ebe78865f2fcf3e3b85c3117361142e319362b5a5b22e6bce968763fdfd0741b6a60d2eb3f4b + checksum: 9e06448d280e3642fbe6ae02586c430c1245410e225a6f14f35c815d9cf13734b8793266267777b0f49eef968cd30d8247542b4521f3bdde0d5bebbfdd4a757c languageName: node linkType: hard -"@docusaurus/plugin-content-blog@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/plugin-content-blog@npm:0.0.0-5580" +"@docusaurus/plugin-content-blog@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/plugin-content-blog@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/logger": 0.0.0-5580 - "@docusaurus/mdx-loader": 0.0.0-5580 - "@docusaurus/types": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 - "@docusaurus/utils-common": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/logger": 0.0.0-5591 + "@docusaurus/mdx-loader": 0.0.0-5591 + "@docusaurus/types": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 + "@docusaurus/utils-common": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 cheerio: ^1.0.0-rc.12 feed: ^4.2.2 fs-extra: ^11.1.0 @@ -1824,21 +1824,21 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 0c5d37fa84298ce12b2a0f5c1dea1ee7d72d4b28c545fd081f3c3e5f93f15a980d877dcf88718aa1f4b8a03abf3d0c8c0df10d0a2ef22aac7a8a96d2786f91c2 + checksum: 61014344725c5bb003b1ef0e460d9287501f69d7a475b1650ddaffdd5a1609db244f766b1b0a2188f4db1a68f0ddd4dfd3ac6abcd20ed17446fa6294e35bea96 languageName: node linkType: hard -"@docusaurus/plugin-content-docs@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/plugin-content-docs@npm:0.0.0-5580" +"@docusaurus/plugin-content-docs@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/plugin-content-docs@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/logger": 0.0.0-5580 - "@docusaurus/mdx-loader": 0.0.0-5580 - "@docusaurus/module-type-aliases": 0.0.0-5580 - "@docusaurus/types": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/logger": 0.0.0-5591 + "@docusaurus/mdx-loader": 0.0.0-5591 + "@docusaurus/module-type-aliases": 0.0.0-5591 + "@docusaurus/types": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 "@types/react-router-config": ^5.0.6 combine-promises: ^1.1.0 fs-extra: ^11.1.0 @@ -1851,133 +1851,133 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: fa58801bf0cebf055ed11adbadc3f27f7ed0ddb95174ab60bab76a21f759dc7abdfdd15f32141f7e259090c456634ee2556ac9a7daaaf7f5f6e3666d9f247d00 + checksum: 837fa1d6a0e5238ec8d9422a7de2da19380059edfd50946243bbc93f43f813336cd220a2f521e1efc99261218ab3cccaaf64c0977bdbaa14ed09f95924347476 languageName: node linkType: hard -"@docusaurus/plugin-content-pages@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/plugin-content-pages@npm:0.0.0-5580" +"@docusaurus/plugin-content-pages@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/plugin-content-pages@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/mdx-loader": 0.0.0-5580 - "@docusaurus/types": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/mdx-loader": 0.0.0-5591 + "@docusaurus/types": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 fs-extra: ^11.1.0 tslib: ^2.5.0 webpack: ^5.76.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 42bf814d9bf5540b8b2f8045f1577c49d3fca4a85069865695ff5dd9fa3f935283f9d46f920c4dd0a28190cf3b342d432b0985636bae9f05280835f73aec8c87 + checksum: 74bfbc522fc60d0830b47a0100a0afd66d21d290047432414e9bd94db21d61805b883fc155f6c9ee965023f6153d7fb09b9219386f9140cda52540c40028942f languageName: node linkType: hard -"@docusaurus/plugin-debug@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/plugin-debug@npm:0.0.0-5580" +"@docusaurus/plugin-debug@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/plugin-debug@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/types": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/types": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 fs-extra: ^11.1.0 react-json-view: ^1.21.3 tslib: ^2.5.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: dc58659adab3c859daa2e0dfc0b5b588d490a4d2bb313dcfdc9e92d559d0c4145c686b001805ad44a1f2a0f55f87524637a34844a4438cfeec479a2c24ec1c4d + checksum: f42bc6e5139e9aff99eab24a506f74fd9b0ef3baecf46fadb0596ead8167d58c4ba92b86a9e665d00bedaccbfeb7c483c02ef4f1c5de49cc966e457e624c0b45 languageName: node linkType: hard -"@docusaurus/plugin-google-analytics@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/plugin-google-analytics@npm:0.0.0-5580" +"@docusaurus/plugin-google-analytics@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/plugin-google-analytics@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/types": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/types": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 tslib: ^2.5.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: f66a737a2b8b08648f28a279784e527fff34e2dba6f3022ec83b01a7f1781bfa0f208fac1db1fc919c1a01d405755c0816304cf4912e7b434b3924d5a968e6b0 + checksum: 7c8b9bdb182b0eff01d6f85eb01cc6ffeb3325cb0c154187230328484669f346fa998dfa25bc474f9b03551c6351a2da76f31d68f2c7ce742382d579a32e89e7 languageName: node linkType: hard -"@docusaurus/plugin-google-gtag@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/plugin-google-gtag@npm:0.0.0-5580" +"@docusaurus/plugin-google-gtag@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/plugin-google-gtag@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/types": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/types": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 "@types/gtag.js": ^0.0.12 tslib: ^2.5.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 6b05e7c2a8e4d757660acca1131a0e3abfd21c5544a31e93bd08ff9c75deb5f3b131ed0e47283bbc2f102e00947ab7a64ee4d5a53f300e98fc82ec13c4a6eda1 + checksum: 38daa81f7d499c819bf6221a9ba36d71e10f98f2c2e6b5adbcfcfbfc3f54e32df8315c98f381c9107f40ebe7aa9f7074dd16de6f925501f712dae73de3272133 languageName: node linkType: hard -"@docusaurus/plugin-google-tag-manager@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/plugin-google-tag-manager@npm:0.0.0-5580" +"@docusaurus/plugin-google-tag-manager@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/plugin-google-tag-manager@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/types": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/types": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 tslib: ^2.5.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 8904b150b2faa05dc49fd957ca8c392605e53073d031dfedb098be2abae924c3faf4f5e26ecfea91fe452695699801de9882a85a4371a1a35ca05fd57de232ae + checksum: afc7e93de44fbee69183e285fc429cc406c184e28a8b8f3f774ee33d88a1edf6c12449bf3ad731d36b475b3915b5692925bd2cb48127ab92402cde6ff4442584 languageName: node linkType: hard -"@docusaurus/plugin-sitemap@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/plugin-sitemap@npm:0.0.0-5580" +"@docusaurus/plugin-sitemap@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/plugin-sitemap@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/logger": 0.0.0-5580 - "@docusaurus/types": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 - "@docusaurus/utils-common": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/logger": 0.0.0-5591 + "@docusaurus/types": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 + "@docusaurus/utils-common": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 fs-extra: ^11.1.0 sitemap: ^7.1.1 tslib: ^2.5.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 4243cf4ed649d8e9a29b122ce23f1a6194cc5d7fc244e33326320315d8ff2756b18b9d85a0f0d49df33b2e68224c1b747e87ad5fa9944e7572bc761f641c5b77 + checksum: cf9b5397699e3f7ff4d3fef175dfdfa66820ffd40a4892991634423331d19849da8f0d78bc453b5e964ff25a9705d4ad1e9dd0dcdc27b8520c6108594c491fc1 languageName: node linkType: hard -"@docusaurus/preset-classic@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/preset-classic@npm:0.0.0-5580" +"@docusaurus/preset-classic@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/preset-classic@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/plugin-content-blog": 0.0.0-5580 - "@docusaurus/plugin-content-docs": 0.0.0-5580 - "@docusaurus/plugin-content-pages": 0.0.0-5580 - "@docusaurus/plugin-debug": 0.0.0-5580 - "@docusaurus/plugin-google-analytics": 0.0.0-5580 - "@docusaurus/plugin-google-gtag": 0.0.0-5580 - "@docusaurus/plugin-google-tag-manager": 0.0.0-5580 - "@docusaurus/plugin-sitemap": 0.0.0-5580 - "@docusaurus/theme-classic": 0.0.0-5580 - "@docusaurus/theme-common": 0.0.0-5580 - "@docusaurus/theme-search-algolia": 0.0.0-5580 - "@docusaurus/types": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/plugin-content-blog": 0.0.0-5591 + "@docusaurus/plugin-content-docs": 0.0.0-5591 + "@docusaurus/plugin-content-pages": 0.0.0-5591 + "@docusaurus/plugin-debug": 0.0.0-5591 + "@docusaurus/plugin-google-analytics": 0.0.0-5591 + "@docusaurus/plugin-google-gtag": 0.0.0-5591 + "@docusaurus/plugin-google-tag-manager": 0.0.0-5591 + "@docusaurus/plugin-sitemap": 0.0.0-5591 + "@docusaurus/theme-classic": 0.0.0-5591 + "@docusaurus/theme-common": 0.0.0-5591 + "@docusaurus/theme-search-algolia": 0.0.0-5591 + "@docusaurus/types": 0.0.0-5591 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 3aa48aea40e33c2c7adcad54918e117b1f1d917eba110889d85a273e82b4bbf0d73d9e5bb8c5aaadd846ec341981bbe701014cbd93ddf55c83245ce1bc4a56a6 + checksum: 3e613a95622482510f3fdad017ceabcdf0d25d82560af665b536803d4fb746cd4e849fbe02304f60099a3e09845003bb433bedeb1b3fcde13b93522e775350f1 languageName: node linkType: hard @@ -1993,22 +1993,22 @@ __metadata: languageName: node linkType: hard -"@docusaurus/theme-classic@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/theme-classic@npm:0.0.0-5580" +"@docusaurus/theme-classic@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/theme-classic@npm:0.0.0-5591" dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/mdx-loader": 0.0.0-5580 - "@docusaurus/module-type-aliases": 0.0.0-5580 - "@docusaurus/plugin-content-blog": 0.0.0-5580 - "@docusaurus/plugin-content-docs": 0.0.0-5580 - "@docusaurus/plugin-content-pages": 0.0.0-5580 - "@docusaurus/theme-common": 0.0.0-5580 - "@docusaurus/theme-translations": 0.0.0-5580 - "@docusaurus/types": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 - "@docusaurus/utils-common": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/mdx-loader": 0.0.0-5591 + "@docusaurus/module-type-aliases": 0.0.0-5591 + "@docusaurus/plugin-content-blog": 0.0.0-5591 + "@docusaurus/plugin-content-docs": 0.0.0-5591 + "@docusaurus/plugin-content-pages": 0.0.0-5591 + "@docusaurus/theme-common": 0.0.0-5591 + "@docusaurus/theme-translations": 0.0.0-5591 + "@docusaurus/types": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 + "@docusaurus/utils-common": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 "@mdx-js/react": ^2.1.5 clsx: ^1.2.1 copy-text-to-clipboard: ^3.0.1 @@ -2025,21 +2025,21 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 6a8f99d5143017d4754601fbf6487b697dc77945f730763917578abe0a1ef694607f888d824146aef86fdc2a620f0ddbd4925a23dcfc15b57d8338c1de73d526 + checksum: 1bcfdb13c932e02dbd292b9a3215fff039dbf317f0cedf3d88aa365e15d5a2653f23c3e284930d33263bc6bf2887578140affa752c146a2395acb75818db64bf languageName: node linkType: hard -"@docusaurus/theme-common@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/theme-common@npm:0.0.0-5580" +"@docusaurus/theme-common@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/theme-common@npm:0.0.0-5591" dependencies: - "@docusaurus/mdx-loader": 0.0.0-5580 - "@docusaurus/module-type-aliases": 0.0.0-5580 - "@docusaurus/plugin-content-blog": 0.0.0-5580 - "@docusaurus/plugin-content-docs": 0.0.0-5580 - "@docusaurus/plugin-content-pages": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 - "@docusaurus/utils-common": 0.0.0-5580 + "@docusaurus/mdx-loader": 0.0.0-5591 + "@docusaurus/module-type-aliases": 0.0.0-5591 + "@docusaurus/plugin-content-blog": 0.0.0-5591 + "@docusaurus/plugin-content-docs": 0.0.0-5591 + "@docusaurus/plugin-content-pages": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 + "@docusaurus/utils-common": 0.0.0-5591 "@types/history": ^4.7.11 "@types/react": "*" "@types/react-router-config": "*" @@ -2052,22 +2052,22 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 99524cb36a520568f63140734daaea8d56b35c0c8de3c36cb0102a93a0714f31a68aa5302607b9113a68e1b9fb7d73fd53ac80aa82ce48bf6f2d9e304ce21da2 + checksum: bd941e6eac23310748aa70a35c41ad6e9123ea93ed0b872d6beb3313df847827dc5490000cc443d83d31157841cbf4d58fc2f844c743b3cf2fe6ccc7d1507deb languageName: node linkType: hard -"@docusaurus/theme-search-algolia@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/theme-search-algolia@npm:0.0.0-5580" +"@docusaurus/theme-search-algolia@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/theme-search-algolia@npm:0.0.0-5591" dependencies: "@docsearch/react": ^3.3.3 - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/logger": 0.0.0-5580 - "@docusaurus/plugin-content-docs": 0.0.0-5580 - "@docusaurus/theme-common": 0.0.0-5580 - "@docusaurus/theme-translations": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 - "@docusaurus/utils-validation": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/logger": 0.0.0-5591 + "@docusaurus/plugin-content-docs": 0.0.0-5591 + "@docusaurus/theme-common": 0.0.0-5591 + "@docusaurus/theme-translations": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 + "@docusaurus/utils-validation": 0.0.0-5591 algoliasearch: ^4.15.0 algoliasearch-helper: ^3.12.0 clsx: ^1.2.1 @@ -2079,23 +2079,23 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: efc6054ad979b9fde43bec8befeb41c0f9ca609832b51e4da42fdcdfd7e4ee599fd3e6949c576d9ff348c0ffd044a4dbb07638a1990f57586f493ba394369c96 + checksum: 7493eb67c7ba056aee42880006cd0587d81e05f81177f93d6f57f43f9af12cd2c9e6bed7b804c19a66fa6f192c5b6ccbbf9e16f923a48abe6c6a6a72d65bd5c1 languageName: node linkType: hard -"@docusaurus/theme-translations@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/theme-translations@npm:0.0.0-5580" +"@docusaurus/theme-translations@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/theme-translations@npm:0.0.0-5591" dependencies: fs-extra: ^11.1.0 tslib: ^2.5.0 - checksum: 1555956d2a7cf3122ded374937559ab19e6a6620fd0910d6bdbf48be78a10e595cfd9a0b9157c129f36f0bfae4297f07991f071a394c87cb9d2facee04597dd2 + checksum: 6dd8647d1db2a97c77f3aa0d5f6935bad21df97f26d20d0a08916717335f50e72193c2bd7417043c9fb5fb4d9c19140f1408c854df5ef92ff6210bcc8e55f917 languageName: node linkType: hard -"@docusaurus/types@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/types@npm:0.0.0-5580" +"@docusaurus/types@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/types@npm:0.0.0-5591" dependencies: "@types/history": ^4.7.11 "@types/react": "*" @@ -2108,13 +2108,13 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 5df67f562c5d516eb020ecf63e6343e1d6d18e2716b1b530a24c5d63b48229623222861c1a69f0e4715c34a768f7c05599340f1af18ca1259709467fb1149af9 + checksum: 6ea7a688f7cef509e0f3b5ab2a9bb9fb0841ffd033d82438b989a70344655a7420b456f5172be9aa13740316212970e4d9d3bc355eb5fd4c9b27c635baeb149a languageName: node linkType: hard -"@docusaurus/utils-common@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/utils-common@npm:0.0.0-5580" +"@docusaurus/utils-common@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/utils-common@npm:0.0.0-5591" dependencies: tslib: ^2.5.0 peerDependencies: @@ -2122,28 +2122,28 @@ __metadata: peerDependenciesMeta: "@docusaurus/types": optional: true - checksum: 238b2f12607834164fa82f9a3154703b75609719888cf96f06c9f70c17ab76a46babcfd66dce4f2722ecaaf47742a40a606101f0578f2345845fa23b6f262b5d + checksum: 6c21dac13338854bfaebef0a98b1c76a95f29cc16ae6cd43fac0734dbc16cec0df058339af7ebb6ca3dc3cd2ad2a21f4bbff221c9cf7ae5012a88bfc4b28f4d9 languageName: node linkType: hard -"@docusaurus/utils-validation@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/utils-validation@npm:0.0.0-5580" +"@docusaurus/utils-validation@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/utils-validation@npm:0.0.0-5591" dependencies: - "@docusaurus/logger": 0.0.0-5580 - "@docusaurus/utils": 0.0.0-5580 + "@docusaurus/logger": 0.0.0-5591 + "@docusaurus/utils": 0.0.0-5591 joi: ^17.8.3 js-yaml: ^4.1.0 tslib: ^2.5.0 - checksum: cf0602b2411738adc47f5596fd4a3076137aa754aca24a4630700dc6355fed07e9a66ec093e438fa1199d9076bebae036317d073a604e4f0666f8390ceb73b5d + checksum: 987acdce5ae5ce4c5bd78258201809889209d7293b063eb38888637452c80ecff72d12d84a7ce7fc49f52d61ca2a79c61006f3562b4180e379a1777b9d76493a languageName: node linkType: hard -"@docusaurus/utils@npm:0.0.0-5580": - version: 0.0.0-5580 - resolution: "@docusaurus/utils@npm:0.0.0-5580" +"@docusaurus/utils@npm:0.0.0-5591": + version: 0.0.0-5591 + resolution: "@docusaurus/utils@npm:0.0.0-5591" dependencies: - "@docusaurus/logger": 0.0.0-5580 + "@docusaurus/logger": 0.0.0-5591 "@svgr/webpack": ^6.5.1 escape-string-regexp: ^4.0.0 file-loader: ^6.2.0 @@ -2164,7 +2164,7 @@ __metadata: peerDependenciesMeta: "@docusaurus/types": optional: true - checksum: c9b085d3724cba748b3db763f056742aace45cc58a636e23513ee6a7db781558377de5507b651b3566562fa71eebb42ac835034cdcbcc2c77edf9b4009c6a215 + checksum: 287d991f7a1924df744ed3a5c0d505a5b903b8bd43df39aac3c45fcc139639fb5b7827d12e4e00787126ad216006483723390141eb283ab733e4b6de819f5cd5 languageName: node linkType: hard @@ -2604,90 +2604,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-darwin-arm64@npm:1.3.59" +"@swc/core-darwin-arm64@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-darwin-arm64@npm:1.3.62" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-darwin-x64@npm:1.3.59" +"@swc/core-darwin-x64@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-darwin-x64@npm:1.3.62" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.59" +"@swc/core-linux-arm-gnueabihf@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.62" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.59" +"@swc/core-linux-arm64-gnu@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.62" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.59" +"@swc/core-linux-arm64-musl@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.62" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.59" +"@swc/core-linux-x64-gnu@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.62" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-x64-musl@npm:1.3.59" +"@swc/core-linux-x64-musl@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-x64-musl@npm:1.3.62" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.59" +"@swc/core-win32-arm64-msvc@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.62" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.59" +"@swc/core-win32-ia32-msvc@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.62" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.59" +"@swc/core-win32-x64-msvc@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.62" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.3.59 - resolution: "@swc/core@npm:1.3.59" + version: 1.3.62 + resolution: "@swc/core@npm:1.3.62" dependencies: - "@swc/core-darwin-arm64": 1.3.59 - "@swc/core-darwin-x64": 1.3.59 - "@swc/core-linux-arm-gnueabihf": 1.3.59 - "@swc/core-linux-arm64-gnu": 1.3.59 - "@swc/core-linux-arm64-musl": 1.3.59 - "@swc/core-linux-x64-gnu": 1.3.59 - "@swc/core-linux-x64-musl": 1.3.59 - "@swc/core-win32-arm64-msvc": 1.3.59 - "@swc/core-win32-ia32-msvc": 1.3.59 - "@swc/core-win32-x64-msvc": 1.3.59 + "@swc/core-darwin-arm64": 1.3.62 + "@swc/core-darwin-x64": 1.3.62 + "@swc/core-linux-arm-gnueabihf": 1.3.62 + "@swc/core-linux-arm64-gnu": 1.3.62 + "@swc/core-linux-arm64-musl": 1.3.62 + "@swc/core-linux-x64-gnu": 1.3.62 + "@swc/core-linux-x64-musl": 1.3.62 + "@swc/core-win32-arm64-msvc": 1.3.62 + "@swc/core-win32-ia32-msvc": 1.3.62 + "@swc/core-win32-x64-msvc": 1.3.62 peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -2714,7 +2714,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 0283f39cf49cd12a6dc7062ef9ea4fa93e1a4f622ce46903a09605219f4f47ed5ad03925c6146d09ffe6ee02a89bb14e3c82eb86b4c60ecce4985ea6e078ffcf + checksum: a7a0d9ffdb8a2b0050e0ff89fdb86fe189d9bcb7f91cb6847f1bfe3e2b520a87ea2e83692dfd80b6d541fb5addb2194769484516b8ca6d3c62ad80f1c79a9368 languageName: node linkType: hard @@ -2941,6 +2941,13 @@ __metadata: languageName: node linkType: hard +"@types/luxon@npm:^3.0.0": + version: 3.3.0 + resolution: "@types/luxon@npm:3.3.0" + checksum: f7e3a89fc3ca404fbc3ea538653ed6860bc28f570a8c4d6d24449b89b9b553b7d6ad6cc94a9e129c5b8c9a2b97f0c365b3017f811e59c4a859a9c219a1c918e0 + languageName: node + linkType: hard + "@types/mdast@npm:^3.0.0": version: 3.0.10 resolution: "@types/mdast@npm:3.0.10" @@ -3122,9 +3129,9 @@ __metadata: linkType: hard "@types/webpack-env@npm:^1.18.0": - version: 1.18.0 - resolution: "@types/webpack-env@npm:1.18.0" - checksum: ecf4daa31cb37d474ac0ce058d83a3cadeb9881ca8107ae93c2299eaa9954943aae09b43e143c62ccbe4288a14db00c918c9debd707afe17c3998f873eaabc59 + version: 1.18.1 + resolution: "@types/webpack-env@npm:1.18.1" + checksum: 3173c069763e51a96565d602af7e6dac9d772ae4aa6f26cac187cbf599a7f0b88f790b4b050b9dbdb0485daed3061b4a337863f3b8ce66f8a4e51f75ad387c6a languageName: node linkType: hard @@ -3745,17 +3752,19 @@ __metadata: version: 0.0.0-use.local resolution: "backstage-microsite@workspace:." dependencies: - "@docusaurus/core": 0.0.0-5580 - "@docusaurus/module-type-aliases": 0.0.0-5580 - "@docusaurus/plugin-client-redirects": 0.0.0-5580 - "@docusaurus/preset-classic": 0.0.0-5580 + "@docusaurus/core": 0.0.0-5591 + "@docusaurus/module-type-aliases": 0.0.0-5591 + "@docusaurus/plugin-client-redirects": 0.0.0-5591 + "@docusaurus/preset-classic": 0.0.0-5591 "@spotify/prettier-config": ^14.0.0 "@swc/core": ^1.3.46 "@tsconfig/docusaurus": ^1.0.6 + "@types/luxon": ^3.0.0 "@types/webpack-env": ^1.18.0 clsx: ^1.1.1 docusaurus-plugin-sass: ^0.2.3 js-yaml: ^4.1.0 + luxon: ^3.0.0 prettier: ^2.6.2 prism-react-renderer: ^1.3.5 react: ^17.0.2 @@ -7348,6 +7357,13 @@ __metadata: languageName: node linkType: hard +"luxon@npm:^3.0.0": + version: 3.3.0 + resolution: "luxon@npm:3.3.0" + checksum: 50cf17a0dc155c3dcacbeae8c0b7e80db425e0ba97b9cbdf12a7fc142d841ff1ab1560919f033af46240ed44e2f70c49f76e3422524c7fc8bb8d81ca47c66187 + languageName: node + linkType: hard + "make-dir@npm:^3.0.2": version: 3.1.0 resolution: "make-dir@npm:3.1.0" diff --git a/mkdocs.yml b/mkdocs.yml index 742b3e2ca6..8c29645840 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -66,12 +66,10 @@ nav: - Builtin Actions: 'features/software-templates/builtin-actions.md' - Writing Custom Actions: 'features/software-templates/writing-custom-actions.md' - Writing Custom Step Layouts: 'features/software-templates/writing-custom-step-layouts.md' - - Writing Templates (Legacy): 'features/software-templates/legacy.md' - - Migrating from v1alpha1 to v1beta2 templates: 'features/software-templates/migrating-from-v1alpha1-to-v1beta2.md' + - Migrating from v1beta2 to v1beta3 templates: 'features/software-templates/migrating-from-v1beta2-to-v1beta3.md' - Backstage Search: - Overview: 'features/search/README.md' - Getting Started: 'features/search/getting-started.md' - - Getting Started, configuring Backstage: 'features/search/configuration.md' - Concepts: 'features/search/concepts.md' - Search Architecture: 'features/search/architecture.md' - Search Engines: 'features/search/search-engines.md' @@ -98,8 +96,6 @@ nav: - Locations: 'integrations/azure/locations.md' - Discovery: 'integrations/azure/discovery.md' - Org Data: 'integrations/azure/org.md' - - Bitbucket: - - Discovery: 'integrations/bitbucket/discovery.md' - Bitbucket Cloud: - Locations: 'integrations/bitbucketCloud/locations.md' - Discovery: 'integrations/bitbucketCloud/discovery.md' @@ -209,7 +205,4 @@ nav: - ADR011 - Plugin Package Structure: 'architecture-decisions/adr011-plugin-package-structure.md' - ADR012 - Plugin Package Structure: 'architecture-decisions/adr012-use-luxon-locale-and-date-presets.md' - ADR013 - Plugin Package Structure: 'architecture-decisions/adr013-use-node-fetch.md' - - Support: - - Backstage Project Structure: 'support/project-structure.md' - - Glossary: glossary.md - FAQ: FAQ.md diff --git a/package.json b/package.json index 003d4e704e..2dcb3cf2ff 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.15.0-next.0", + "version": "1.15.0-next.1", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index d18d5e0006..ca76401e4e 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/app-defaults +## 1.4.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-permission-react@0.4.13-next.0 + ## 1.4.0-next.0 ### Minor Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 2d1e2b3746..26c0e8e382 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.4.0-next.0", + "version": "1.4.0-next.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index f087ae6da0..70eb793ab5 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,79 @@ # example-app +## 0.2.84-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.5.3-next.1 + - @backstage/plugin-user-settings@0.7.4-next.1 + - @backstage/plugin-pagerduty@0.5.12-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.0-next.0 + - @backstage/plugin-scaffolder-react@1.5.0-next.1 + - @backstage/plugin-adr@0.6.1-next.1 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/plugin-search@1.3.1-next.1 + - @backstage/plugin-techdocs@1.6.3-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-api-docs@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/plugin-devtools@0.1.1-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli@0.22.8-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-scaffolder@1.13.2-next.1 + - @internal/plugin-catalog-customized@0.0.11-next.1 + - @backstage/plugin-catalog-graph@0.2.31-next.1 + - @backstage/plugin-explore@0.4.4-next.1 + - @backstage/plugin-org@0.6.9-next.1 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/plugin-catalog-import@0.9.9-next.1 + - @backstage/plugin-github-actions@0.6.0-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.14-next.1 + - @backstage/plugin-azure-devops@0.3.1-next.1 + - @backstage/plugin-badges@0.2.43-next.1 + - @backstage/plugin-code-coverage@0.2.12-next.1 + - @backstage/plugin-entity-feedback@0.2.2-next.1 + - @backstage/plugin-gcalendar@0.3.15-next.1 + - @backstage/plugin-gocd@0.1.25-next.1 + - @backstage/plugin-jenkins@0.8.1-next.1 + - @backstage/plugin-kubernetes@0.9.2-next.1 + - @backstage/plugin-linguist@0.1.4-next.1 + - @backstage/plugin-microsoft-calendar@0.1.4-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.12-next.1 + - @backstage/plugin-playlist@0.1.10-next.1 + - @backstage/plugin-puppetdb@0.1.2-next.1 + - @backstage/plugin-stackstorm@0.1.3-next.1 + - @backstage/plugin-tech-insights@0.3.11-next.1 + - @backstage/plugin-todo@0.2.21-next.1 + - @backstage/plugin-stack-overflow@0.1.16-next.1 + - @backstage/app-defaults@1.4.0-next.1 + - @backstage/plugin-airbrake@0.3.19-next.1 + - @backstage/plugin-apache-airflow@0.2.12-next.1 + - @backstage/plugin-azure-sites@0.1.8-next.1 + - @backstage/plugin-circleci@0.3.19-next.1 + - @backstage/plugin-cloudbuild@0.3.19-next.1 + - @backstage/plugin-cost-insights@0.12.8-next.1 + - @backstage/plugin-dynatrace@6.0.0-next.1 + - @backstage/plugin-gcp-projects@0.3.38-next.1 + - @backstage/plugin-graphiql@0.2.51-next.1 + - @backstage/plugin-kafka@0.3.19-next.1 + - @backstage/plugin-lighthouse@0.4.4-next.1 + - @backstage/plugin-newrelic@0.3.37-next.1 + - @backstage/plugin-octopus-deploy@0.2.1-next.1 + - @backstage/plugin-rollbar@0.4.19-next.1 + - @backstage/plugin-sentry@0.5.4-next.1 + - @backstage/plugin-shortcuts@0.3.11-next.1 + - @backstage/plugin-tech-radar@0.6.5-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-permission-react@0.4.13-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.2.84-next.0 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 010b2dd648..7524f62bfa 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.84-next.0", + "version": "0.2.84-next.1", "private": true, "backstage": { "role": "frontend" @@ -15,6 +15,7 @@ "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/integration-react": "workspace:^", + "@backstage/plugin-adr": "workspace:^", "@backstage/plugin-airbrake": "workspace:^", "@backstage/plugin-apache-airflow": "workspace:^", "@backstage/plugin-api-docs": "workspace:^", @@ -25,6 +26,7 @@ "@backstage/plugin-catalog-graph": "workspace:^", "@backstage/plugin-catalog-import": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", + "@backstage/plugin-catalog-unprocessed-entities": "workspace:^", "@backstage/plugin-circleci": "workspace:^", "@backstage/plugin-cloudbuild": "workspace:^", "@backstage/plugin-code-coverage": "workspace:^", @@ -77,7 +79,7 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", - "@oriflame/backstage-plugin-score-card": "^0.6.0", + "@oriflame/backstage-plugin-score-card": "^0.7.0", "@roadiehq/backstage-plugin-buildkite": "^2.0.8", "@roadiehq/backstage-plugin-github-insights": "^2.0.5", "@roadiehq/backstage-plugin-github-pull-requests": "^2.2.7", diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index bc9eac8c64..df54f37dc6 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -111,6 +111,7 @@ import { StackstormPage } from '@backstage/plugin-stackstorm'; import { PuppetDbPage } from '@backstage/plugin-puppetdb'; import { DevToolsPage } from '@backstage/plugin-devtools'; import { customDevToolsPage } from './components/devtools/CustomDevToolsPage'; +import { CatalogUnprocessedEntitiesPage } from '@backstage/plugin-catalog-unprocessed-entities'; const app = createApp({ apis, @@ -142,6 +143,7 @@ const app = createApp({ bind(catalogPlugin.externalRoutes, { createComponent: scaffolderPlugin.routes.root, viewTechDoc: techdocsPlugin.routes.docRoot, + createFromTemplate: scaffolderPlugin.routes.selectedTemplate, }); bind(apiDocsPlugin.externalRoutes, { registerApi: catalogImportPlugin.routes.importPage, @@ -170,6 +172,10 @@ const routes = ( > {entityPage} + } + /> + + + + + diff --git a/packages/app/src/components/home/templates/CustomizableTemplate.stories.tsx b/packages/app/src/components/home/templates/CustomizableTemplate.stories.tsx new file mode 100644 index 0000000000..e587e52da4 --- /dev/null +++ b/packages/app/src/components/home/templates/CustomizableTemplate.stories.tsx @@ -0,0 +1,153 @@ +/* + * 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 { + HomePageStarredEntities, + HomePageRandomJoke, + CustomHomepageGrid, +} from '@backstage/plugin-home'; +import { + starredEntitiesApiRef, + MockStarredEntitiesApi, + entityRouteRef, + catalogApiRef, +} from '@backstage/plugin-catalog-react'; +import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { configApiRef } from '@backstage/core-plugin-api'; +import { ConfigReader } from '@backstage/config'; +import { searchApiRef } from '@backstage/plugin-search-react'; +import { HomePageSearchBar, searchPlugin } from '@backstage/plugin-search'; +import { HomePageCalendar } from '@backstage/plugin-gcalendar'; +import { MicrosoftCalendarCard } from '@backstage/plugin-microsoft-calendar'; +import React, { ComponentType } from 'react'; + +const entities = [ + { + apiVersion: '1', + kind: 'Component', + metadata: { + name: 'mock-starred-entity', + title: 'Mock Starred Entity!', + }, + }, + { + apiVersion: '1', + kind: 'Component', + metadata: { + name: 'mock-starred-entity-2', + title: 'Mock Starred Entity 2!', + }, + }, + { + apiVersion: '1', + kind: 'Component', + metadata: { + name: 'mock-starred-entity-3', + title: 'Mock Starred Entity 3!', + }, + }, + { + apiVersion: '1', + kind: 'Component', + metadata: { + name: 'mock-starred-entity-4', + title: 'Mock Starred Entity 4!', + }, + }, +]; + +const mockCatalogApi = { + getEntities: async () => ({ items: entities }), +}; + +const starredEntitiesApi = new MockStarredEntitiesApi(); +starredEntitiesApi.toggleStarred('component:default/example-starred-entity'); +starredEntitiesApi.toggleStarred('component:default/example-starred-entity-2'); +starredEntitiesApi.toggleStarred('component:default/example-starred-entity-3'); +starredEntitiesApi.toggleStarred('component:default/example-starred-entity-4'); + +export default { + title: 'Plugins/Home/Templates', + decorators: [ + (Story: ComponentType<{}>) => + wrapInTestApp( + <> + Promise.resolve({ results: [] }) }], + [ + configApiRef, + new ConfigReader({ + backend: { + baseUrl: 'https://localhost:7007', + }, + }), + ], + ]} + > + + + , + { + mountedRoutes: { + '/hello-company': searchPlugin.routes.root, + '/catalog/:namespace/:kind/:name': entityRouteRef, + }, + }, + ), + ], +}; +export const CustomizableTemplate = () => { + // This is the default configuration that is shown to the user + // when first arriving to the homepage. + const defaultConfig = [ + { + component: 'HomePageSearchBar', + x: 0, + y: 0, + width: 12, + height: 5, + }, + { + component: 'HomePageRandomJoke', + x: 0, + y: 2, + width: 6, + height: 16, + }, + { + component: 'HomePageStarredEntities', + x: 6, + y: 2, + width: 6, + height: 12, + }, + ]; + + return ( + + // Insert the allowed widgets inside the grid. User can add, organize and + // remove the widgets as they want. + + + + + + + ); +}; diff --git a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx index 9cf2e8ab35..05d9a4eecd 100644 --- a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx +++ b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx @@ -38,7 +38,7 @@ import { } from '@backstage/plugin-search-react'; import { stackOverflowApiRef, HomePageStackOverflowQuestions } from '@backstage/plugin-stack-overflow'; import { Grid, makeStyles } from '@material-ui/core'; -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; const entities = [ { @@ -107,7 +107,7 @@ starredEntitiesApi.toggleStarred('component:default/example-starred-entity-4'); export default { title: 'Plugins/Home/Templates', decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp( <> ({ - searchBar: { - display: 'flex', + searchBarInput: { maxWidth: '60vw', - backgroundColor: theme.palette.background.paper, - boxShadow: theme.shadows[1], - padding: '8px 0', - borderRadius: '50px', margin: 'auto', + backgroundColor: theme.palette.background.paper, + borderRadius: '50px', + boxShadow: theme.shadows[1], }, + searchBarOutline: { + borderStyle: 'none' + } })); const useLogoStyles = makeStyles(theme => ({ @@ -177,9 +178,9 @@ export const DefaultTemplate = () => { className={container} logo={} /> - + diff --git a/packages/app/src/components/search/SearchPage.tsx b/packages/app/src/components/search/SearchPage.tsx index ecae90a06a..2e577e6589 100644 --- a/packages/app/src/components/search/SearchPage.tsx +++ b/packages/app/src/components/search/SearchPage.tsx @@ -28,6 +28,7 @@ import { catalogApiRef, CATALOG_FILTER_EXISTS, } from '@backstage/plugin-catalog-react'; +import { AdrSearchResultListItem } from '@backstage/plugin-adr'; import { SearchType } from '@backstage/plugin-search'; import { SearchBar, @@ -86,6 +87,11 @@ const SearchPage = () => { name: 'Documentation', icon: , }, + { + value: 'adr', + name: 'Architecture Decision Records', + icon: , + }, ]} /> @@ -131,6 +137,7 @@ const SearchPage = () => { } /> } /> } /> + } /> diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 3a6eadf23b..275161942d 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/backend-app-api +## 0.4.4-next.1 + +### Patch Changes + +- 3bb4158a8aa4: Switched startup strategy to initialize all plugins in parallel, as well as hook into the new startup lifecycle hooks. +- 2c9f67e6f166: Introduced built-in middleware into the default `HttpService` implementation that throws a `ServiceNotAvailable` error when plugins aren't able to serve request. Also introduced a request stalling mechanism that pauses incoming request until plugins have been fully initialized. +- c4e8fefd9f13: Added handling of `ServiceUnavailableError` to error handling middleware. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.4.4-next.0 ### Patch Changes diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 27b218ecb3..5f452f9e03 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -18,6 +18,7 @@ import { Handler } from 'express'; import { HelmetOptions } from 'helmet'; import * as http from 'http'; import { HttpRouterService } from '@backstage/backend-plugin-api'; +import { HumanDuration } from '@backstage/types'; import { IdentityService } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { LifecycleService } from '@backstage/backend-plugin-api'; @@ -78,6 +79,11 @@ export function createHttpServer( }, ): Promise; +// @public +export function createLifecycleMiddleware( + options: LifecycleMiddlewareOptions, +): RequestHandler; + // @public (undocumented) export function createSpecializedBackend( options: CreateSpecializedBackendOptions, @@ -170,6 +176,13 @@ export const identityServiceFactory: ( options?: IdentityFactoryOptions | undefined, ) => ServiceFactory; +// @public +export interface LifecycleMiddlewareOptions { + // (undocumented) + lifecycle: LifecycleService; + startupRequestPauseTimeout?: HumanDuration; +} + // @public export const lifecycleServiceFactory: () => ServiceFactory< LifecycleService, diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 679c9fa9ca..903249f164 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.4-next.0", + "version": "0.4.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-app-api/src/http/MiddlewareFactory.test.ts b/packages/backend-app-api/src/http/MiddlewareFactory.test.ts index 64812564ca..5dbb63ec59 100644 --- a/packages/backend-app-api/src/http/MiddlewareFactory.test.ts +++ b/packages/backend-app-api/src/http/MiddlewareFactory.test.ts @@ -21,6 +21,7 @@ import { NotAllowedError, NotFoundError, NotModifiedError, + ServiceUnavailableError, } from '@backstage/errors'; import express from 'express'; import createError from 'http-errors'; @@ -143,6 +144,9 @@ describe('MiddlewareFactory', () => { app.use('/ConflictError', () => { throw new ConflictError(); }); + app.use('/ServiceUnavailableError', () => { + throw new ServiceUnavailableError(); + }); app.use(middleware.error()); const r = request(app); @@ -165,6 +169,10 @@ describe('MiddlewareFactory', () => { expect((await r.get('/ConflictError')).body.error.name).toBe( 'ConflictError', ); + expect((await r.get('/ServiceUnavailableError')).status).toBe(503); + expect((await r.get('/ServiceUnavailableError')).body.error.name).toBe( + 'ServiceUnavailableError', + ); }); it('logs all 500 errors', async () => { diff --git a/packages/backend-app-api/src/http/MiddlewareFactory.ts b/packages/backend-app-api/src/http/MiddlewareFactory.ts index 833bdba540..774e784d1d 100644 --- a/packages/backend-app-api/src/http/MiddlewareFactory.ts +++ b/packages/backend-app-api/src/http/MiddlewareFactory.ts @@ -36,6 +36,7 @@ import { NotAllowedError, NotFoundError, NotModifiedError, + ServiceUnavailableError, serializeError, } from '@backstage/errors'; import { NotImplementedError } from '@backstage/errors'; @@ -260,6 +261,8 @@ function getStatusCode(error: Error): number { return 409; case NotImplementedError.name: return 501; + case ServiceUnavailableError.name: + return 503; default: break; } diff --git a/packages/backend-app-api/src/services/implementations/httpRouter/createLifecycleMiddleware.test.ts b/packages/backend-app-api/src/services/implementations/httpRouter/createLifecycleMiddleware.test.ts new file mode 100644 index 0000000000..31eecf14bb --- /dev/null +++ b/packages/backend-app-api/src/services/implementations/httpRouter/createLifecycleMiddleware.test.ts @@ -0,0 +1,81 @@ +/* + * Copyright 2022 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 { createLifecycleMiddleware } from './createLifecycleMiddleware'; +import { BackendLifecycleImpl } from '../rootLifecycle/rootLifecycleServiceFactory'; +import { mockServices } from '@backstage/backend-test-utils'; +import { ServiceUnavailableError } from '@backstage/errors'; + +describe('createLifecycleMiddleware', () => { + it('should pause requests when plugin is not ready', async () => { + const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); + + const middleware = createLifecycleMiddleware({ lifecycle }); + + const next = jest.fn(); + middleware({} as any, {} as any, next); + expect(next).not.toHaveBeenCalled(); + await lifecycle.startup(); + + // pending call + expect(next).toHaveBeenCalledWith(); + + // new call + const next2 = jest.fn(); + middleware({} as any, {} as any, next2); + expect(next2).toHaveBeenCalledWith(); + }); + + it('should throw ServiceUnavailableError after shutdown', async () => { + const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); + const middleware = createLifecycleMiddleware({ lifecycle }); + + const next = jest.fn(); + middleware({} as any, {} as any, next); + expect(next).not.toHaveBeenCalled(); + await lifecycle.shutdown(); + + // pending call + expect(next).toHaveBeenCalledWith( + new ServiceUnavailableError('Service is shutting down'), + ); + + // new call + const next2 = jest.fn(); + middleware({} as any, {} as any, next2); + expect(next2).toHaveBeenCalledWith( + new ServiceUnavailableError('Service is shutting down'), + ); + }); + + it('should throw ServiceUnavailableError after timeout', async () => { + const lifecycle = new BackendLifecycleImpl(mockServices.rootLogger()); + const middleware = createLifecycleMiddleware({ + lifecycle, + startupRequestPauseTimeout: { milliseconds: 1 }, + }); + + const next = jest.fn(); + middleware({} as any, {} as any, next); + expect(next).not.toHaveBeenCalled(); + + await new Promise(r => setTimeout(r, 2)); + + expect(next).toHaveBeenCalledWith( + new ServiceUnavailableError('Service has not started up yet'), + ); + }); +}); diff --git a/packages/backend-app-api/src/services/implementations/httpRouter/createLifecycleMiddleware.ts b/packages/backend-app-api/src/services/implementations/httpRouter/createLifecycleMiddleware.ts new file mode 100644 index 0000000000..958ae33e99 --- /dev/null +++ b/packages/backend-app-api/src/services/implementations/httpRouter/createLifecycleMiddleware.ts @@ -0,0 +1,127 @@ +/* + * Copyright 2022 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 { LifecycleService } from '@backstage/backend-plugin-api'; +import { ServiceUnavailableError } from '@backstage/errors'; +import { HumanDuration } from '@backstage/types'; +import { RequestHandler } from 'express'; + +export const DEFAULT_TIMEOUT = { seconds: 5 }; + +function durationToMs(duration: HumanDuration): number { + const { + years = 0, + months = 0, + weeks = 0, + days = 0, + hours = 0, + minutes = 0, + seconds = 0, + milliseconds = 0, + } = duration; + + const totalDays = years * 365 + months * 30 + weeks * 7 + days; + const totalHours = totalDays * 24 + hours; + const totalMinutes = totalHours * 60 + minutes; + const totalSeconds = totalMinutes * 60 + seconds; + const totalMilliseconds = totalSeconds * 1000 + milliseconds; + + return totalMilliseconds; +} + +/** + * Options for {@link createLifecycleMiddleware}. + * @public + */ +export interface LifecycleMiddlewareOptions { + lifecycle: LifecycleService; + /** + * The maximum time that paused requests will wait for the service to start, before returning an error. + * + * Defaults to 5 seconds. + */ + startupRequestPauseTimeout?: HumanDuration; +} + +/** + * Creates a middleware that pauses requests until the service has started. + * + * @remarks + * + * Requests that arrive before the service has started will be paused until startup is complete. + * If the service does not start within the provided timeout, the request will be rejected with a + * {@link @backstage/errors#ServiceUnavailableError}. + * + * If the service is shutting down, all requests will be rejected with a + * {@link @backstage/errors#ServiceUnavailableError}. + * + * @public + */ +export function createLifecycleMiddleware( + options: LifecycleMiddlewareOptions, +): RequestHandler { + const { lifecycle, startupRequestPauseTimeout = DEFAULT_TIMEOUT } = options; + + let state: 'init' | 'up' | 'down' = 'init'; + const waiting = new Set<{ + next: (err?: Error) => void; + timeout: NodeJS.Timeout; + }>(); + + lifecycle.addStartupHook(async () => { + if (state === 'init') { + state = 'up'; + for (const item of waiting) { + clearTimeout(item.timeout); + item.next(); + } + waiting.clear(); + } + }); + + lifecycle.addShutdownHook(async () => { + state = 'down'; + + for (const item of waiting) { + clearTimeout(item.timeout); + item.next(new ServiceUnavailableError('Service is shutting down')); + } + waiting.clear(); + }); + + const timeoutMs = durationToMs(startupRequestPauseTimeout); + + return (_req, _res, next) => { + if (state === 'up') { + next(); + return; + } else if (state === 'down') { + next(new ServiceUnavailableError('Service is shutting down')); + return; + } + + const item = { + next, + timeout: setTimeout(() => { + if (waiting.delete(item)) { + next(new ServiceUnavailableError('Service has not started up yet')); + } + }, timeoutMs), + }; + + waiting.add(item); + }; +} diff --git a/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts b/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts index e52b4c9a36..d0b40df33b 100644 --- a/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts +++ b/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts @@ -26,24 +26,32 @@ describe('httpRouterFactory', () => { { rootHttpRouter, plugin: { getId: () => 'test1' }, + lifecycle: { addStartupHook() {}, addShutdownHook() {} }, }, undefined, ); router1.use(handler1); expect(rootHttpRouter.use).toHaveBeenCalledTimes(1); - expect(rootHttpRouter.use).toHaveBeenCalledWith('/api/test1', handler1); + expect(rootHttpRouter.use).toHaveBeenCalledWith( + '/api/test1', + expect.any(Function), + ); const handler2 = () => {}; const router2 = await factory.factory( { rootHttpRouter, plugin: { getId: () => 'test2' }, + lifecycle: { addStartupHook() {}, addShutdownHook() {} }, }, undefined, ); router2.use(handler2); expect(rootHttpRouter.use).toHaveBeenCalledTimes(2); - expect(rootHttpRouter.use).toHaveBeenCalledWith('/api/test2', handler2); + expect(rootHttpRouter.use).toHaveBeenCalledWith( + '/api/test2', + expect.any(Function), + ); }); it('should use custom path generator', async () => { @@ -57,6 +65,7 @@ describe('httpRouterFactory', () => { { rootHttpRouter, plugin: { getId: () => 'test1' }, + lifecycle: { addStartupHook() {}, addShutdownHook() {} }, }, undefined, ); @@ -64,7 +73,7 @@ describe('httpRouterFactory', () => { expect(rootHttpRouter.use).toHaveBeenCalledTimes(1); expect(rootHttpRouter.use).toHaveBeenCalledWith( '/some/test1/path', - handler1, + expect.any(Function), ); const handler2 = () => {}; @@ -72,6 +81,7 @@ describe('httpRouterFactory', () => { { rootHttpRouter, plugin: { getId: () => 'test2' }, + lifecycle: { addStartupHook() {}, addShutdownHook() {} }, }, undefined, ); @@ -79,7 +89,7 @@ describe('httpRouterFactory', () => { expect(rootHttpRouter.use).toHaveBeenCalledTimes(2); expect(rootHttpRouter.use).toHaveBeenCalledWith( '/some/test2/path', - handler2, + expect.any(Function), ); }); }); diff --git a/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.ts b/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.ts index bbd54b7ade..2ecdeffd77 100644 --- a/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.ts @@ -15,10 +15,12 @@ */ import { - createServiceFactory, coreServices, + createServiceFactory, } from '@backstage/backend-plugin-api'; import { Handler } from 'express'; +import PromiseRouter from 'express-promise-router'; +import { createLifecycleMiddleware } from './createLifecycleMiddleware'; /** * @public @@ -36,14 +38,21 @@ export const httpRouterServiceFactory = createServiceFactory( service: coreServices.httpRouter, deps: { plugin: coreServices.pluginMetadata, + lifecycle: coreServices.lifecycle, rootHttpRouter: coreServices.rootHttpRouter, }, - async factory({ plugin, rootHttpRouter }) { + async factory({ plugin, rootHttpRouter, lifecycle }) { const getPath = options?.getPath ?? (id => `/api/${id}`); const path = getPath(plugin.getId()); + + const router = PromiseRouter(); + rootHttpRouter.use(path, router); + + router.use(createLifecycleMiddleware({ lifecycle })); + return { use(handler: Handler) { - rootHttpRouter.use(path, handler); + router.use(handler); }, }; }, diff --git a/packages/backend-app-api/src/services/implementations/httpRouter/index.ts b/packages/backend-app-api/src/services/implementations/httpRouter/index.ts index 9dfb01c5be..928a232131 100644 --- a/packages/backend-app-api/src/services/implementations/httpRouter/index.ts +++ b/packages/backend-app-api/src/services/implementations/httpRouter/index.ts @@ -16,3 +16,5 @@ export { httpRouterServiceFactory } from './httpRouterServiceFactory'; export type { HttpRouterFactoryOptions } from './httpRouterServiceFactory'; +export { createLifecycleMiddleware } from './createLifecycleMiddleware'; +export type { LifecycleMiddlewareOptions } from './createLifecycleMiddleware'; diff --git a/packages/backend-app-api/src/services/implementations/lifecycle/lifecycleServiceFactory.ts b/packages/backend-app-api/src/services/implementations/lifecycle/lifecycleServiceFactory.ts index 79658c0d42..2b68a81807 100644 --- a/packages/backend-app-api/src/services/implementations/lifecycle/lifecycleServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/lifecycle/lifecycleServiceFactory.ts @@ -14,12 +14,75 @@ * limitations under the License. */ import { - createServiceFactory, - coreServices, + LifecycleService, LifecycleServiceShutdownHook, LifecycleServiceShutdownOptions, + LifecycleServiceStartupHook, + LifecycleServiceStartupOptions, + LoggerService, + PluginMetadataService, + RootLifecycleService, + coreServices, + createServiceFactory, } from '@backstage/backend-plugin-api'; +/** @internal */ +export class BackendPluginLifecycleImpl implements LifecycleService { + constructor( + private readonly logger: LoggerService, + private readonly rootLifecycle: RootLifecycleService, + private readonly pluginMetadata: PluginMetadataService, + ) {} + + #hasStarted = false; + #startupTasks: Array<{ + hook: LifecycleServiceStartupHook; + options?: LifecycleServiceStartupOptions; + }> = []; + + addStartupHook( + hook: LifecycleServiceStartupHook, + options?: LifecycleServiceStartupOptions, + ): void { + if (this.#hasStarted) { + throw new Error('Attempted to add startup hook after startup'); + } + this.#startupTasks.push({ hook, options }); + } + + async startup(): Promise { + if (this.#hasStarted) { + return; + } + this.#hasStarted = true; + + this.logger.debug( + `Running ${this.#startupTasks.length} plugin startup tasks...`, + ); + await Promise.all( + this.#startupTasks.map(async ({ hook, options }) => { + const logger = options?.logger ?? this.logger; + try { + await hook(); + logger.debug(`Plugin startup hook succeeded`); + } catch (error) { + logger.error(`Plugin startup hook failed, ${error}`); + } + }), + ); + } + + addShutdownHook( + hook: LifecycleServiceShutdownHook, + options?: LifecycleServiceShutdownOptions, + ): void { + const plugin = this.pluginMetadata.getId(); + this.rootLifecycle.addShutdownHook(hook, { + logger: options?.logger?.child({ plugin }) ?? this.logger, + }); + } +} + /** * Allows plugins to register shutdown hooks that are run when the process is about to exit. * @public @@ -32,16 +95,10 @@ export const lifecycleServiceFactory = createServiceFactory({ pluginMetadata: coreServices.pluginMetadata, }, async factory({ rootLifecycle, logger, pluginMetadata }) { - const plugin = pluginMetadata.getId(); - return { - addShutdownHook( - hook: LifecycleServiceShutdownHook, - options?: LifecycleServiceShutdownOptions, - ): void { - rootLifecycle.addShutdownHook(hook, { - logger: options?.logger?.child({ plugin }) ?? logger, - }); - }, - }; + return new BackendPluginLifecycleImpl( + logger, + rootLifecycle, + pluginMetadata, + ); }, }); diff --git a/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.test.ts b/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.test.ts index 8d2b2af3d5..91cb9031ae 100644 --- a/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.test.ts +++ b/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.test.ts @@ -44,4 +44,17 @@ describe('lifecycleService', () => { }); await expect(service.shutdown()).resolves.toBeUndefined(); }); + + it('should reject hooks after trigger', async () => { + const service = new BackendLifecycleImpl(getVoidLogger()); + await service.startup(); + expect(() => { + service.addStartupHook(() => {}); + }).toThrow('Attempted to add startup hook after startup'); + + await service.shutdown(); + expect(() => { + service.addShutdownHook(() => {}); + }).toThrow('Attempted to add shutdown hook after shutdown'); + }); }); diff --git a/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.ts b/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.ts index f379c2ec52..197f99b97a 100644 --- a/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.ts @@ -17,16 +17,55 @@ import { createServiceFactory, coreServices, + LifecycleServiceStartupHook, + LifecycleServiceStartupOptions, LifecycleServiceShutdownHook, LifecycleServiceShutdownOptions, RootLifecycleService, LoggerService, } from '@backstage/backend-plugin-api'; +/** @internal */ export class BackendLifecycleImpl implements RootLifecycleService { constructor(private readonly logger: LoggerService) {} - #isCalled = false; + #hasStarted = false; + #startupTasks: Array<{ + hook: LifecycleServiceStartupHook; + options?: LifecycleServiceStartupOptions; + }> = []; + + addStartupHook( + hook: LifecycleServiceStartupHook, + options?: LifecycleServiceStartupOptions, + ): void { + if (this.#hasStarted) { + throw new Error('Attempted to add startup hook after startup'); + } + this.#startupTasks.push({ hook, options }); + } + + async startup(): Promise { + if (this.#hasStarted) { + return; + } + this.#hasStarted = true; + + this.logger.debug(`Running ${this.#startupTasks.length} startup tasks...`); + await Promise.all( + this.#startupTasks.map(async ({ hook, options }) => { + const logger = options?.logger ?? this.logger; + try { + await hook(); + logger.debug(`Startup hook succeeded`); + } catch (error) { + logger.error(`Startup hook failed, ${error}`); + } + }), + ); + } + + #hasShutdown = false; #shutdownTasks: Array<{ hook: LifecycleServiceShutdownHook; options?: LifecycleServiceShutdownOptions; @@ -36,22 +75,27 @@ export class BackendLifecycleImpl implements RootLifecycleService { hook: LifecycleServiceShutdownHook, options?: LifecycleServiceShutdownOptions, ): void { + if (this.#hasShutdown) { + throw new Error('Attempted to add shutdown hook after shutdown'); + } this.#shutdownTasks.push({ hook, options }); } async shutdown(): Promise { - if (this.#isCalled) { + if (this.#hasShutdown) { return; } - this.#isCalled = true; + this.#hasShutdown = true; - this.logger.info(`Running ${this.#shutdownTasks.length} shutdown tasks...`); + this.logger.debug( + `Running ${this.#shutdownTasks.length} shutdown tasks...`, + ); await Promise.all( this.#shutdownTasks.map(async ({ hook, options }) => { const logger = options?.logger ?? this.logger; try { await hook(); - logger.info(`Shutdown hook succeeded`); + logger.debug(`Shutdown hook succeeded`); } catch (error) { logger.error(`Shutdown hook failed, ${error}`); } diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index c00969a52c..b05194f594 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -17,9 +17,13 @@ import { createServiceRef, createServiceFactory, + coreServices, + createBackendPlugin, + createBackendModule, } from '@backstage/backend-plugin-api'; import { BackendInitializer } from './BackendInitializer'; import { ServiceRegistry } from './ServiceRegistry'; +import { rootLifecycleServiceFactory } from '../services/implementations'; const rootRef = createServiceRef<{ x: number }>({ id: '1', @@ -30,6 +34,16 @@ const pluginRef = createServiceRef<{ x: number }>({ id: '2', }); +class MockLogger { + debug() {} + info() {} + warn() {} + error() {} + child() { + return this; + } +} + describe('BackendInitializer', () => { it('should initialize root scoped services', async () => { const rootFactory = jest.fn(); @@ -46,6 +60,12 @@ describe('BackendInitializer', () => { deps: {}, factory: pluginFactory, })(), + rootLifecycleServiceFactory(), + createServiceFactory({ + service: coreServices.rootLogger, + deps: {}, + factory: () => new MockLogger(), + })(), ]); const init = new BackendInitializer(registry); @@ -54,4 +74,105 @@ describe('BackendInitializer', () => { expect(rootFactory).toHaveBeenCalled(); expect(pluginFactory).not.toHaveBeenCalled(); }); + + it('should forward errors when plugins fail to start', async () => { + const init = new BackendInitializer(new ServiceRegistry([])); + init.add( + createBackendPlugin({ + pluginId: 'test', + register(reg) { + reg.registerInit({ + deps: {}, + async init() { + throw new Error('NOPE'); + }, + }); + }, + })(), + ); + await expect(init.start()).rejects.toThrow( + "Plugin 'test' startup failed; caused by Error: NOPE", + ); + }); + + it('should forward errors when modules fail to start', async () => { + const init = new BackendInitializer(new ServiceRegistry([])); + init.add( + createBackendModule({ + pluginId: 'test', + moduleId: 'mod', + register(reg) { + reg.registerInit({ + deps: {}, + async init() { + throw new Error('NOPE'); + }, + }); + }, + })(), + ); + await expect(init.start()).rejects.toThrow( + "Module 'mod' for plugin 'test' startup failed; caused by Error: NOPE", + ); + }); + + it('should reject duplicate plugins', async () => { + const init = new BackendInitializer(new ServiceRegistry([])); + init.add( + createBackendPlugin({ + pluginId: 'test', + register(reg) { + reg.registerInit({ + deps: {}, + async init() {}, + }); + }, + })(), + ); + init.add( + createBackendPlugin({ + pluginId: 'test', + register(reg) { + reg.registerInit({ + deps: {}, + async init() {}, + }); + }, + })(), + ); + await expect(init.start()).rejects.toThrow( + "Plugin 'test' is already registered", + ); + }); + + it('should reject duplicate modules', async () => { + const init = new BackendInitializer(new ServiceRegistry([])); + init.add( + createBackendModule({ + pluginId: 'test', + moduleId: 'mod', + register(reg) { + reg.registerInit({ + deps: {}, + async init() {}, + }); + }, + })(), + ); + init.add( + createBackendModule({ + pluginId: 'test', + moduleId: 'mod', + register(reg) { + reg.registerInit({ + deps: {}, + async init() {}, + }); + }, + })(), + ); + await expect(init.start()).rejects.toThrow( + "Module 'mod' for plugin 'test' is already registered", + ); + }); }); diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index b2c62c2122..8c2b75e887 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -21,19 +21,25 @@ import { ServiceRef, } from '@backstage/backend-plugin-api'; import { BackendLifecycleImpl } from '../services/implementations/rootLifecycle/rootLifecycleServiceFactory'; -import { - BackendRegisterInit, - EnumerableServiceHolder, - ServiceOrExtensionPoint, -} from './types'; +import { BackendPluginLifecycleImpl } from '../services/implementations/lifecycle/lifecycleServiceFactory'; +import { EnumerableServiceHolder, ServiceOrExtensionPoint } from './types'; // Direct internal import to avoid duplication // eslint-disable-next-line @backstage/no-forbidden-package-imports import { InternalBackendFeature } from '@backstage/backend-plugin-api/src/wiring/types'; +import { ForwardedError } from '@backstage/errors'; + +export interface BackendRegisterInit { + consumes: Set; + provides: Set; + init: { + deps: { [name: string]: ServiceOrExtensionPoint }; + func: (deps: { [name: string]: unknown }) => Promise; + }; +} export class BackendInitializer { #startPromise?: Promise; #features = new Array(); - #registerInits = new Array(); #extensionPoints = new Map, unknown>(); #serviceHolder: EnumerableServiceHolder; @@ -130,7 +136,10 @@ export class BackendInitializer { } } - // Initialize all features + const pluginInits = new Map(); + const moduleInits = new Map>(); + + // Enumerate all features for (const feature of this.#features) { for (const r of feature.getRegistrations()) { const provides = new Set>(); @@ -147,24 +156,84 @@ export class BackendInitializer { } } - this.#registerInits.push({ - id: r.type === 'plugin' ? r.pluginId : `${r.pluginId}.${r.moduleId}`, - provides, - consumes: new Set(Object.values(r.init.deps)), - init: r.init, - }); + if (r.type === 'plugin') { + if (pluginInits.has(r.pluginId)) { + throw new Error(`Plugin '${r.pluginId}' is already registered`); + } + pluginInits.set(r.pluginId, { + provides, + consumes: new Set(Object.values(r.init.deps)), + init: r.init, + }); + } else { + let modules = moduleInits.get(r.pluginId); + if (!modules) { + modules = new Map(); + moduleInits.set(r.pluginId, modules); + } + if (modules.has(r.moduleId)) { + throw new Error( + `Module '${r.moduleId}' for plugin '${r.pluginId}' is already registered`, + ); + } + modules.set(r.moduleId, { + provides, + consumes: new Set(Object.values(r.init.deps)), + init: r.init, + }); + } } } - const orderedRegisterResults = this.#resolveInitOrder(this.#registerInits); + const allPluginIds = [ + ...new Set([...pluginInits.keys(), ...moduleInits.keys()]), + ]; - for (const registerInit of orderedRegisterResults) { - const deps = await this.#getInitDeps( - registerInit.init.deps, - registerInit.id, - ); - await registerInit.init.func(deps); - } + // All plugins are initialized in parallel + await Promise.all( + allPluginIds.map(async pluginId => { + // Modules are initialized before plugins, so that they can provide extension to the plugin + const modules = moduleInits.get(pluginId) ?? []; + await Promise.all( + Array.from(modules).map(async ([moduleId, moduleInit]) => { + const moduleDeps = await this.#getInitDeps( + moduleInit.init.deps, + pluginId, + ); + await moduleInit.init.func(moduleDeps).catch(error => { + throw new ForwardedError( + `Module '${moduleId}' for plugin '${pluginId}' startup failed`, + error, + ); + }); + }), + ); + + // Once all modules have been initialized, we can initialize the plugin itself + const pluginInit = pluginInits.get(pluginId); + // We allow modules to be installed without the accompanying plugin, so the plugin may not exist + if (pluginInit) { + const pluginDeps = await this.#getInitDeps( + pluginInit.init.deps, + pluginId, + ); + await pluginInit.init.func(pluginDeps).catch(error => { + throw new ForwardedError( + `Plugin '${pluginId}' startup failed`, + error, + ); + }); + } + + // Once the plugin and all modules have been initialized, we can signal that the plugin has stared up successfully + const lifecycleService = await this.#getPluginLifecycleImpl(pluginId); + await lifecycleService.startup(); + }), + ); + + // Once all plugins and modules have been initialized, we can signal that the backend has started up successfully + const lifecycleService = await this.#getRootLifecycleImpl(); + await lifecycleService.startup(); // Once the backend is started, any uncaught errors or unhandled rejections are caught // and logged, in order to avoid crashing the entire backend on local failures. @@ -186,56 +255,38 @@ export class BackendInitializer { } } - #resolveInitOrder(registerInits: Array) { - let registerInitsToOrder = registerInits.slice(); - const orderedRegisterInits = new Array(); - - // TODO: Validate duplicates - - while (registerInitsToOrder.length > 0) { - const toRemove = new Set(); - - for (const registerInit of registerInitsToOrder) { - const unInitializedDependents = []; - - for (const provided of registerInit.provides) { - if ( - registerInitsToOrder.some( - init => init !== registerInit && init.consumes.has(provided), - ) - ) { - unInitializedDependents.push(provided); - } - } - - if (unInitializedDependents.length === 0) { - orderedRegisterInits.push(registerInit); - toRemove.add(registerInit); - } - } - - registerInitsToOrder = registerInitsToOrder.filter(r => !toRemove.has(r)); - } - - return orderedRegisterInits; - } - async stop(): Promise { if (!this.#startPromise) { return; } await this.#startPromise; + const lifecycleService = await this.#getRootLifecycleImpl(); + await lifecycleService.shutdown(); + } + + // Bit of a hacky way to grab the lifecycle services, potentially find a nicer way to do this + async #getRootLifecycleImpl(): Promise { const lifecycleService = await this.#serviceHolder.get( coreServices.rootLifecycle, 'root', ); - - // TODO(Rugvip): Find a better way to do this if (lifecycleService instanceof BackendLifecycleImpl) { - await lifecycleService.shutdown(); - } else { - throw new Error('Unexpected lifecycle service implementation'); + return lifecycleService; } + throw new Error('Unexpected root lifecycle service implementation'); + } + + async #getPluginLifecycleImpl( + pluginId: string, + ): Promise { + const lifecycleService = await this.#serviceHolder.get( + coreServices.lifecycle, + pluginId, + ); + if (lifecycleService instanceof BackendPluginLifecycleImpl) { + return lifecycleService; + } + throw new Error('Unexpected plugin lifecycle service implementation'); } } diff --git a/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts b/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts index ad50455e5f..dc9a0cc085 100644 --- a/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts +++ b/packages/backend-app-api/src/wiring/createSpecializedBackend.test.ts @@ -32,12 +32,18 @@ describe('createSpecializedBackend', () => { createServiceFactory({ service: coreServices.rootLifecycle, deps: {}, - factory: async () => ({ addShutdownHook: () => {} }), + factory: async () => ({ + addStartupHook: () => {}, + addShutdownHook: () => {}, + }), }), createServiceFactory({ service: coreServices.rootLifecycle, deps: {}, - factory: async () => ({ addShutdownHook: () => {} }), + factory: async () => ({ + addStartupHook: () => {}, + addShutdownHook: () => {}, + }), }), ], }), diff --git a/packages/backend-app-api/src/wiring/types.ts b/packages/backend-app-api/src/wiring/types.ts index 2a91bf46b9..ffedb40324 100644 --- a/packages/backend-app-api/src/wiring/types.ts +++ b/packages/backend-app-api/src/wiring/types.ts @@ -30,16 +30,6 @@ export interface Backend { stop(): Promise; } -export interface BackendRegisterInit { - id: string; - consumes: Set; - provides: Set; - init: { - deps: { [name: string]: ServiceOrExtensionPoint }; - func: (deps: { [name: string]: unknown }) => Promise; - }; -} - /** * @public */ diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index a354795e21..4df3a19884 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/backend-common +## 0.19.0-next.1 + +### Minor Changes + +- c7f848bcea3c: Support authentication with a service principal or managed identity for Azure DevOps + + Azure DevOps recently released support, in public preview, for authenticating with a service principal or managed identity instead of a personal access token (PAT): https://devblogs.microsoft.com/devops/introducing-service-principal-and-managed-identity-support-on-azure-devops/. With this change the Azure integration now supports service principals and managed identities for Azure AD backed Azure DevOps organizations. Service principal and managed identity authentication is not supported on Azure DevOps Server (on-premises) organizations. + +### Patch Changes + +- 4ef91ab46732: Updated the backend database connection configuration schema to set the password visibility to secret +- 9f47a743632c: Fixed typo in HostDiscovery's JSDoc +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-app-api@0.4.4-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/integration-aws-node@0.1.4-next.0 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.18.6-next.0 ### Patch Changes diff --git a/packages/backend-common/config.d.ts b/packages/backend-common/config.d.ts index dc2e2fa133..3fd886874e 100644 --- a/packages/backend-common/config.d.ts +++ b/packages/backend-common/config.d.ts @@ -72,10 +72,22 @@ export interface Config { /** Default database client to use */ client: 'better-sqlite3' | 'sqlite3' | 'pg'; /** - * Base database connection string or Knex object + * Base database connection string, or object with individual connection properties * @visibility secret */ - connection: string | object; + connection: + | string + | Partial<{ + /** + * Password that belongs to the client User + * @visibility secret + */ + password: string; + /** + * Other connection settings + */ + [key: string]: unknown; + }>; /** Database name prefix override */ prefix?: string; /** diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 79d955be88..e1192dac00 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.6-next.0", + "version": "0.19.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/src/discovery/HostDiscovery.ts b/packages/backend-common/src/discovery/HostDiscovery.ts index abac4413be..1c72445443 100644 --- a/packages/backend-common/src/discovery/HostDiscovery.ts +++ b/packages/backend-common/src/discovery/HostDiscovery.ts @@ -45,7 +45,7 @@ export class HostDiscovery implements PluginEndpointDiscovery { * - target: https://internal.example.com/internal-catalog * plugins: [catalog] * - target: https://internal.example.com/secure/api/{{pluginId}} - * plugins: [auth, permissions] + * plugins: [auth, permission] * - target: * internal: https://internal.example.com/search * external: https://example.com/search diff --git a/packages/backend-common/src/reading/AzureUrlReader.ts b/packages/backend-common/src/reading/AzureUrlReader.ts index 90cf8f29bd..26fe3f4a12 100644 --- a/packages/backend-common/src/reading/AzureUrlReader.ts +++ b/packages/backend-common/src/reading/AzureUrlReader.ts @@ -76,7 +76,7 @@ export class AzureUrlReader implements UrlReader { let response: Response; try { response = await fetch(builtUrl, { - ...getAzureRequestOptions(this.integration.config), + ...(await getAzureRequestOptions(this.integration.config)), // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. // The difference does not affect us in practice however. The cast can @@ -113,7 +113,7 @@ export class AzureUrlReader implements UrlReader { const commitsAzureResponse = await fetch( getAzureCommitsUrl(url), - getAzureRequestOptions(this.integration.config), + await getAzureRequestOptions(this.integration.config), ); if (!commitsAzureResponse.ok) { const message = `Failed to read tree from ${url}, ${commitsAzureResponse.status} ${commitsAzureResponse.statusText}`; @@ -129,9 +129,9 @@ export class AzureUrlReader implements UrlReader { } const archiveAzureResponse = await fetch(getAzureDownloadUrl(url), { - ...getAzureRequestOptions(this.integration.config, { + ...(await getAzureRequestOptions(this.integration.config, { Accept: 'application/zip', - }), + })), // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. // The difference does not affect us in practice however. The cast can be diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 5f1ceea06c..4c92ebbc12 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-defaults +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-app-api@0.4.4-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + ## 0.1.11-next.0 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 4677d9af89..aabd493ff9 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.11-next.0", + "version": "0.1.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-defaults/src/CreateBackend.test.ts b/packages/backend-defaults/src/CreateBackend.test.ts index 8d56cd0986..946de90b2b 100644 --- a/packages/backend-defaults/src/CreateBackend.test.ts +++ b/packages/backend-defaults/src/CreateBackend.test.ts @@ -35,7 +35,10 @@ describe('createBackend', () => { createServiceFactory({ service: coreServices.rootLifecycle, deps: {}, - factory: async () => ({ addShutdownHook: () => {} }), + factory: async () => ({ + addStartupHook: () => {}, + addShutdownHook: () => {}, + }), }), ], }), @@ -49,12 +52,18 @@ describe('createBackend', () => { createServiceFactory({ service: coreServices.rootLifecycle, deps: {}, - factory: async () => ({ addShutdownHook: () => {} }), + factory: async () => ({ + addStartupHook: () => {}, + addShutdownHook: () => {}, + }), }), createServiceFactory({ service: coreServices.rootLifecycle, deps: {}, - factory: async () => ({ addShutdownHook: () => {} }), + factory: async () => ({ + addStartupHook: () => {}, + addShutdownHook: () => {}, + }), }), ], }), diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index d26412f02d..9dcd3de104 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,28 @@ # example-backend-next +## 0.0.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.0 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/backend-defaults@0.1.11-next.1 + - @backstage/plugin-app-backend@0.3.46-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-kubernetes-backend@0.11.1-next.1 + - @backstage/plugin-permission-backend@0.5.21-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-search-backend@1.3.2-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.2-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.2-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/plugin-techdocs-backend@1.6.3-next.1 + - @backstage/plugin-todo-backend@0.1.43-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + ## 0.0.12-next.0 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 664360eaa0..6d3ecc9823 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.12-next.0", + "version": "0.0.12-next.1", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,6 +29,7 @@ "@backstage/plugin-app-backend": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", "@backstage/plugin-kubernetes-backend": "workspace:^", "@backstage/plugin-permission-backend": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts index 1c4380f4a0..cdba12e0e3 100644 --- a/packages/backend-next/src/index.ts +++ b/packages/backend-next/src/index.ts @@ -30,6 +30,7 @@ import { searchModuleTechDocsCollator } from '@backstage/plugin-search-backend-m import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; import { techdocsPlugin } from '@backstage/plugin-techdocs-backend/alpha'; import { todoPlugin } from '@backstage/plugin-todo-backend'; +import { catalogModuleUnprocessedEntities } from '@backstage/plugin-catalog-backend-module-unprocessed'; const backend = createBackend(); @@ -60,4 +61,6 @@ backend.add(kubernetesPlugin()); backend.add(permissionPlugin()); backend.add(permissionModuleAllowAllPolicy()); +backend.add(catalogModuleUnprocessedEntities()); + backend.start(); diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 97b1bb4664..6e68141e75 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/backend-plugin-api +## 0.5.3-next.1 + +### Patch Changes + +- 3bb4158a8aa4: Added startup hooks to the lifecycle services. +- Updated dependencies + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.5.3-next.0 ### Patch Changes diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index 7dc6ae97b3..b3cbef993c 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -273,6 +273,10 @@ export interface LifecycleService { hook: LifecycleServiceShutdownHook, options?: LifecycleServiceShutdownOptions, ): void; + addStartupHook( + hook: LifecycleServiceStartupHook, + options?: LifecycleServiceStartupOptions, + ): void; } // @public (undocumented) @@ -283,6 +287,14 @@ export interface LifecycleServiceShutdownOptions { logger?: LoggerService; } +// @public (undocumented) +export type LifecycleServiceStartupHook = () => void | Promise; + +// @public (undocumented) +export interface LifecycleServiceStartupOptions { + logger?: LoggerService; +} + // @public export interface LoggerService { // (undocumented) diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 117fd931d9..db36b17aca 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.3-next.0", + "version": "0.5.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-plugin-api/src/services/definitions/LifecycleService.ts b/packages/backend-plugin-api/src/services/definitions/LifecycleService.ts index 89351194e6..e0641e0457 100644 --- a/packages/backend-plugin-api/src/services/definitions/LifecycleService.ts +++ b/packages/backend-plugin-api/src/services/definitions/LifecycleService.ts @@ -16,6 +16,21 @@ import { LoggerService } from './LoggerService'; +/** + * @public + */ +export type LifecycleServiceStartupHook = () => void | Promise; + +/** + * @public + */ +export interface LifecycleServiceStartupOptions { + /** + * Optional {@link LoggerService} that will be used for logging instead of the default logger. + */ + logger?: LoggerService; +} + /** * @public */ @@ -35,6 +50,20 @@ export interface LifecycleServiceShutdownOptions { * @public */ export interface LifecycleService { + /** + * Register a function to be called when the backend has been initialized. + * + * @remarks + * + * When used with plugin scope it will wait for the plugin itself to have been initialized. + * + * When used with root scope it will wait for all plugins to have been initialized. + */ + addStartupHook( + hook: LifecycleServiceStartupHook, + options?: LifecycleServiceStartupOptions, + ): void; + /** * Register a function to be called when the backend is shutting down. */ diff --git a/packages/backend-plugin-api/src/services/definitions/index.ts b/packages/backend-plugin-api/src/services/definitions/index.ts index 0122bc0be8..ab0f0b84b1 100644 --- a/packages/backend-plugin-api/src/services/definitions/index.ts +++ b/packages/backend-plugin-api/src/services/definitions/index.ts @@ -26,6 +26,8 @@ export type { DiscoveryService } from './DiscoveryService'; export type { HttpRouterService } from './HttpRouterService'; export type { LifecycleService, + LifecycleServiceStartupHook, + LifecycleServiceStartupOptions, LifecycleServiceShutdownHook, LifecycleServiceShutdownOptions, } from './LifecycleService'; diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index 70532f865e..8290ea3b99 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/backend-tasks +## 0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.5.3-next.0 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index 7a76b1a004..604edce8dc 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.3-next.0", + "version": "0.5.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 8b3c5de2c7..dabf0c1605 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/backend-test-utils +## 0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-app-api@0.4.4-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.38-next.0 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index b8a747a871..4bf7bde46a 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.38-next.0", + "version": "0.1.38-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 8ba25739ed..312144e7a2 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,59 @@ # example-backend +## 0.2.84-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-jenkins-backend@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3-next.1 + - @backstage/plugin-devtools-backend@0.1.1-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.0 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/plugin-adr-backend@0.3.4-next.1 + - @backstage/plugin-proxy-backend@0.2.40-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.7-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-app-backend@0.3.46-next.1 + - @backstage/plugin-auth-backend@0.18.4-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-azure-devops-backend@0.3.25-next.1 + - @backstage/plugin-azure-sites-backend@0.1.8-next.1 + - @backstage/plugin-badges-backend@0.2.1-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-code-coverage-backend@0.2.12-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.4-next.1 + - @backstage/plugin-events-backend@0.2.7-next.1 + - @backstage/plugin-explore-backend@0.0.8-next.1 + - @backstage/plugin-graphql-backend@0.1.36-next.1 + - @backstage/plugin-kafka-backend@0.2.39-next.1 + - @backstage/plugin-kubernetes-backend@0.11.1-next.1 + - @backstage/plugin-lighthouse-backend@0.2.2-next.1 + - @backstage/plugin-linguist-backend@0.3.0-next.1 + - @backstage/plugin-permission-backend@0.5.21-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-playlist-backend@0.3.2-next.1 + - @backstage/plugin-rollbar-backend@0.1.43-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.1 + - @backstage/plugin-search-backend@1.3.2-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.1-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/plugin-tech-insights-backend@0.5.12-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30-next.1 + - @backstage/plugin-tech-insights-node@0.4.4-next.1 + - @backstage/plugin-techdocs-backend@1.6.3-next.1 + - @backstage/plugin-todo-backend@0.1.43-next.1 + - example-app@0.2.84-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.2.84-next.0 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index f225e35d98..88937a9e6c 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.84-next.0", + "version": "0.2.84-next.1", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,6 +40,7 @@ "@backstage/plugin-azure-sites-backend": "workspace:^", "@backstage/plugin-badges-backend": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-code-coverage-backend": "workspace:^", "@backstage/plugin-devtools-backend": "workspace:^", @@ -60,6 +61,7 @@ "@backstage/plugin-proxy-backend": "workspace:^", "@backstage/plugin-rollbar-backend": "workspace:^", "@backstage/plugin-scaffolder-backend": "workspace:^", + "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "workspace:^", "@backstage/plugin-scaffolder-backend-module-rails": "workspace:^", "@backstage/plugin-search-backend": "workspace:^", "@backstage/plugin-search-backend-module-elasticsearch": "workspace:^", @@ -73,6 +75,9 @@ "@backstage/plugin-todo-backend": "workspace:^", "@gitbeaker/node": "^35.1.0", "@octokit/rest": "^19.0.3", + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/exporter-prometheus": "^0.39.1", + "@opentelemetry/sdk-metrics": "^1.13.0", "azure-devops-node-api": "^11.0.1", "better-sqlite3": "^8.0.0", "dockerode": "^3.3.1", diff --git a/packages/backend/prometheus.yml b/packages/backend/prometheus.yml new file mode 100644 index 0000000000..bdb0964a2f --- /dev/null +++ b/packages/backend/prometheus.yml @@ -0,0 +1,21 @@ +# This is an example configuration file for Prometheus, that is set to scrape +# the metrics endpoint exposed by the example backend. +# +# If you want to run a docker based Prometheus instance locally to try it out, +# run the following command in the Backstage root: +# +# docker run --mount type=bind,source=./packages/backend/prometheus.yml,destination=/etc/prometheus/prometheus.yml --publish published=9090,target=9090,protocol=tcp prom/prometheus +# +# After this, you have a Prometheus instance on http://localhost:9090 + +global: + scrape_interval: 15s + evaluation_interval: 15s + +scrape_configs: + - job_name: 'prometheus' + static_configs: + # This target address specifically works on Docker for MacOS - you may + # need to change it to another host depending on your OS and Docker + # engine. + - targets: ['host.docker.internal:9464'] diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 976ad9a577..5d22ec92e8 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -30,7 +30,7 @@ import { loadBackendConfig, notFoundHandler, DatabaseManager, - SingleHostDiscovery, + HostDiscovery, UrlReaders, useHotMemoize, ServerTokenManager, @@ -69,11 +69,22 @@ 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'; +import { PrometheusExporter } from '@opentelemetry/exporter-prometheus'; +import { MeterProvider } from '@opentelemetry/sdk-metrics'; +import { metrics } from '@opentelemetry/api'; + +// Expose opentelemetry metrics using a Prometheus exporter on +// http://localhost:9464/metrics . See prometheus.yml in packages/backend for +// more information on how to scrape it. +const exporter = new PrometheusExporter(); +const meterProvider = new MeterProvider(); +metrics.setGlobalMeterProvider(meterProvider); +meterProvider.addMetricReader(exporter); function makeCreateEnv(config: Config) { const root = getRootLogger(); const reader = UrlReaders.default({ logger: root, config }); - const discovery = SingleHostDiscovery.fromConfig(config); + const discovery = HostDiscovery.fromConfig(config); const tokenManager = ServerTokenManager.fromConfig(config, { logger: root }); const permissions = ServerPermissionClient.fromConfig(config, { discovery, diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index ae00d5a7ec..a0fd21b4d8 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -19,6 +19,7 @@ import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backen import { Router } from 'express'; import { PluginEnvironment } from '../types'; import { DemoEventBasedEntityProvider } from './DemoEventBasedEntityProvider'; +import { UnprocessedEntitesModule } from '@backstage/plugin-catalog-backend-module-unprocessed'; export default async function createPlugin( env: PluginEnvironment, @@ -34,6 +35,12 @@ export default async function createPlugin( builder.addEntityProvider(demoProvider); const { processingEngine, router } = await builder.build(); + + const unprocessed = new UnprocessedEntitesModule( + await env.database.getClient(), + router, + ); + unprocessed.registerRoutes(); await processingEngine.start(); return router; } diff --git a/packages/backend/src/plugins/scaffolder.ts b/packages/backend/src/plugins/scaffolder.ts index 821e5c1adf..505a514344 100644 --- a/packages/backend/src/plugins/scaffolder.ts +++ b/packages/backend/src/plugins/scaffolder.ts @@ -15,9 +15,14 @@ */ import { CatalogClient } from '@backstage/catalog-client'; -import { createRouter } from '@backstage/plugin-scaffolder-backend'; +import { + createBuiltinActions, + createRouter, +} from '@backstage/plugin-scaffolder-backend'; import { Router } from 'express'; import type { PluginEnvironment } from '../types'; +import { ScmIntegrations } from '@backstage/integration'; +import { createConfluenceToMarkdownAction } from '@backstage/plugin-scaffolder-backend-module-confluence-to-markdown'; export default async function createPlugin( env: PluginEnvironment, @@ -26,6 +31,24 @@ export default async function createPlugin( discoveryApi: env.discovery, }); + const integrations = ScmIntegrations.fromConfig(env.config); + + const builtInActions = createBuiltinActions({ + integrations, + config: env.config, + catalogClient, + reader: env.reader, + }); + + const actions = [ + ...builtInActions, + createConfluenceToMarkdownAction({ + integrations, + config: env.config, + reader: env.reader, + }), + ]; + return await createRouter({ logger: env.logger, config: env.config, @@ -35,5 +58,6 @@ export default async function createPlugin( identity: env.identity, scheduler: env.scheduler, permissions: env.permissions, + actions, }); } diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts index 0e6982545f..4290fcd68a 100644 --- a/packages/backend/src/plugins/search.ts +++ b/packages/backend/src/plugins/search.ts @@ -15,6 +15,7 @@ */ import { useHotCleanup } from '@backstage/backend-common'; +import { DefaultAdrCollatorFactory } from '@backstage/plugin-adr-backend'; import { DefaultCatalogCollatorFactory } from '@backstage/plugin-catalog-backend'; import { ToolDocumentCollatorFactory } from '@backstage/plugin-explore-backend'; import { createRouter } from '@backstage/plugin-search-backend'; @@ -68,6 +69,18 @@ export default async function createPlugin( // Collators are responsible for gathering documents known to plugins. This // particular collator gathers entities from the software catalog. + indexBuilder.addCollator({ + schedule, + factory: DefaultAdrCollatorFactory.fromConfig({ + cache: env.cache, + config: env.config, + discovery: env.discovery, + logger: env.logger, + reader: env.reader, + tokenManager: env.tokenManager, + }), + }); + indexBuilder.addCollator({ schedule, factory: DefaultCatalogCollatorFactory.fromConfig(env.config, { diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index 5b7d668947..82537f9aec 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/catalog-client +## 1.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + ## 1.4.2-next.0 ### Patch Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index 77d3b58735..b911c3437f 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.2-next.0", + "version": "1.4.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index 45768d78d7..84bc98fc6d 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/catalog-model +## 1.4.0-next.0 + +### Minor Changes + +- 33eae4b39a95: Deprecate target field and make targetRef required in common.schema.json + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 1.3.0 ### Minor Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 6578ca68c2..e55c87abb1 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-model", "description": "Types and validators that help describe the model of a Backstage Catalog", - "version": "1.3.0", + "version": "1.4.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-model/src/schema/shared/common.schema.json b/packages/catalog-model/src/schema/shared/common.schema.json index 5a5eb97bb7..7468bd9d70 100644 --- a/packages/catalog-model/src/schema/shared/common.schema.json +++ b/packages/catalog-model/src/schema/shared/common.schema.json @@ -32,7 +32,7 @@ "$id": "#relation", "type": "object", "description": "A directed relation from one entity to another.", - "required": ["type", "target"], + "required": ["type", "target", "targetRef"], "additionalProperties": false, "properties": { "type": { @@ -42,7 +42,8 @@ "description": "The type of relation." }, "target": { - "$ref": "#reference" + "$ref": "#reference", + "deprecated": true }, "targetRef": { "type": "string", diff --git a/packages/catalog-model/src/validation/entityKindSchemaValidator.test.ts b/packages/catalog-model/src/validation/entityKindSchemaValidator.test.ts index ee8f39b140..14cfcbe50a 100644 --- a/packages/catalog-model/src/validation/entityKindSchemaValidator.test.ts +++ b/packages/catalog-model/src/validation/entityKindSchemaValidator.test.ts @@ -51,7 +51,11 @@ describe('entityKindSchemaValidator', () => { owner: 'me', }, relations: [ - { type: 't', target: { kind: 'k', namespace: 'ns', name: 'n' } }, + { + type: 't', + targetRef: 'someTargetRef', + target: { kind: 'k', namespace: 'ns', name: 'n' }, + }, ], status: { items: [ diff --git a/packages/catalog-model/src/validation/entitySchemaValidator.test.ts b/packages/catalog-model/src/validation/entitySchemaValidator.test.ts index 12f890d9db..bc31c5d800 100644 --- a/packages/catalog-model/src/validation/entitySchemaValidator.test.ts +++ b/packages/catalog-model/src/validation/entitySchemaValidator.test.ts @@ -52,7 +52,11 @@ describe('entitySchemaValidator', () => { owner: 'me', }, relations: [ - { type: 't', target: { kind: 'k', namespace: 'ns', name: 'n' } }, + { + type: 't', + targetRef: 'someTargetRef', + target: { kind: 'k', namespace: 'ns', name: 'n' }, + }, ], status: { items: [ @@ -361,11 +365,16 @@ describe('entitySchemaValidator', () => { expect(() => validator(entity)).toThrow(/relations/); }); - it('rejects missing relations.target', () => { + it('does reject missing relations.target', () => { delete entity.relations[0].target; expect(() => validator(entity)).toThrow(/relations/); }); + it('does reject missing relations.targetRef', () => { + delete entity.relations[0].targetRef; + expect(() => validator(entity)).toThrow(/relations/); + }); + it('rejects empty relations.target', () => { entity.relations[0].target = ''; expect(() => validator(entity)).toThrow(/relations/); diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index 90aef2d9c3..2e30357da6 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/cli-node +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/types@1.0.2 + ## 0.1.0 ### Minor Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index eb921a4247..41b9f8e70d 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli-node", "description": "Node.js library for Backstage CLIs", - "version": "0.1.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 386effadda..4f9d9714b0 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/cli +## 0.22.8-next.1 + +### Patch Changes + +- 6816352500a7: Add discovery feature to the onboard cli command. +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli-node@0.1.1-next.0 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/eslint-plugin@0.1.3 + - @backstage/release-manifests@0.0.9 + - @backstage/types@1.0.2 + ## 0.22.8-next.0 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 82f0667d5e..4da91b0870 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.8-next.0", + "version": "0.22.8-next.1", "publishConfig": { "access": "public" }, @@ -30,16 +30,20 @@ "backstage-cli": "bin/backstage-cli" }, "dependencies": { + "@backstage/catalog-model": "workspace:^", "@backstage/cli-common": "workspace:^", "@backstage/cli-node": "workspace:^", "@backstage/config": "workspace:^", "@backstage/config-loader": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/eslint-plugin": "workspace:^", + "@backstage/integration": "workspace:^", "@backstage/release-manifests": "workspace:^", "@backstage/types": "workspace:^", "@esbuild-kit/cjs-loader": "^2.4.1", "@manypkg/get-packages": "^1.1.3", + "@octokit/graphql": "^5.0.0", + "@octokit/graphql-schema": "^13.7.0", "@octokit/oauth-app": "^4.2.0", "@octokit/request": "^6.0.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", @@ -88,6 +92,7 @@ "express": "^4.17.1", "fork-ts-checker-webpack-plugin": "^7.0.0-alpha.8", "fs-extra": "10.1.0", + "git-url-parse": "^13.0.0", "glob": "^7.1.7", "global-agent": "^3.0.0", "handlebars": "^4.7.3", diff --git a/packages/cli/src/commands/onboard/command.ts b/packages/cli/src/commands/onboard/command.ts index 5cf25953ab..f68685f3e6 100644 --- a/packages/cli/src/commands/onboard/command.ts +++ b/packages/cli/src/commands/onboard/command.ts @@ -19,11 +19,13 @@ import inquirer from 'inquirer'; import { Task } from '../../lib/tasks'; import { auth } from './auth'; import { integrations } from './integrations'; +import { discover } from './discovery'; export async function command(): Promise { const answers = await inquirer.prompt<{ shouldSetupAuth: boolean; shouldSetupScaffolder: boolean; + shouldDiscoverEntities: boolean; }>([ { type: 'confirm', @@ -37,9 +39,26 @@ export async function command(): Promise { message: 'Do you want to use Software Templates in this project?', default: true, }, + { + type: 'confirm', + name: 'shouldDiscoverEntities', + message: + 'Do you want to discover entities and add them to the Software Catalog?', + default: true, + }, ]); - const { shouldSetupAuth, shouldSetupScaffolder } = answers; + const { shouldSetupAuth, shouldSetupScaffolder, shouldDiscoverEntities } = + answers; + + if (!shouldSetupAuth && !shouldSetupScaffolder && !shouldDiscoverEntities) { + Task.log( + chalk.yellow( + 'If you change your mind, feel free to re-run this command.', + ), + ); + return; + } let providerInfo; if (shouldSetupAuth) { @@ -50,13 +69,8 @@ export async function command(): Promise { await integrations(providerInfo); } - if (!shouldSetupAuth && !shouldSetupScaffolder) { - Task.log( - chalk.yellow( - 'If you change your mind, feel free to re-run this command.', - ), - ); - return; + if (shouldDiscoverEntities) { + await discover(providerInfo); } Task.log(); diff --git a/packages/cli/src/commands/onboard/discovery/Discovery.ts b/packages/cli/src/commands/onboard/discovery/Discovery.ts new file mode 100644 index 0000000000..b0db4255ad --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/Discovery.ts @@ -0,0 +1,71 @@ +/* + * 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 chalk from 'chalk'; +import { Entity } from '@backstage/catalog-model'; +import { Analyzer } from './analyzers/types'; +import { Provider } from './providers/types'; +import { DefaultAnalysisOutputs } from './analyzers/DefaultAnalysisOutputs'; +import { Task } from '../../../lib/tasks'; + +export class Discovery { + readonly #providers: Provider[] = []; + readonly #analyzers: Analyzer[] = []; + + addProvider(provider: Provider) { + this.#providers.push(provider); + } + + addAnalyzer(analyzer: Analyzer) { + this.#analyzers.push(analyzer); + } + + async run(url: string): Promise<{ entities: Entity[] }> { + Task.log(`Running discovery for ${chalk.cyan(url)}`); + const result: Entity[] = []; + + for (const provider of this.#providers) { + const repositories = await provider.discover(url); + if (repositories && repositories.length) { + Task.log( + `Discovered ${chalk.cyan( + repositories.length, + )} repositories for ${chalk.cyan(provider.name())}`, + ); + + for (const repository of repositories) { + await Task.forItem('Analyzing', repository.name, async () => { + const output = new DefaultAnalysisOutputs(); + for (const analyzer of this.#analyzers) { + await analyzer.analyzeRepository({ repository, output }); + } + + output + .list() + .filter(entry => entry.type === 'entity') + .forEach(({ entity }) => result.push(entity)); + }); + } + + Task.log(`Produced ${chalk.cyan(result.length || 'no')} entities`); + } + } + + return { + entities: result, + }; + } +} diff --git a/packages/cli/src/commands/onboard/discovery/analyzers/BasicRepositoryAnalyzer.ts b/packages/cli/src/commands/onboard/discovery/analyzers/BasicRepositoryAnalyzer.ts new file mode 100644 index 0000000000..82c8c2cdae --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/analyzers/BasicRepositoryAnalyzer.ts @@ -0,0 +1,56 @@ +/* + * 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 { ComponentEntity } from '@backstage/catalog-model'; +import { AnalysisOutputs, Analyzer } from './types'; +import { Repository } from '../providers/types'; + +/** + * Naive analyzer that produces a single entity that represents the repository + * as a whole. + */ +export class BasicRepositoryAnalyzer implements Analyzer { + name(): string { + return BasicRepositoryAnalyzer.name; + } + + async analyzeRepository(options: { + repository: Repository; + output: AnalysisOutputs; + }): Promise { + const entity: ComponentEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: options.repository.name, + ...(options.repository.description + ? { description: options.repository.description } + : {}), + }, + spec: { + type: 'service', + lifecycle: 'production', + owner: 'user:guest', + }, + }; + + options.output.produce({ + type: 'entity', + path: '/', + entity: entity, + }); + } +} diff --git a/packages/cli/src/commands/onboard/discovery/analyzers/DefaultAnalysisOutputs.ts b/packages/cli/src/commands/onboard/discovery/analyzers/DefaultAnalysisOutputs.ts new file mode 100644 index 0000000000..a370b8f166 --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/analyzers/DefaultAnalysisOutputs.ts @@ -0,0 +1,29 @@ +/* + * 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 { AnalysisOutput, AnalysisOutputs } from './types'; + +export class DefaultAnalysisOutputs implements AnalysisOutputs { + readonly #outputs = new Map(); + + produce(output: AnalysisOutput) { + this.#outputs.set(output.entity.metadata.name, output); + } + + list() { + return Array.from(this.#outputs).map(([_, output]) => output); + } +} diff --git a/packages/cli/src/commands/onboard/discovery/analyzers/PackageJsonAnalyzer.ts b/packages/cli/src/commands/onboard/discovery/analyzers/PackageJsonAnalyzer.ts new file mode 100644 index 0000000000..16dd4b9301 --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/analyzers/PackageJsonAnalyzer.ts @@ -0,0 +1,128 @@ +/* + * 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 { + ANNOTATION_SOURCE_LOCATION, + ComponentEntity, +} from '@backstage/catalog-model'; +import z from 'zod'; +import { AnalysisOutputs, Analyzer } from './types'; +import { Repository, RepositoryFile } from '../providers/types'; + +export class PackageJsonAnalyzer implements Analyzer { + name(): string { + return PackageJsonAnalyzer.name; + } + + async analyzeRepository(options: { + repository: Repository; + output: AnalysisOutputs; + }): Promise { + const packageJson = await options.repository.file('package.json'); + if (!packageJson) { + return; + } + + const content = await readPackageJson(packageJson); + if (!content) { + return; + } + + const name = sanitizeName(content?.name) ?? options.repository.name; + + const entity: ComponentEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name, + ...(options.repository.description + ? { description: options.repository.description } + : {}), + tags: ['javascript'], + annotations: { + [ANNOTATION_SOURCE_LOCATION]: `url:${options.repository.url}`, + }, + }, + spec: { + type: 'website', + lifecycle: 'production', + owner: 'user:guest', + }, + }; + + const decorate = options.output + .list() + .find(entry => entry.entity.metadata.name === name); + + if (decorate) { + decorate.entity.spec = { + ...decorate.entity.spec, + type: 'website', + }; + + decorate.entity.metadata.tags = [ + ...(decorate.entity.metadata.tags ?? []), + 'javascript', + ]; + + decorate.entity.metadata.annotations = { + ...decorate.entity.metadata.annotations, + [ANNOTATION_SOURCE_LOCATION]: `url:${options.repository.url}`, + }; + + return; + } + + options.output.produce({ + type: 'entity', + path: '/', + entity, + }); + } +} + +const packageSchema = z.object({ + name: z.string().optional(), +}); + +/** + * Makes sure that a name retrieved from a package.json file + * is reasonable and conforms to the catalog naming format. + * + * Read more about the naming format here: + * ADR002: Default Software Catalog File Format + * https://backstage.io/docs/architecture-decisions/adrs-adr002/ + */ +function sanitizeName(name?: string) { + return name && name !== 'root' + ? name.replace(/[^a-z0-9A-Z]/g, '_').substring(0, 62) + : undefined; +} + +async function readPackageJson( + file: RepositoryFile, +): Promise | undefined> { + try { + const text = await file.text(); + const result = packageSchema.safeParse(JSON.parse(text)); + if (!result.success) { + return undefined; + } + return { name: result.data.name }; + } catch (e) { + return undefined; + } +} diff --git a/packages/cli/src/commands/onboard/discovery/analyzers/types.ts b/packages/cli/src/commands/onboard/discovery/analyzers/types.ts new file mode 100644 index 0000000000..57b6f2152b --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/analyzers/types.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 { Entity } from '@backstage/catalog-model'; +import { Repository } from '../providers/types'; + +export type AnalysisOutput = { + type: 'entity'; + path: string; + entity: Entity; +}; + +export interface AnalysisOutputs { + produce(output: AnalysisOutput): void; + list(): AnalysisOutput[]; +} + +export interface Analyzer { + name(): string; + analyzeRepository(options: { + repository: Repository; + output: AnalysisOutputs; + }): Promise; +} diff --git a/packages/cli/src/commands/onboard/discovery/index.ts b/packages/cli/src/commands/onboard/discovery/index.ts new file mode 100644 index 0000000000..8b2a5b694a --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/index.ts @@ -0,0 +1,141 @@ +/* + * 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 fs from 'fs-extra'; +import yaml from 'yaml'; +import inquirer from 'inquirer'; +import chalk from 'chalk'; +import { loadCliConfig } from '../../../lib/config'; +import { updateConfigFile } from '../config'; +import { APP_CONFIG_FILE, DISCOVERED_ENTITIES_FILE } from '../files'; +import { Discovery } from './Discovery'; +import { BasicRepositoryAnalyzer } from './analyzers/BasicRepositoryAnalyzer'; +import { PackageJsonAnalyzer } from './analyzers/PackageJsonAnalyzer'; +import { GithubDiscoveryProvider } from './providers/github/GithubDiscoveryProvider'; +import { GitlabDiscoveryProvider } from './providers/gitlab/GitlabDiscoveryProvider'; +import { GitHubAnswers, GitLabAnswers } from '../auth'; +import { Task } from '../../../lib/tasks'; + +export async function discover(providerInfo?: { + provider: string; + answers: GitHubAnswers | GitLabAnswers; +}) { + Task.log(` + Would you like to scan for - and create - Software Catalog entities? + + You will need to select which SCM (Source Code Management) provider you are using, + and then which repository or organization you want to scan. + + This will generate a new file in the root of your app containing discovered entities, + which will be included in the Software Catalog when you start up Backstage next time. + + Note that this command requires an access token, which can be either added through the integration config or + provided as an environment variable. + `); + + const answers = await inquirer.prompt<{ + shouldContinue: boolean; + provider: string; + url: string; + }>([ + { + type: 'confirm', + name: 'shouldContinue', + message: 'Do you want to continue?', + }, + { + type: 'list', + name: 'provider', + message: 'Please select which SCM provider you want to use:', + choices: ['GitHub', 'GitLab'], + default: providerInfo?.provider, + when: ({ shouldContinue }) => shouldContinue, + }, + { + type: 'input', + name: 'url', + message: `Which repository do you want to scan?`, + when: ({ shouldContinue }) => shouldContinue, + filter: (input, { provider }) => { + if (provider === 'GitLab') { + return `https://gitlab.com/${input}`; + } + if (provider === 'GitHub') { + return `https://github.com/${input}`; + } + return false; + }, + }, + ]); + + if (!answers.shouldContinue) { + Task.log( + chalk.yellow( + 'If you change your mind, feel free to re-run this command.', + ), + ); + return; + } + + const { fullConfig: config } = await loadCliConfig({ args: [] }); + + const discovery = new Discovery(); + + if (answers.provider === 'GitHub') { + discovery.addProvider(GithubDiscoveryProvider.fromConfig(config)); + } + if (answers.provider === 'GitLab') { + discovery.addProvider(GitlabDiscoveryProvider.fromConfig(config)); + } + + discovery.addAnalyzer(new BasicRepositoryAnalyzer()); + discovery.addAnalyzer(new PackageJsonAnalyzer()); + + const { entities } = await discovery.run(answers.url); + + if (!entities.length) { + Task.log( + chalk.yellow(` + We could not find enough information to be able to generate any Software Catalog entities for you. + Perhaps you can try again with a different repository?`), + ); + return; + } + + await Task.forItem('Creating', DISCOVERED_ENTITIES_FILE, async () => { + const payload: string[] = []; + for (const entity of entities) { + payload.push('---\n', yaml.stringify(entity)); + } + await fs.writeFile(DISCOVERED_ENTITIES_FILE, payload.join('')); + }); + + await Task.forItem( + 'Updating', + APP_CONFIG_FILE, + async () => + await updateConfigFile(APP_CONFIG_FILE, { + catalog: { + locations: [ + { + type: 'file', + target: DISCOVERED_ENTITIES_FILE, + }, + ], + }, + }), + ); +} diff --git a/packages/cli/src/commands/onboard/discovery/providers/github/GithubDiscoveryProvider.ts b/packages/cli/src/commands/onboard/discovery/providers/github/GithubDiscoveryProvider.ts new file mode 100644 index 0000000000..d5a3dc4a77 --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/providers/github/GithubDiscoveryProvider.ts @@ -0,0 +1,163 @@ +/* + * 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 { Config } from '@backstage/config'; +import { + DefaultGithubCredentialsProvider, + GithubCredentialsProvider, + ScmIntegrations, +} from '@backstage/integration'; +import { graphql } from '@octokit/graphql'; +import { + Repository as GraphqlRepository, + Query as GraphqlQuery, +} from '@octokit/graphql-schema'; +import parseGitUrl from 'git-url-parse'; +import { Provider, Repository } from '../types'; +import { GithubRepository } from './GithubRepository'; + +export class GithubDiscoveryProvider implements Provider { + readonly #envToken: string | undefined; + readonly #scmIntegrations: ScmIntegrations; + readonly #credentialsProvider: GithubCredentialsProvider; + + static fromConfig(config: Config): GithubDiscoveryProvider { + const envToken = process.env.GITHUB_TOKEN || undefined; + const scmIntegrations = ScmIntegrations.fromConfig(config); + const credentialsProvider = + DefaultGithubCredentialsProvider.fromIntegrations(scmIntegrations); + return new GithubDiscoveryProvider( + envToken, + scmIntegrations, + credentialsProvider, + ); + } + + private constructor( + envToken: string | undefined, + integrations: ScmIntegrations, + credentialsProvider: GithubCredentialsProvider, + ) { + this.#envToken = envToken; + this.#scmIntegrations = integrations; + this.#credentialsProvider = credentialsProvider; + } + + name(): string { + return 'GitHub'; + } + + async discover(url: string): Promise { + if (!url.startsWith('https://github.com/')) { + return false; + } + + const scmIntegration = this.#scmIntegrations.github.byUrl(url); + if (!scmIntegration) { + throw new Error(`No GitHub integration found for ${url}`); + } + + const parsed = parseGitUrl(url); + const { name, organization } = parsed; + const org = organization || name; // depends on if it's a repo url or an org url... + + const client = graphql.defaults({ + baseUrl: scmIntegration.config.apiBaseUrl, + headers: await this.#getRequestHeaders(url), + }); + + const { repositories } = await this.#getOrganizationRepositories( + client, + org, + ); + + return repositories + .filter(repo => repo.url.startsWith(url)) + .map(repo => new GithubRepository(client, repo, org)); + } + + async #getRequestHeaders(url: string): Promise> { + const credentials = await this.#credentialsProvider.getCredentials({ + url, + }); + + if (credentials.headers) { + return credentials.headers; + } else if (credentials.token) { + return { authorization: `token ${credentials.token}` }; + } + + if (this.#envToken) { + return { authorization: `token ${this.#envToken}` }; + } + + throw new Error( + 'No token available for GitHub, please configure your integrations or set a GITHUB_TOKEN env variable', + ); + } + + async #getOrganizationRepositories(client: typeof graphql, org: string) { + const query = `query repositories($org: String!, $cursor: String) { + repositoryOwner(login: $org) { + login + repositories(first: 100, after: $cursor) { + nodes { + name + url + description + isArchived + isFork + } + pageInfo { + hasNextPage + endCursor + } + } + } + }`; + + const result: GraphqlRepository[] = []; + + let cursor: string | undefined | null = undefined; + let hasNextPage = true; + + while (hasNextPage) { + const response: GraphqlQuery = await client(query, { + org, + cursor, + }); + + const { repositories: connection } = response.repositoryOwner ?? {}; + + if (!connection) { + throw new Error(`Found no repositories for ${org}`); + } + + for (const repository of connection.nodes ?? []) { + if (repository && !repository.isArchived && !repository.isFork) { + result.push(repository); + } + } + + cursor = connection.pageInfo.endCursor; + hasNextPage = connection.pageInfo.hasNextPage; + } + + return { + repositories: result, + }; + } +} diff --git a/packages/cli/src/commands/onboard/discovery/providers/github/GithubFile.ts b/packages/cli/src/commands/onboard/discovery/providers/github/GithubFile.ts new file mode 100644 index 0000000000..25279b0949 --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/providers/github/GithubFile.ts @@ -0,0 +1,35 @@ +/* + * 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 { RepositoryFile } from '../types'; + +export class GithubFile implements RepositoryFile { + readonly #path: string; + readonly #content: string; + + constructor(path: string, content: string) { + this.#path = path; + this.#content = content; + } + + get path(): string { + return this.#path; + } + + async text(): Promise { + return this.#content; + } +} diff --git a/packages/cli/src/commands/onboard/discovery/providers/github/GithubRepository.ts b/packages/cli/src/commands/onboard/discovery/providers/github/GithubRepository.ts new file mode 100644 index 0000000000..f3c68851a0 --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/providers/github/GithubRepository.ts @@ -0,0 +1,84 @@ +/* + * 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 { graphql } from '@octokit/graphql'; +import { + Repository as GraphqlRepository, + Blob as GraphqlBlob, +} from '@octokit/graphql-schema'; +import { Repository, RepositoryFile } from '../types'; +import { GithubFile } from './GithubFile'; + +export class GithubRepository implements Repository { + readonly #client: typeof graphql; + readonly #repo: GraphqlRepository; + readonly #org: string; + + constructor(client: typeof graphql, repo: GraphqlRepository, org: string) { + this.#client = client; + this.#repo = repo; + this.#org = org; + } + + get url(): string { + return this.#repo.url; + } + + get name(): string { + return this.#repo.name; + } + + get owner(): string { + return this.#org; + } + + get description(): string | undefined { + return this.#repo.description ?? undefined; + } + + async file(filename: string): Promise { + const content = await this.#getFileContent(filename); + if (!content || content.isBinary || !content.text) { + return undefined; + } + + return new GithubFile(filename, content.text ?? ''); + } + + async #getFileContent(filename: string) { + const query = `query RepoFiles($owner: String!, $name: String!, $expr: String!) { + repository(owner: $owner, name: $name) { + object(expression: $expr) { + ...on Blob { + text + isBinary + } + } + } + }`; + + const response = await this.#client<{ repository: GraphqlRepository }>( + query, + { + name: this.#repo.name, + owner: this.#org, + expr: `HEAD:${filename}`, + }, + ); + + return response.repository.object as GraphqlBlob; + } +} diff --git a/packages/cli/src/commands/onboard/discovery/providers/gitlab/GitlabDiscoveryProvider.ts b/packages/cli/src/commands/onboard/discovery/providers/gitlab/GitlabDiscoveryProvider.ts new file mode 100644 index 0000000000..df9ffa4206 --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/providers/gitlab/GitlabDiscoveryProvider.ts @@ -0,0 +1,106 @@ +/* + * 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 { Config } from '@backstage/config'; +import { + DefaultGitlabCredentialsProvider, + GitlabCredentialsProvider, + ScmIntegrations, +} from '@backstage/integration'; +import fetch from 'node-fetch'; +import { Provider } from '../types'; +import { GitlabProject, ProjectResponse } from './GitlabProject'; + +export class GitlabDiscoveryProvider implements Provider { + readonly #envToken: string | undefined; + readonly #scmIntegrations: ScmIntegrations; + readonly #credentialsProvider: GitlabCredentialsProvider; + + static fromConfig(config: Config): GitlabDiscoveryProvider { + const envToken = process.env.GITLAB_TOKEN || undefined; + const scmIntegrations = ScmIntegrations.fromConfig(config); + const credentialsProvider = + DefaultGitlabCredentialsProvider.fromIntegrations(scmIntegrations); + + return new GitlabDiscoveryProvider( + envToken, + scmIntegrations, + credentialsProvider, + ); + } + + private constructor( + envToken: string | undefined, + integrations: ScmIntegrations, + credentialsProvider: GitlabCredentialsProvider, + ) { + this.#envToken = envToken; + this.#scmIntegrations = integrations; + this.#credentialsProvider = credentialsProvider; + } + + name(): string { + return 'GitLab'; + } + + async discover(url: string): Promise { + const { origin, pathname } = new URL(url); + const [, user] = pathname.split('/'); + + const scmIntegration = this.#scmIntegrations.gitlab.byUrl(origin); + if (!scmIntegration) { + throw new Error(`No GitLab integration found for ${origin}`); + } + + const headers = await this.#getRequestHeaders(origin); + + const response = await fetch( + `${scmIntegration.config.apiBaseUrl}/users/${user}/projects`, + { headers }, + ); + + if (!response.ok) { + throw new Error(`${response.status} ${response.statusText}`); + } + + const projects: ProjectResponse[] = await response.json(); + + return projects.map( + project => + new GitlabProject(project, scmIntegration.config.apiBaseUrl, headers), + ); + } + + async #getRequestHeaders(url: string): Promise> { + const credentials = await this.#credentialsProvider.getCredentials({ + url, + }); + + if (credentials.headers) { + return credentials.headers; + } else if (credentials.token) { + return { authorization: `Bearer ${credentials.token}` }; + } + + if (this.#envToken) { + return { authorization: `Bearer ${this.#envToken}` }; + } + + throw new Error( + 'No token available for GitLab, please set a GITLAB_TOKEN env variable', + ); + } +} diff --git a/packages/cli/src/commands/onboard/discovery/providers/gitlab/GitlabFile.ts b/packages/cli/src/commands/onboard/discovery/providers/gitlab/GitlabFile.ts new file mode 100644 index 0000000000..06f3189ba6 --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/providers/gitlab/GitlabFile.ts @@ -0,0 +1,38 @@ +/* + * 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 { RepositoryFile } from '../types'; + +/** + * A single file in a GitLab repository. + */ +export class GitlabFile implements RepositoryFile { + readonly #path: string; + readonly #content: string; + + constructor(path: string, content: string) { + this.#path = path; + this.#content = content; + } + + get path(): string { + return this.#path; + } + + async text(): Promise { + return this.#content; + } +} diff --git a/packages/cli/src/commands/onboard/discovery/providers/gitlab/GitlabProject.ts b/packages/cli/src/commands/onboard/discovery/providers/gitlab/GitlabProject.ts new file mode 100644 index 0000000000..258e8176bb --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/providers/gitlab/GitlabProject.ts @@ -0,0 +1,89 @@ +/* + * 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 fetch from 'node-fetch'; +import { GitlabFile } from './GitlabFile'; +import { Repository, RepositoryFile } from '../types'; + +export type ProjectResponse = { + id: string; + name: string; + description: string; + owner: { + username: string; + }; + web_url: string; +}; + +type BranchResponse = { + default: boolean; + name: string; +}; + +type FileContentResponse = { + content: string; +}; + +export class GitlabProject implements Repository { + constructor( + private readonly project: ProjectResponse, + private readonly apiBaseUrl: string, + private readonly headers: { [name: string]: string }, + ) {} + + get url(): string { + return this.project.web_url; + } + + get name(): string { + return this.project.name; + } + + get owner(): string { + return this.project.owner.username; + } + + get description(): string { + return this.project.description; + } + + async file(filename: string): Promise { + const mainBranch = await this.#getMainBranch(); + const content = await this.#getFileContent(filename, mainBranch); + + return new GitlabFile(filename, content); + } + + async #getFileContent(path: string, mainBranch: string): Promise { + const response = await fetch( + `${this.apiBaseUrl}/projects/${this.project.id}/repository/files/${path}?ref=${mainBranch}`, + { headers: this.headers }, + ); + const { content }: FileContentResponse = await response.json(); + + return Buffer.from(content, 'base64').toString('ascii'); + } + + async #getMainBranch(): Promise { + const response = await fetch( + `${this.apiBaseUrl}/projects/${this.project.id}/repository/branches`, + { headers: this.headers }, + ); + const branches: BranchResponse[] = await response.json(); + + return branches.find(branch => branch.default)?.name ?? 'main'; + } +} diff --git a/packages/cli/src/commands/onboard/discovery/providers/types.ts b/packages/cli/src/commands/onboard/discovery/providers/types.ts new file mode 100644 index 0000000000..2d8ce70ecf --- /dev/null +++ b/packages/cli/src/commands/onboard/discovery/providers/types.ts @@ -0,0 +1,53 @@ +/* + * 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. + */ + +/** + * Abstraction for a single repository. + */ +export interface Repository { + url: string; + + name: string; + + owner: string; + + description?: string; + + file(filename: string): Promise; +} + +/** + * Abstraction for a single repository file. + */ +export interface RepositoryFile { + /** + * The filepath of the data. + */ + path: string; + + /** + * The textual contents of the file. + */ + text(): Promise; +} + +/** + * One integration that supports discovery of repositories. + */ +export interface Provider { + name(): string; + discover(url: string): Promise; +} diff --git a/packages/cli/src/commands/onboard/files.ts b/packages/cli/src/commands/onboard/files.ts index 17f8a0f85e..febec35d4a 100644 --- a/packages/cli/src/commands/onboard/files.ts +++ b/packages/cli/src/commands/onboard/files.ts @@ -19,7 +19,13 @@ import * as path from 'path'; /* eslint-disable-next-line no-restricted-syntax */ const { targetRoot, ownDir } = findPaths(__dirname); + export const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); +export const DISCOVERED_ENTITIES_FILE = path.join( + targetRoot, + 'examples', + 'discovered-entities.yaml', +); export const PATCH_FOLDER = path.join( ownDir, 'src', diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index ce613acbb5..f898331a4b 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/config-loader +## 1.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 1.3.1-next.0 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 741637e40b..b2e7015f03 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config-loader", "description": "Config loading functionality used by Backstage backend, and CLI", - "version": "1.3.1-next.0", + "version": "1.3.1-next.1", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index f6df0da032..bd2c6c818d 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/core-app-api +## 1.8.1-next.0 + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + ## 1.8.0 ### Minor Changes diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md index c899ccc065..09efe516b9 100644 --- a/packages/core-app-api/api-report.md +++ b/packages/core-app-api/api-report.md @@ -145,14 +145,16 @@ export class ApiResolver implements ApiHolder { // @public export type AppComponents = { - NotFoundErrorPage: ComponentType<{}>; + NotFoundErrorPage: ComponentType>; BootErrorPage: ComponentType; - Progress: ComponentType<{}>; - Router: ComponentType<{ - basename?: string; - }>; + Progress: ComponentType>; + Router: ComponentType< + PropsWithChildren<{ + basename?: string; + }> + >; ErrorBoundaryFallback: ComponentType; - ThemeProvider?: ComponentType<{}>; + ThemeProvider?: ComponentType>; SignInPage?: ComponentType; }; @@ -274,9 +276,9 @@ export type AuthApiCreateOptions = { export type BackstageApp = { getPlugins(): BackstagePlugin[]; getSystemIcon(key: string): IconComponent | undefined; - createRoot(element: JSX.Element): ComponentType<{}>; - getProvider(): ComponentType<{}>; - getRouter(): ComponentType<{}>; + createRoot(element: JSX.Element): ComponentType>; + getProvider(): ComponentType>; + getRouter(): ComponentType>; }; // @public @@ -316,10 +318,10 @@ export type BitbucketSession = { }; // @public -export type BootErrorPageProps = { +export type BootErrorPageProps = PropsWithChildren<{ step: 'load-config' | 'load-chunk'; error: Error; -}; +}>; export { ConfigReader }; @@ -359,11 +361,11 @@ export class ErrorApiForwarder implements ErrorApi { } // @public -export type ErrorBoundaryFallbackProps = { +export type ErrorBoundaryFallbackProps = PropsWithChildren<{ plugin?: BackstagePlugin; error: Error; resetError: () => void; -}; +}>; // @public export const FeatureFlagged: (props: FeatureFlaggedProps) => JSX.Element; @@ -596,9 +598,9 @@ export class SamlAuth } // @public -export type SignInPageProps = { +export type SignInPageProps = PropsWithChildren<{ onSignInSuccess(identityApi: IdentityApi): void; -}; +}>; // @public export class UnhandledErrorForwarder { diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 4416fa99e1..932bf05e95 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.8.0", + "version": "1.8.1-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/core-app-api/src/app/AppManager.tsx b/packages/core-app-api/src/app/AppManager.tsx index 33d43cbca6..470f7f8d75 100644 --- a/packages/core-app-api/src/app/AppManager.tsx +++ b/packages/core-app-api/src/app/AppManager.tsx @@ -242,7 +242,7 @@ export class AppManager implements BackstageApp { return this.components; } - createRoot(element: JSX.Element): ComponentType<{}> { + createRoot(element: JSX.Element): ComponentType> { const AppProvider = this.getProvider(); const AppRoot = () => { return {element}; @@ -251,7 +251,7 @@ export class AppManager implements BackstageApp { } #getProviderCalled = false; - getProvider(): ComponentType<{}> { + getProvider(): ComponentType> { if (this.#getProviderCalled) { throw new Error( 'app.getProvider() or app.createRoot() has already been called, and can only be called once', @@ -404,7 +404,7 @@ export class AppManager implements BackstageApp { return Provider; } - getRouter(): ComponentType<{}> { + getRouter(): ComponentType> { return AppRouter; } diff --git a/packages/core-app-api/src/app/types.ts b/packages/core-app-api/src/app/types.ts index c34407ca3a..7f38e2d006 100644 --- a/packages/core-app-api/src/app/types.ts +++ b/packages/core-app-api/src/app/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { ComponentType } from 'react'; +import { ComponentType, PropsWithChildren } from 'react'; import { AnyApiFactory, AppTheme, @@ -33,33 +33,33 @@ import { AppConfig } from '@backstage/config'; * * @public */ -export type BootErrorPageProps = { +export type BootErrorPageProps = PropsWithChildren<{ step: 'load-config' | 'load-chunk'; error: Error; -}; +}>; /** * Props for the `SignInPage` component of {@link AppComponents}. * * @public */ -export type SignInPageProps = { +export type SignInPageProps = PropsWithChildren<{ /** * Set the IdentityApi on successful sign-in. This should only be called once. */ onSignInSuccess(identityApi: IdentityApi): void; -}; +}>; /** * Props for the fallback error boundary. * * @public */ -export type ErrorBoundaryFallbackProps = { +export type ErrorBoundaryFallbackProps = PropsWithChildren<{ plugin?: BackstagePlugin; error: Error; resetError: () => void; -}; +}>; /** * A set of replaceable core components that are part of every Backstage app. @@ -67,12 +67,12 @@ export type ErrorBoundaryFallbackProps = { * @public */ export type AppComponents = { - NotFoundErrorPage: ComponentType<{}>; + NotFoundErrorPage: ComponentType>; BootErrorPage: ComponentType; - Progress: ComponentType<{}>; - Router: ComponentType<{ basename?: string }>; + Progress: ComponentType>; + Router: ComponentType>; ErrorBoundaryFallback: ComponentType; - ThemeProvider?: ComponentType<{}>; + ThemeProvider?: ComponentType>; /** * An optional sign-in page that will be rendered instead of the AppRouter at startup. @@ -319,7 +319,7 @@ export type BackstageApp = { * ); * ``` */ - createRoot(element: JSX.Element): ComponentType<{}>; + createRoot(element: JSX.Element): ComponentType>; /** * Provider component that should wrap the Router created with getRouter() @@ -327,7 +327,7 @@ export type BackstageApp = { * * @deprecated Use {@link BackstageApp.createRoot} instead. */ - getProvider(): ComponentType<{}>; + getProvider(): ComponentType>; /** * Router component that should wrap the App Routes create with getRoutes() @@ -335,7 +335,7 @@ export type BackstageApp = { * * @deprecated Import and use the {@link AppRouter} component from `@backstage/core-app-api` instead */ - getRouter(): ComponentType<{}>; + getRouter(): ComponentType>; }; /** diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 8f3b626157..114778334f 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/core-components +## 0.13.2-next.1 + +### Patch Changes + +- 83bdc3a555c1: Replaced usages of `theme.palette.theme.hint` with `theme.palette.text.secondary` as it has been removed in MUI v5 +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/version-bridge@1.0.4 + ## 0.13.2-next.0 ### Patch Changes diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index 9f4aca1dcf..df34abdd03 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -1087,6 +1087,7 @@ export type SidebarSubmenuItemProps = { to?: string; icon?: IconComponent; dropdownItems?: SidebarSubmenuItemDropdownItem[]; + exact?: boolean; }; // @public diff --git a/packages/core-components/package.json b/packages/core-components/package.json index e3e27e492b..be94cc1dfa 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.13.2-next.0", + "version": "0.13.2-next.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/core-components/src/components/Link/Link.stories.tsx b/packages/core-components/src/components/Link/Link.stories.tsx index 6049ec68b1..e069459e76 100644 --- a/packages/core-components/src/components/Link/Link.stories.tsx +++ b/packages/core-components/src/components/Link/Link.stories.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { Link } from './Link'; import { Route, @@ -37,7 +37,7 @@ export default { title: 'Navigation/Link', component: Link, decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp(

diff --git a/packages/core-components/src/components/LinkButton/LinkButton.stories.tsx b/packages/core-components/src/components/LinkButton/LinkButton.stories.tsx index 3dc49abb7f..ec9398e47d 100644 --- a/packages/core-components/src/components/LinkButton/LinkButton.stories.tsx +++ b/packages/core-components/src/components/LinkButton/LinkButton.stories.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { LinkButton } from './LinkButton'; import { useLocation } from 'react-router-dom'; import { createRouteRef, useRouteRef } from '@backstage/core-plugin-api'; @@ -39,7 +39,7 @@ export default { title: 'Inputs/Button', component: LinkButton, decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp( <> diff --git a/packages/core-components/src/components/LogViewer/LogViewer.stories.tsx b/packages/core-components/src/components/LogViewer/LogViewer.stories.tsx index d244ef7715..fca963eb74 100644 --- a/packages/core-components/src/components/LogViewer/LogViewer.stories.tsx +++ b/packages/core-components/src/components/LogViewer/LogViewer.stories.tsx @@ -14,14 +14,16 @@ * limitations under the License. */ -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { wrapInTestApp } from '@backstage/test-utils'; import { LogViewer } from './LogViewer'; export default { title: 'Data Display/LogViewer', component: LogViewer, - decorators: [(Story: ComponentType<{}>) => wrapInTestApp()], + decorators: [ + (Story: ComponentType>) => wrapInTestApp(), + ], }; const exampleLog = `Starting up task with 3 steps diff --git a/packages/core-components/src/layout/Sidebar/Items.tsx b/packages/core-components/src/layout/Sidebar/Items.tsx index 96c2b382e7..924182086f 100644 --- a/packages/core-components/src/layout/Sidebar/Items.tsx +++ b/packages/core-components/src/layout/Sidebar/Items.tsx @@ -677,7 +677,7 @@ const styledScrollbar = (theme: Theme): CreateCSSProperties => ({ borderRadius: '5px', }, '&::-webkit-scrollbar-thumb': { - backgroundColor: theme.palette.text.hint, + backgroundColor: theme.palette.text.secondary, borderRadius: '5px', }, }); diff --git a/packages/core-components/src/layout/Sidebar/Sidebar.stories.tsx b/packages/core-components/src/layout/Sidebar/Sidebar.stories.tsx index 8daf7b69b6..f647166250 100644 --- a/packages/core-components/src/layout/Sidebar/Sidebar.stories.tsx +++ b/packages/core-components/src/layout/Sidebar/Sidebar.stories.tsx @@ -23,7 +23,7 @@ import MenuBookIcon from '@material-ui/icons/MenuBook'; import CloudQueueIcon from '@material-ui/icons/CloudQueue'; import AcUnitIcon from '@material-ui/icons/AcUnit'; import AppsIcon from '@material-ui/icons/Apps'; -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { SidebarPage } from './Page'; import { Sidebar } from './Bar'; import { SidebarGroup } from './SidebarGroup'; @@ -46,7 +46,7 @@ export default { title: 'Layout/Sidebar', component: Sidebar, decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp(, { mountedRoutes: { '/': routeRef } }), ], }; diff --git a/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx b/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx index b08647d335..d05ee23636 100644 --- a/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx +++ b/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx @@ -130,6 +130,7 @@ export type SidebarSubmenuItemProps = { to?: string; icon?: IconComponent; dropdownItems?: SidebarSubmenuItemDropdownItem[]; + exact?: boolean; }; /** @@ -138,7 +139,7 @@ export type SidebarSubmenuItemProps = { * @public */ export const SidebarSubmenuItem = (props: SidebarSubmenuItemProps) => { - const { title, subtitle, to, icon: Icon, dropdownItems } = props; + const { title, subtitle, to, icon: Icon, dropdownItems, exact } = props; const classes = useStyles(); const { setIsHoveredOn } = useContext(SidebarItemWithSubmenuContext); const closeSubmenu = () => { @@ -146,7 +147,7 @@ export const SidebarSubmenuItem = (props: SidebarSubmenuItemProps) => { }; const toLocation = useResolvedPath(to ?? ''); const currentLocation = useLocation(); - let isActive = isLocationMatch(currentLocation, toLocation); + let isActive = isLocationMatch(currentLocation, toLocation, exact); const [showDropDown, setShowDropDown] = useState(false); const handleClickDropdown = () => { @@ -155,7 +156,7 @@ export const SidebarSubmenuItem = (props: SidebarSubmenuItemProps) => { if (dropdownItems !== undefined) { dropdownItems.some(item => { const resolvedPath = resolvePath(item.to); - isActive = isLocationMatch(currentLocation, resolvedPath); + isActive = isLocationMatch(currentLocation, resolvedPath, exact); return isActive; }); return ( diff --git a/packages/core-components/src/layout/Sidebar/utils.test.ts b/packages/core-components/src/layout/Sidebar/utils.test.ts index b08dcda0fc..976108a63d 100644 --- a/packages/core-components/src/layout/Sidebar/utils.test.ts +++ b/packages/core-components/src/layout/Sidebar/utils.test.ts @@ -95,4 +95,30 @@ describe('isLocationMatching', () => { toLocation = { pathname: '/catalog', search: '', hash: '' }; expect(isLocationMatch(currentLocation, toLocation)).toBe(true); }); + + describe('exact matching', () => { + it('return false when target query parameters are subset of current location query parameters', async () => { + currentLocation = { + pathname: '/catalog', + search: '?x=foo&y=bar', + state: null, + hash: '', + key: '', + }; + toLocation = { pathname: '/catalog', search: '?x=foo', hash: '' }; + expect(isLocationMatch(currentLocation, toLocation, true)).toBe(false); + }); + + it('return true when target query parameters are exact match with current location query parameters', async () => { + currentLocation = { + pathname: '/catalog', + search: '?x=foo&y=bar', + state: null, + hash: '', + key: '', + }; + toLocation = { pathname: '/catalog', search: '?y=bar&x=foo', hash: '' }; + expect(isLocationMatch(currentLocation, toLocation, true)).toBe(true); + }); + }); }); diff --git a/packages/core-components/src/layout/Sidebar/utils.ts b/packages/core-components/src/layout/Sidebar/utils.ts index 1afebe796d..5dba73f4cd 100644 --- a/packages/core-components/src/layout/Sidebar/utils.ts +++ b/packages/core-components/src/layout/Sidebar/utils.ts @@ -18,7 +18,11 @@ import { Location, Path } from 'history'; import { isEqual, isMatch } from 'lodash'; import qs from 'qs'; -export function isLocationMatch(currentLocation: Location, toLocation: Path) { +export function isLocationMatch( + currentLocation: Location, + toLocation: Path, + exact: boolean = false, +) { const toDecodedSearch = new URLSearchParams(toLocation.search).toString(); const toQueryParameters = qs.parse(toDecodedSearch); @@ -27,9 +31,11 @@ export function isLocationMatch(currentLocation: Location, toLocation: Path) { ).toString(); const currentQueryParameters = qs.parse(currentDecodedSearch); + const queryStringMatcher = exact ? isEqual : isMatch; + const matching = isEqual(toLocation.pathname, currentLocation.pathname) && - isMatch(currentQueryParameters, toQueryParameters); + queryStringMatcher(currentQueryParameters, toQueryParameters); return matching; } diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index df3ac4f298..4168767f63 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/core-plugin-api +## 1.5.2-next.0 + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + ## 1.5.1 ### Patch Changes diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md index 52ee47f6bb..227b9b9816 100644 --- a/packages/core-plugin-api/api-report.md +++ b/packages/core-plugin-api/api-report.md @@ -12,6 +12,7 @@ import { IconComponent as IconComponent_2 } from '@backstage/core-plugin-api'; import { IdentityApi as IdentityApi_2 } from '@backstage/core-plugin-api'; import { JsonValue } from '@backstage/types'; import { Observable } from '@backstage/types'; +import { PropsWithChildren } from 'react'; import { default as React_2 } from 'react'; import { ReactElement } from 'react'; import { ReactNode } from 'react'; @@ -137,14 +138,16 @@ export type ApiRefConfig = { // @public export type AppComponents = { - NotFoundErrorPage: ComponentType<{}>; + NotFoundErrorPage: ComponentType>; BootErrorPage: ComponentType; - Progress: ComponentType<{}>; - Router: ComponentType<{ - basename?: string; - }>; + Progress: ComponentType>; + Router: ComponentType< + PropsWithChildren<{ + basename?: string; + }> + >; ErrorBoundaryFallback: ComponentType; - ThemeProvider?: ComponentType<{}>; + ThemeProvider?: ComponentType>; SignInPage?: ComponentType; }; @@ -247,10 +250,10 @@ export const bitbucketServerAuthApiRef: ApiRef< >; // @public -export type BootErrorPageProps = { +export type BootErrorPageProps = PropsWithChildren<{ step: 'load-config' | 'load-chunk'; error: Error; -}; +}>; // @public export type CommonAnalyticsContext = { @@ -405,11 +408,11 @@ export type ErrorApiErrorContext = { export const errorApiRef: ApiRef; // @public -export type ErrorBoundaryFallbackProps = { +export type ErrorBoundaryFallbackProps = PropsWithChildren<{ plugin?: BackstagePlugin_2; error: Error; resetError: () => void; -}; +}>; // @public export type Extension = { @@ -690,9 +693,9 @@ export enum SessionState { } // @public -export type SignInPageProps = { +export type SignInPageProps = PropsWithChildren<{ onSignInSuccess(identityApi: IdentityApi_2): void; -}; +}>; // @public export interface StorageApi { diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 51b0693811..7fe56c1a6d 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.1", + "version": "1.5.2-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 52639751e7..a68d706883 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/create-app +## 0.5.2-next.1 + +### Patch Changes + +- 08f177b91084: Add link from Template entity to the scaffolder launch page for the template in the AboutCard. +- Updated dependencies + - @backstage/cli-common@0.1.12 + ## 0.5.2-next.0 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 08b67c7ea1..d6364fd60d 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.5.2-next.0", + "version": "0.5.2-next.1", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/templates/default-app/packages/app/src/App.tsx b/packages/create-app/templates/default-app/packages/app/src/App.tsx index 056402f2a8..8d62f29c52 100644 --- a/packages/create-app/templates/default-app/packages/app/src/App.tsx +++ b/packages/create-app/templates/default-app/packages/app/src/App.tsx @@ -40,12 +40,14 @@ const app = createApp({ bind(catalogPlugin.externalRoutes, { createComponent: scaffolderPlugin.routes.root, viewTechDoc: techdocsPlugin.routes.docRoot, + createFromTemplate: scaffolderPlugin.routes.selectedTemplate, }); bind(apiDocsPlugin.externalRoutes, { registerApi: catalogImportPlugin.routes.importPage, }); bind(scaffolderPlugin.externalRoutes, { registerComponent: catalogImportPlugin.routes.importPage, + viewTechDoc: techdocsPlugin.routes.docRoot, }); bind(orgPlugin.externalRoutes, { catalogIndex: catalogPlugin.routes.catalogIndex, diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 75a72c7f1d..081441519a 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/dev-utils +## 1.0.16-next.1 + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/app-defaults@1.4.0-next.1 + - @backstage/test-utils@1.4.0-next.1 + - @backstage/theme@0.4.0-next.0 + ## 1.0.16-next.0 ### Patch Changes diff --git a/packages/dev-utils/api-report.md b/packages/dev-utils/api-report.md index e1cb93313f..7ff48db175 100644 --- a/packages/dev-utils/api-report.md +++ b/packages/dev-utils/api-report.md @@ -12,6 +12,7 @@ import { ComponentType } from 'react'; import { Entity } from '@backstage/catalog-model'; import { GridProps } from '@material-ui/core'; import { IconComponent } from '@backstage/core-plugin-api'; +import { PropsWithChildren } from 'react'; import { ReactNode } from 'react'; // @public @@ -22,7 +23,7 @@ export class DevAppBuilder { addPage(opts: DevAppPageOptions): DevAppBuilder; addRootChild(node: ReactNode): DevAppBuilder; addThemes(themes: AppTheme[]): this; - build(): ComponentType<{}>; + build(): ComponentType>; registerApi< Api, Impl extends Api, diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index e3b057395e..931728326d 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.16-next.0", + "version": "1.0.16-next.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/dev-utils/src/devApp/render.tsx b/packages/dev-utils/src/devApp/render.tsx index d2c91c9394..36e87855ed 100644 --- a/packages/dev-utils/src/devApp/render.tsx +++ b/packages/dev-utils/src/devApp/render.tsx @@ -44,7 +44,7 @@ import { } from '@backstage/integration-react'; import { Box } from '@material-ui/core'; import BookmarkIcon from '@material-ui/icons/Bookmark'; -import React, { ComponentType, ReactNode } from 'react'; +import React, { ComponentType, ReactNode, PropsWithChildren } from 'react'; import ReactDOM from 'react-dom'; import { createRoutesFromChildren, Route } from 'react-router-dom'; import { SidebarThemeSwitcher } from './SidebarThemeSwitcher'; @@ -164,7 +164,7 @@ export class DevAppBuilder { /** * Build a DevApp component using the resources registered so far */ - build(): ComponentType<{}> { + build(): ComponentType> { const fakeRouteRef = createRouteRef({ id: 'fake' }); const FakePage = () => Page belonging to another plugin.; attachComponentData(FakePage, 'core.mountPoint', fakeRouteRef); diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index 363337002e..68ca72cd3b 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,14 @@ # e2e-test +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.2-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/cli-common@0.1.12 + ## 0.2.4-next.0 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index e17f320c31..0c020d8db9 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.4-next.0", + "version": "0.2.4-next.1", "private": true, "backstage": { "role": "cli" diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index 398b058bbb..e683ab0796 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/errors +## 1.2.0-next.0 + +### Minor Changes + +- c4e8fefd9f13: Added `ServiceUnavailableError` + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.0.2 + ## 1.1.5 ### Patch Changes diff --git a/packages/errors/api-report.md b/packages/errors/api-report.md index 650a826a30..0d405d8ba6 100644 --- a/packages/errors/api-report.md +++ b/packages/errors/api-report.md @@ -125,6 +125,9 @@ export function serializeError( }, ): SerializedError; +// @public +export class ServiceUnavailableError extends CustomErrorBase {} + // @public export function stringifyError(error: unknown): string; ``` diff --git a/packages/errors/package.json b/packages/errors/package.json index 1f4da3b2b2..d86425b859 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/errors", "description": "Common utilities for error handling within Backstage", - "version": "1.1.5", + "version": "1.2.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/errors/src/errors/common.ts b/packages/errors/src/errors/common.ts index e1a292d7b5..a2ea20e99f 100644 --- a/packages/errors/src/errors/common.ts +++ b/packages/errors/src/errors/common.ts @@ -81,6 +81,13 @@ export class NotModifiedError extends CustomErrorBase {} */ export class NotImplementedError extends CustomErrorBase {} +/** + * The server is not ready to handle the request. + * + * @public + */ +export class ServiceUnavailableError extends CustomErrorBase {} + /** * An error that forwards an underlying cause with additional context in the message. * diff --git a/packages/errors/src/errors/index.ts b/packages/errors/src/errors/index.ts index efd3257fbf..0a59891f87 100644 --- a/packages/errors/src/errors/index.ts +++ b/packages/errors/src/errors/index.ts @@ -25,6 +25,7 @@ export { NotFoundError, NotModifiedError, NotImplementedError, + ServiceUnavailableError, } from './common'; export { CustomErrorBase } from './CustomErrorBase'; export { ResponseError } from './ResponseError'; diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md index 181b08c4ee..66491e8c1d 100644 --- a/packages/integration-aws-node/CHANGELOG.md +++ b/packages/integration-aws-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/integration-aws-node +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + ## 0.1.3 ### Patch Changes diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index 8eec21a143..2903a54a51 100644 --- a/packages/integration-aws-node/package.json +++ b/packages/integration-aws-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-aws-node", "description": "Helpers for fetching AWS account credentials", - "version": "0.1.3", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 7a893b10b7..15d3cbf47b 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/integration-react +## 1.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + ## 1.1.14-next.0 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 086d616510..3215372892 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.14-next.0", + "version": "1.1.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 7dcef4fbc9..bf35bede4b 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/integration +## 1.5.0-next.0 + +### Minor Changes + +- a316d226c780: Add credential provider for GitLab. +- c7f848bcea3c: Support authentication with a service principal or managed identity for Azure DevOps + + Azure DevOps recently released support, in public preview, for authenticating with a service principal or managed identity instead of a personal access token (PAT): https://devblogs.microsoft.com/devops/introducing-service-principal-and-managed-identity-support-on-azure-devops/. With this change the Azure integration now supports service principals and managed identities for Azure AD backed Azure DevOps organizations. Service principal and managed identity authentication is not supported on Azure DevOps Server (on-premises) organizations. + +### Patch Changes + +- df8411779da1: Add support for Repository Variables and Secrets to the `publish:github` and `github:repo:create` scaffolder actions. You will need to add `read/write` permissions to your GITHUB_TOKEN and/or Github Backstage App for Repository `Secrets` and `Variables` + + Upgrade octokit introduces some breaking changes. + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + ## 1.4.5 ### Patch Changes diff --git a/packages/integration/api-report.md b/packages/integration/api-report.md index d45c8ca06b..928b888a93 100644 --- a/packages/integration/api-report.md +++ b/packages/integration/api-report.md @@ -38,6 +38,9 @@ export type AwsS3IntegrationConfig = { externalId?: string; }; +// @public +export type AzureCredential = ClientSecret | ManagedIdentity; + // @public export class AzureIntegration implements ScmIntegration { constructor(integrationConfig: AzureIntegrationConfig); @@ -63,6 +66,7 @@ export class AzureIntegration implements ScmIntegration { export type AzureIntegrationConfig = { host: string; token?: string; + credential?: AzureCredential; }; // @public @@ -154,6 +158,13 @@ export type BitbucketServerIntegrationConfig = { password?: string; }; +// @public +export type ClientSecret = { + tenantId: string; + clientId: string; + clientSecret: string; +}; + // @public export class DefaultGithubCredentialsProvider implements GithubCredentialsProvider @@ -165,6 +176,18 @@ export class DefaultGithubCredentialsProvider getCredentials(opts: { url: string }): Promise; } +// @public +export class DefaultGitlabCredentialsProvider + implements GitlabCredentialsProvider +{ + // (undocumented) + static fromIntegrations( + integrations: ScmIntegrationRegistry, + ): DefaultGitlabCredentialsProvider; + // (undocumented) + getCredentials(opts: { url: string }): Promise; +} + // @public export function defaultScmResolveUrl(options: { url: string; @@ -216,9 +239,9 @@ export function getAzureFileFetchUrl(url: string): string; export function getAzureRequestOptions( config: AzureIntegrationConfig, additionalHeaders?: Record, -): { +): Promise<{ headers: Record; -}; +}>; // @public export function getBitbucketCloudDefaultBranch( @@ -478,6 +501,20 @@ export type GithubIntegrationConfig = { apps?: GithubAppConfig[]; }; +// @public (undocumented) +export type GitlabCredentials = { + headers?: { + [name: string]: string; + }; + token?: string; +}; + +// @public (undocumented) +export interface GitlabCredentialsProvider { + // (undocumented) + getCredentials(opts: { url: string }): Promise; +} + // @public export class GitLabIntegration implements ScmIntegration { constructor(integrationConfig: GitLabIntegrationConfig); @@ -535,6 +572,11 @@ export interface IntegrationsByType { gitlab: ScmIntegrationsGroup; } +// @public +export type ManagedIdentity = { + clientId: string; +}; + // @public export function parseGerritGitilesUrl( config: GerritIntegrationConfig, diff --git a/packages/integration/package.json b/packages/integration/package.json index 14b64b3089..29eebda4b6 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.5", + "version": "1.5.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,6 +32,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { + "@azure/identity": "^3.2.1", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@octokit/auth-app": "^4.0.0", diff --git a/packages/integration/src/azure/config.test.ts b/packages/integration/src/azure/config.test.ts index 353065a030..54711e4ddb 100644 --- a/packages/integration/src/azure/config.test.ts +++ b/packages/integration/src/azure/config.test.ts @@ -51,19 +51,42 @@ describe('readAzureIntegrationConfig', () => { return new ConfigReader((processed[0].data as any).integrations.azure[0]); } - it('reads all values', () => { + it('reads all values when using a token', () => { const output = readAzureIntegrationConfig( buildConfig({ host: 'a.com', token: 't', }), ); + expect(output).toEqual({ host: 'a.com', token: 't', }); }); + it('reads all values when using a credential', () => { + const output = readAzureIntegrationConfig( + buildConfig({ + host: 'dev.azure.com', + credential: { + clientId: 'id', + clientSecret: 'secret', + tenantId: 'tenant', + }, + }), + ); + + expect(output).toEqual({ + host: 'dev.azure.com', + credential: { + clientId: 'id', + clientSecret: 'secret', + tenantId: 'tenant', + }, + }); + }); + it('inserts the defaults if missing', () => { const output = readAzureIntegrationConfig(buildConfig({})); expect(output).toEqual({ host: 'dev.azure.com' }); @@ -71,15 +94,86 @@ describe('readAzureIntegrationConfig', () => { it('rejects funky configs', () => { const valid: any = { - host: 'a.com', - token: 't', + host: 'dev.azure.com', }; + expect(() => readAzureIntegrationConfig(buildConfig({ ...valid, host: 7 })), ).toThrow(/host/); + expect(() => readAzureIntegrationConfig(buildConfig({ ...valid, token: 7 })), ).toThrow(/token/); + + expect(() => + readAzureIntegrationConfig(buildConfig({ ...valid, credential: 7 })), + ).toThrow(/credential/); + + expect(() => + readAzureIntegrationConfig( + buildConfig({ ...valid, credential: { clientId: 7 } }), + ), + ).toThrow(/credential/); + + expect(() => + readAzureIntegrationConfig( + buildConfig({ ...valid, credential: { clientSecret: 7 } }), + ), + ).toThrow(/credential/); + + expect(() => + readAzureIntegrationConfig( + buildConfig({ ...valid, credential: { tenantId: 7 } }), + ), + ).toThrow(/credential/); + + expect(() => + readAzureIntegrationConfig(buildConfig({ ...valid, credential: {} })), + ).toThrow(/credential/); + + expect(() => + readAzureIntegrationConfig( + buildConfig({ ...valid, credential: { clientSecret: 'secret' } }), + ), + ).toThrow(/credential/); + + expect(() => + readAzureIntegrationConfig( + buildConfig({ ...valid, credential: { tenantId: 'tenant' } }), + ), + ).toThrow(/credential/); + + expect(() => + readAzureIntegrationConfig( + buildConfig({ + ...valid, + credential: { clientId: 'id', clientSecret: 'secret' }, + }), + ), + ).toThrow(/credential/); + + expect(() => + readAzureIntegrationConfig( + buildConfig({ + ...valid, + credential: { clientId: 'id', tenantId: 'tenant' }, + }), + ), + ).toThrow(/credential/); + + expect(() => + readAzureIntegrationConfig( + buildConfig({ + ...valid, + host: 'a.com', + credential: { + clientId: 'id', + tenantId: 'tenant', + clientSecret: 'secret', + }, + }), + ), + ).toThrow(/credential/); }); it('works on the frontend', async () => { @@ -101,7 +195,7 @@ describe('readAzureIntegrationConfigs', () => { return data.map(item => new ConfigReader(item)); } - it('reads all values', () => { + it('reads all values when using a token', () => { const output = readAzureIntegrationConfigs( buildConfig([ { @@ -116,6 +210,29 @@ describe('readAzureIntegrationConfigs', () => { }); }); + it('reads all values when using a credential', () => { + const output = readAzureIntegrationConfigs( + buildConfig([ + { + host: 'dev.azure.com', + credential: { + clientId: 'id', + clientSecret: 'secret', + tenantId: 'tenant', + }, + }, + ]), + ); + expect(output).toContainEqual({ + host: 'dev.azure.com', + credential: { + clientId: 'id', + clientSecret: 'secret', + tenantId: 'tenant', + }, + }); + }); + it('adds a default entry when missing', () => { const output = readAzureIntegrationConfigs(buildConfig([])); expect(output).toEqual([ diff --git a/packages/integration/src/azure/config.ts b/packages/integration/src/azure/config.ts index 2d722d1589..6d80bee516 100644 --- a/packages/integration/src/azure/config.ts +++ b/packages/integration/src/azure/config.ts @@ -38,6 +38,71 @@ export type AzureIntegrationConfig = { * If no token is specified, anonymous access is used. */ token?: string; + + /** + * The credential to use for requests. + * + * If no credential is specified anonymous access is used. + */ + credential?: AzureCredential; +}; + +/** + * Authenticate using a client secret that was generated for an App Registration. + * @public + */ +export type ClientSecret = { + /** + * The Azure Active Directory tenant + */ + tenantId: string; + /** + * The client id + */ + clientId: string; + + /** + * The client secret + */ + clientSecret: string; +}; + +/** + * Authenticate using a managed identity available at the deployment environment. + * @public + */ +export type ManagedIdentity = { + /** + * The clientId + */ + clientId: string; +}; + +/** + * Credential used to authenticate to Azure Active Directory. + * @public + */ +export type AzureCredential = ClientSecret | ManagedIdentity; +export const isServicePrincipal = ( + credential: Partial, +): credential is ClientSecret => { + const clientSecretCredential = credential as ClientSecret; + + return ( + Object.keys(credential).length === 3 && + clientSecretCredential.clientId !== undefined && + clientSecretCredential.clientSecret !== undefined && + clientSecretCredential.tenantId !== undefined + ); +}; + +export const isManagedIdentity = ( + credential: Partial, +): credential is ManagedIdentity => { + return ( + Object.keys(credential).length === 1 && + (credential as ManagedIdentity).clientId !== undefined + ); }; /** @@ -52,13 +117,43 @@ export function readAzureIntegrationConfig( const host = config.getOptionalString('host') ?? AZURE_HOST; const token = config.getOptionalString('token'); + const credential = config.getOptional('credential') + ? { + tenantId: config.getOptionalString('credential.tenantId'), + clientId: config.getOptionalString('credential.clientId'), + clientSecret: config.getOptionalString('credential.clientSecret'), + } + : undefined; + if (!isValidHost(host)) { throw new Error( `Invalid Azure integration config, '${host}' is not a valid host`, ); } - return { host, token }; + if ( + credential && + !isServicePrincipal(credential) && + !isManagedIdentity(credential) + ) { + throw new Error( + `Invalid Azure integration config, credential is not valid`, + ); + } + + if (credential && host !== AZURE_HOST) { + throw new Error( + `Invalid Azure integration config, credential can only be used with ${AZURE_HOST}`, + ); + } + + if (credential && token) { + throw new Error( + `Invalid Azure integration config, specify either a token or a credential but not both`, + ); + } + + return { host, token, credential }; } /** diff --git a/packages/integration/src/azure/core.test.ts b/packages/integration/src/azure/core.test.ts index ad8f2691b5..e6ef5401ac 100644 --- a/packages/integration/src/azure/core.test.ts +++ b/packages/integration/src/azure/core.test.ts @@ -19,21 +19,85 @@ import { getAzureDownloadUrl, getAzureRequestOptions, } from './core'; +import { + AccessToken, + ClientSecretCredential, + ManagedIdentityCredential, +} from '@azure/identity'; + +const MockedClientSecretCredential = ClientSecretCredential as jest.MockedClass< + typeof ClientSecretCredential +>; + +const MockedManagedIdentityCredential = + ManagedIdentityCredential as jest.MockedClass< + typeof ManagedIdentityCredential + >; + +jest.mock('@azure/identity'); + +MockedClientSecretCredential.prototype.getToken.mockImplementation(() => + Promise.resolve({ token: 'fake-client-secret-token' } as AccessToken), +); +MockedManagedIdentityCredential.prototype.getToken.mockImplementation(() => + Promise.resolve({ token: 'fake-managed-identity-token' } as AccessToken), +); describe('azure core', () => { describe('getAzureRequestOptions', () => { - it('fills in the token if necessary', () => { - expect(getAzureRequestOptions({ host: '', token: '0123456789' })).toEqual( + it('should not add authorization header when not using token or credential', async () => { + expect(await getAzureRequestOptions({ host: '' })).toEqual( + expect.objectContaining({ + headers: expect.not.objectContaining({ + Authorization: expect.anything(), + }), + }), + ); + }); + + it('should add authorization header when using a personal access token', async () => { + expect( + await getAzureRequestOptions({ host: '', token: '0123456789' }), + ).toEqual( expect.objectContaining({ headers: expect.objectContaining({ Authorization: 'Basic OjAxMjM0NTY3ODk=', }), }), ); - expect(getAzureRequestOptions({ host: '' })).toEqual( + }); + + it('should add authorization header when using a client secret', async () => { + expect( + await getAzureRequestOptions({ + host: '', + credential: { + clientId: 'fake-id', + clientSecret: 'fake-secret', + tenantId: 'fake-tenant', + }, + }), + ).toEqual( expect.objectContaining({ - headers: expect.not.objectContaining({ - Authorization: expect.anything(), + headers: expect.objectContaining({ + Authorization: 'Bearer fake-client-secret-token', + }), + }), + ); + }); + + it('should add authorization header when using a managed identity', async () => { + expect( + await getAzureRequestOptions({ + host: '', + credential: { + clientId: 'fake-id', + }, + }), + ).toEqual( + expect.objectContaining({ + headers: expect.objectContaining({ + Authorization: 'Bearer fake-managed-identity-token', }), }), ); diff --git a/packages/integration/src/azure/core.ts b/packages/integration/src/azure/core.ts index 1d5c4c3c89..cd0345b1f8 100644 --- a/packages/integration/src/azure/core.ts +++ b/packages/integration/src/azure/core.ts @@ -15,7 +15,15 @@ */ import { AzureUrl } from './AzureUrl'; -import { AzureIntegrationConfig } from './config'; +import { + AzureIntegrationConfig, + isManagedIdentity, + isServicePrincipal, +} from './config'; +import { + ClientSecretCredential, + ManagedIdentityCredential, +} from '@azure/identity'; /** * Given a URL pointing to a file on a provider, returns a URL that is suitable @@ -59,17 +67,37 @@ export function getAzureCommitsUrl(url: string): string { * Gets the request options necessary to make requests to a given provider. * * @param config - The relevant provider config + * @param additionalHeaders - Additional headers for the request * @public */ -export function getAzureRequestOptions( +export async function getAzureRequestOptions( config: AzureIntegrationConfig, additionalHeaders?: Record, -): { headers: Record } { +): Promise<{ headers: Record }> { + const azureDevOpsScope = '499b84ac-1321-427f-aa17-267ca6975798/.default'; const headers: Record = additionalHeaders ? { ...additionalHeaders } : {}; - if (config.token) { + const { token, credential } = config; + if (credential) { + if (isServicePrincipal(credential)) { + const servicePrincipal = new ClientSecretCredential( + credential.tenantId, + credential.clientId, + credential.clientSecret, + ); + + const accessToken = await servicePrincipal.getToken(azureDevOpsScope); + headers.Authorization = `Bearer ${accessToken.token}`; + } else if (isManagedIdentity(credential)) { + const managedIdentity = new ManagedIdentityCredential( + credential.clientId, + ); + const accessToken = await managedIdentity.getToken(azureDevOpsScope); + headers.Authorization = `Bearer ${accessToken.token}`; + } + } else if (token) { const buffer = Buffer.from(`:${config.token}`, 'utf8'); headers.Authorization = `Basic ${buffer.toString('base64')}`; } diff --git a/packages/integration/src/azure/index.ts b/packages/integration/src/azure/index.ts index d079799c01..808043fdb0 100644 --- a/packages/integration/src/azure/index.ts +++ b/packages/integration/src/azure/index.ts @@ -19,7 +19,12 @@ export { readAzureIntegrationConfig, readAzureIntegrationConfigs, } from './config'; -export type { AzureIntegrationConfig } from './config'; +export type { + AzureIntegrationConfig, + AzureCredential, + ManagedIdentity, + ClientSecret, +} from './config'; export { getAzureCommitsUrl, getAzureDownloadUrl, diff --git a/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts b/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts index 402a62d97c..dc3a86b72b 100644 --- a/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts +++ b/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts @@ -174,8 +174,10 @@ class GithubAppManager { const allInstallations = await this.getInstallations(); const installation = allInstallations.find( inst => - inst.account?.login?.toLocaleLowerCase('en-US') === - owner.toLocaleLowerCase('en-US'), + inst.account && + 'login' in inst.account && + inst.account.login?.toLocaleLowerCase('en-US') === + owner.toLocaleLowerCase('en-US'), ); if (installation) { return { diff --git a/packages/integration/src/gitlab/DefaultGitlabCredentialsProvider.ts b/packages/integration/src/gitlab/DefaultGitlabCredentialsProvider.ts new file mode 100644 index 0000000000..71e9a1e2b7 --- /dev/null +++ b/packages/integration/src/gitlab/DefaultGitlabCredentialsProvider.ts @@ -0,0 +1,57 @@ +/* + * 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 { ScmIntegrationRegistry } from '../registry'; +import { SingleInstanceGitlabCredentialsProvider } from './SingleInstanceGitlabCredentialsProvider'; +import { GitlabCredentials, GitlabCredentialsProvider } from './types'; + +/** + * Handles the creation and caching of credentials for GitLab integrations. + * + * @public + */ +export class DefaultGitlabCredentialsProvider + implements GitlabCredentialsProvider +{ + static fromIntegrations(integrations: ScmIntegrationRegistry) { + const credentialsProviders: Map = + new Map(); + + integrations.gitlab.list().forEach(integration => { + const credentialsProvider = + SingleInstanceGitlabCredentialsProvider.create(integration.config); + credentialsProviders.set(integration.config.host, credentialsProvider); + }); + return new DefaultGitlabCredentialsProvider(credentialsProviders); + } + + private constructor( + private readonly providers: Map, + ) {} + + async getCredentials(opts: { url: string }): Promise { + const parsed = new URL(opts.url); + const provider = this.providers.get(parsed.host); + + if (!provider) { + throw new Error( + `There is no GitLab integration that matches ${opts.url}. Please add a configuration for an integration.`, + ); + } + + return provider.getCredentials(opts); + } +} diff --git a/packages/integration/src/gitlab/SingleInstanceGitlabCredentialsProvider.ts b/packages/integration/src/gitlab/SingleInstanceGitlabCredentialsProvider.ts new file mode 100644 index 0000000000..85c8fc8ab5 --- /dev/null +++ b/packages/integration/src/gitlab/SingleInstanceGitlabCredentialsProvider.ts @@ -0,0 +1,43 @@ +/* + * 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 { GitLabIntegrationConfig } from './config'; +import { GitlabCredentials, GitlabCredentialsProvider } from './types'; + +export class SingleInstanceGitlabCredentialsProvider + implements GitlabCredentialsProvider +{ + static create: ( + config: GitLabIntegrationConfig, + ) => GitlabCredentialsProvider = config => { + return new SingleInstanceGitlabCredentialsProvider(config.token); + }; + + private constructor(private readonly token?: string) {} + + async getCredentials(_opts: { url: string }): Promise { + if (!this.token) { + return {}; + } + + return { + headers: { + Authorization: `Bearer ${this.token}`, + }, + token: this.token, + }; + } +} diff --git a/packages/integration/src/gitlab/index.ts b/packages/integration/src/gitlab/index.ts index 1a5063c51c..82ba460dab 100644 --- a/packages/integration/src/gitlab/index.ts +++ b/packages/integration/src/gitlab/index.ts @@ -22,3 +22,5 @@ export { export type { GitLabIntegrationConfig } from './config'; export { getGitLabFileFetchUrl, getGitLabRequestOptions } from './core'; export { GitLabIntegration, replaceGitLabUrlType } from './GitLabIntegration'; +export { DefaultGitlabCredentialsProvider } from './DefaultGitlabCredentialsProvider'; +export type { GitlabCredentials, GitlabCredentialsProvider } from './types'; diff --git a/packages/integration/src/gitlab/types.ts b/packages/integration/src/gitlab/types.ts new file mode 100644 index 0000000000..b980aaba7b --- /dev/null +++ b/packages/integration/src/gitlab/types.ts @@ -0,0 +1,30 @@ +/* + * 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. + */ + +/** + * @public + */ +export type GitlabCredentials = { + headers?: { [name: string]: string }; + token?: string; +}; + +/** + * @public + */ +export interface GitlabCredentialsProvider { + getCredentials(opts: { url: string }): Promise; +} diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 7f1ece48d4..7c088df93d 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/repo-tools +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/cli-node@0.1.1-next.0 + - @backstage/cli-common@0.1.12 + ## 0.3.0 ### Minor Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 85f683a999..934d0d5d8f 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.3.0", + "version": "0.3.1-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 798ceb5317..bec57f1607 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,24 @@ # techdocs-cli-embedded-app +## 0.2.83-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.11.1-next.1 + - @backstage/plugin-techdocs@1.6.3-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli@0.22.8-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/app-defaults@1.4.0-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/config@1.0.7 + - @backstage/test-utils@1.4.0-next.1 + - @backstage/theme@0.4.0-next.0 + ## 0.2.83-next.0 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 27da72de5f..c435039eb4 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.83-next.0", + "version": "0.2.83-next.1", "private": true, "backstage": { "role": "frontend" diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 49cf10e01a..4f9cdbcb37 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @techdocs/cli +## 1.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-techdocs-node@1.7.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + ## 1.4.3-next.0 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 5d25f057f6..6fe3b68b79 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.3-next.0", + "version": "1.4.3-next.1", "publishConfig": { "access": "public" }, diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 4463f5646c..fc8906e943 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/test-utils +## 1.4.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.13-next.0 + ## 1.4.0-next.0 ### Minor Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 992075922e..c8c1676834 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.4.0-next.0", + "version": "1.4.0-next.1", "publishConfig": { "access": "public" }, diff --git a/packages/theme/src/unified/UnifiedThemeProvider.tsx b/packages/theme/src/unified/UnifiedThemeProvider.tsx index c7054e0e55..613f89d5e0 100644 --- a/packages/theme/src/unified/UnifiedThemeProvider.tsx +++ b/packages/theme/src/unified/UnifiedThemeProvider.tsx @@ -16,7 +16,11 @@ import React, { ReactNode } from 'react'; import './MuiClassNameSetup'; -import { ThemeProvider } from '@material-ui/core/styles'; +import { + ThemeProvider, + StylesProvider, + createGenerateClassName, +} from '@material-ui/core/styles'; import { StyledEngineProvider, ThemeProvider as Mui5Provider, @@ -35,6 +39,14 @@ export interface UnifiedThemeProviderProps { noCssBaseline?: boolean; } +// Background at https://mui.com/x/migration/migration-data-grid-v4/#using-mui-core-v4-with-v5 +// Rather than disabling globals and custom seed, we instead only set a production prefix that +// won't collide with MUI 5 styles. We've already got a separate class name generator for v5 set +// up in MuiClassNameSetup.ts, so only the production JSS needs deduplication. +const generateV4ClassName = createGenerateClassName({ + productionPrefix: 'jss4-', +}); + /** * Provides themes for all MUI versions supported by the provided unified theme. * @@ -61,7 +73,11 @@ export function UnifiedThemeProvider( ); if (v4Theme) { - result = {result}; + result = ( + + {result} + + ); } if (v5Theme) { diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index e4e23e4b66..186a7f677f 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-adr-backend +## 0.3.4-next.1 + +### Patch Changes + +- 58524588448c: Use front matter parser for MADR v3 formatted ADRs when indexing status/date +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-adr-common@0.2.10-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.3.4-next.0 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index b693d3e8c2..d891b15e76 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.4-next.0", + "version": "0.3.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr-backend/src/search/madrParser.ts b/plugins/adr-backend/src/search/madrParser.ts index c992ef125e..0dd1437538 100644 --- a/plugins/adr-backend/src/search/madrParser.ts +++ b/plugins/adr-backend/src/search/madrParser.ts @@ -16,7 +16,10 @@ import { DateTime } from 'luxon'; import { marked } from 'marked'; -import { MADR_DATE_FORMAT } from '@backstage/plugin-adr-common'; +import { + MADR_DATE_FORMAT, + parseMadrWithFrontmatter, +} from '@backstage/plugin-adr-common'; const getTitle = (tokens: marked.TokensList): string | undefined => { return ( @@ -26,22 +29,6 @@ const getTitle = (tokens: marked.TokensList): string | undefined => { )?.text; }; -const getStatusForV3Format = (tokens: marked.TokensList): string | undefined => - ( - tokens.find( - t => - t.type === 'heading' && - t.depth === 2 && - t.text.toLowerCase().includes('status:'), - ) as marked.Tokens.Text - )?.text - .toLowerCase() - .split('\n') - .find(l => /^status:/.test(l)) - ?.replace(/^status:/i, '') - .trim() - .toLocaleLowerCase('en-US'); - const getStatusForV2Format = (tokens: marked.TokensList): string | undefined => (tokens.find(t => t.type === 'list') as marked.Tokens.List)?.items ?.find(t => /^status:/i.test(t.text)) @@ -49,71 +36,45 @@ const getStatusForV2Format = (tokens: marked.TokensList): string | undefined => .trim() .toLocaleLowerCase('en-US'); -const getDateForV3Format = ( - tokens: marked.TokensList, - dateFormat: string, -): string | undefined => { - let adrDateTime: DateTime | undefined; - const dateLine = ( - tokens.find( - t => - t.type === 'heading' && - t.depth === 2 && - t.text.toLowerCase().includes('date:'), - ) as marked.Tokens.Text - )?.text - .toLowerCase() - .split('\n') - .find(l => /^date:/.test(l)); - - if (dateLine) { - adrDateTime = DateTime.fromFormat( - dateLine.replace(/^date:/i, '').trim(), - dateFormat, - ); - } - return adrDateTime?.isValid - ? adrDateTime.toFormat(MADR_DATE_FORMAT) - : undefined; -}; - -const getDateForV2Format = ( - tokens: marked.TokensList, - dateFormat: string, -): string | undefined => { +const getDateForV2Format = (tokens: marked.TokensList): string | undefined => { const listTokens = (tokens.find(t => t.type === 'list') as marked.Tokens.List) ?.items; - const adrDateTime = DateTime.fromFormat( - listTokens - ?.find(t => /^date:/i.test(t.text)) - ?.text.replace(/^date:/i, '') - .trim() ?? '', - dateFormat, - ); - return adrDateTime?.isValid - ? adrDateTime.toFormat(MADR_DATE_FORMAT) - : undefined; + const adrDateTime = listTokens + ?.find(t => /^date:/i.test(t.text)) + ?.text.replace(/^date:/i, '') + .trim(); + return adrDateTime; }; -const getStatus = (tokens: marked.TokensList): string | undefined => { - return getStatusForV3Format(tokens) ?? getStatusForV2Format(tokens); +const getStatus = ( + tokens: marked.TokensList, + frontMatterStatus?: string, +): string | undefined => { + return frontMatterStatus ?? getStatusForV2Format(tokens); }; const getDate = ( tokens: marked.TokensList, dateFormat: string, -): string | undefined => - getDateForV3Format(tokens, dateFormat) ?? - getDateForV2Format(tokens, dateFormat); + frontMatterDate?: string, +): string | undefined => { + const dateString = frontMatterDate ?? getDateForV2Format(tokens); + if (!dateString) { + return undefined; + } + const date = DateTime.fromFormat(dateString, dateFormat); + return date?.isValid ? date.toFormat(MADR_DATE_FORMAT) : undefined; +}; export const madrParser = (content: string, dateFormat = MADR_DATE_FORMAT) => { - const tokens = marked.lexer(content); + const preparsed = parseMadrWithFrontmatter(content); + const tokens = marked.lexer(preparsed.content); if (!tokens.length) { throw new Error('ADR has no content'); } return { title: getTitle(tokens), - status: getStatus(tokens), - date: getDate(tokens, dateFormat), + status: getStatus(tokens, preparsed.status), + date: getDate(tokens, dateFormat, preparsed.date), }; }; diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md index 9fddae2588..6079c13146 100644 --- a/plugins/adr-common/CHANGELOG.md +++ b/plugins/adr-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-adr-common +## 0.2.10-next.0 + +### Patch Changes + +- 58524588448c: Add utility function for parsing MADR front matter +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.2.9 ### Patch Changes diff --git a/plugins/adr-common/api-report.md b/plugins/adr-common/api-report.md index 0236b355a5..a36854f0e7 100644 --- a/plugins/adr-common/api-report.md +++ b/plugins/adr-common/api-report.md @@ -35,4 +35,15 @@ export const MADR_DATE_FORMAT = 'yyyy-MM-dd'; // @public export const madrFilePathFilter: AdrFilePathFilterFn; + +// @public +export interface ParsedMadr { + attributes: Record; + content: string; + date?: string; + status?: string; +} + +// @public +export const parseMadrWithFrontmatter: (content: string) => ParsedMadr; ``` diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json index adbb6bea58..4c4f3fc405 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.9", + "version": "0.2.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,7 +31,8 @@ "dependencies": { "@backstage/catalog-model": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-search-common": "workspace:^" + "@backstage/plugin-search-common": "workspace:^", + "front-matter": "^4.0.2" }, "devDependencies": { "@backstage/cli": "workspace:^" diff --git a/plugins/adr-common/src/index.ts b/plugins/adr-common/src/index.ts index cf71367cba..194f4899d1 100644 --- a/plugins/adr-common/src/index.ts +++ b/plugins/adr-common/src/index.ts @@ -20,6 +20,7 @@ import { Entity, getEntitySourceLocation } from '@backstage/catalog-model'; import { IndexableDocument } from '@backstage/plugin-search-common'; import { ScmIntegrationRegistry } from '@backstage/integration'; +import frontMatter from 'front-matter'; /** * ADR plugin annotation. @@ -101,3 +102,43 @@ export interface AdrDocument extends IndexableDocument { */ date?: string; } + +/** + * Parsed MADR document with front matter (if present) parsed and extracted from the main markdown content. + * @public + */ +export interface ParsedMadr { + /** + * Main body of ADR content (with any front matter removed) + */ + content: string; + /** + * ADR status + */ + status?: string; + /** + * ADR date + */ + date?: string; + /** + * All attributes parsed from front matter + */ + attributes: Record; +} + +/** + * Utility function to parse raw markdown content for an ADR and extract any metadata found as "front matter" at the top of the Markdown document. + * @param content - Raw markdown content which may (optionally) include front matter + * @public + */ +export const parseMadrWithFrontmatter = (content: string): ParsedMadr => { + const parsed = frontMatter>(content); + const status = parsed.attributes.status; + const date = parsed.attributes.date; + return { + content: parsed.body, + status: status ? String(status) : undefined, + date: date ? String(date) : undefined, + attributes: parsed.attributes, + }; +}; diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index 5a16413811..dc2c2eb461 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-adr +## 0.6.1-next.1 + +### Patch Changes + +- 58524588448c: Render table of front matter metadata when displaying MADR v3 formatted ADR +- Updated dependencies + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-adr-common@0.2.10-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.6.1-next.0 ### Patch Changes diff --git a/plugins/adr/README.md b/plugins/adr/README.md index 7feb9b03b0..e6178f003b 100644 --- a/plugins/adr/README.md +++ b/plugins/adr/README.md @@ -113,7 +113,7 @@ import { AdrDocument } from '@backstage/plugin-adr-common'; ## Custom ADR formats -By default, this plugin will parse ADRs according to the format specified by the [Markdown Architecture Decision Record (MADR) v2.x template](https://github.com/adr/madr/tree/2.1.2). If your ADRs are written using a different format, you can apply the following customizations to correctly identify and parse your documents: +By default, this plugin will parse ADRs according to the format specified by the [Markdown Architecture Decision Record (MADR) v2.x template](https://github.com/adr/madr/tree/2.1.2) or the [Markdown Any Decision Record (MADR) 3.x template](https://github.com/adr/madr/tree/3.0.0). If your ADRs are written using a different format, you can apply the following customizations to correctly identify and parse your documents: ### Custom Filename/Path Format @@ -135,7 +135,7 @@ const myCustomFilterFn: AdrFilePathFilterFn = (path: string): boolean => { ### Custom Content Decorators -Your ADR Markdown content will typically be rendered in the UI as is with the exception of relative links/embeds being rewritten as absolute URLs so they can be linked correctly (e.g. `./my-diagram.png` => `/my-diagram.png`). Depending on your ADR format, you may want to apply additional transformations to the content (e.g. parsing/ignoring front matter). You can do so by passing in a list of custom content decorators for the optional `contentDecorators` parameter. Note that passing in this parameter will override the default decorators. If you want to include the default ones, make sure to add them as well: +Your ADR Markdown content will typically be rendered in the UI as is with the exception of relative links/embeds being rewritten as absolute URLs so they can be linked correctly (e.g. `./my-diagram.png` => `/my-diagram.png`). Depending on your ADR format, you may want to apply additional transformations to the content (e.g. hiding or formatting front matter in a different way). You can do so by passing in a list of custom content decorators for the optional `contentDecorators` parameter. Note that passing in this parameter will override the default decorators. If you want to include the default ones, make sure to add them as well: ```tsx import { @@ -154,6 +154,7 @@ const myCustomDecorator: AdrContentDecorator = ({ content }) => { diff --git a/plugins/adr/api-report.md b/plugins/adr/api-report.md index dceca2411c..4cec5047fc 100644 --- a/plugins/adr/api-report.md +++ b/plugins/adr/api-report.md @@ -80,6 +80,7 @@ export const AdrReader: { decorators: Readonly<{ createRewriteRelativeLinksDecorator(): AdrContentDecorator; createRewriteRelativeEmbedsDecorator(): AdrContentDecorator; + createFrontMatterFormatterDecorator(): AdrContentDecorator; }>; }; diff --git a/plugins/adr/examples/component/catalog-info.yaml b/plugins/adr/examples/component/catalog-info.yaml new file mode 100644 index 0000000000..580110243f --- /dev/null +++ b/plugins/adr/examples/component/catalog-info.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: component-with-adrs + title: Component With ADRs + description: A Service with ADRs registerd + annotations: + backstage.io/adr-location: https://github.com/adr/madr/tree/develop/docs/decisions +spec: + type: service + lifecycle: experimental + owner: user:guest diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 41653dc1dc..40837406d8 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.6.1-next.0", + "version": "0.6.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/src/components/AdrReader/AdrReader.tsx b/plugins/adr/src/components/AdrReader/AdrReader.tsx index ad99ce3a5a..6b07eee4cd 100644 --- a/plugins/adr/src/components/AdrReader/AdrReader.tsx +++ b/plugins/adr/src/components/AdrReader/AdrReader.tsx @@ -59,6 +59,7 @@ export const AdrReader = (props: { const adrDecorators = decorators ?? [ adrDecoratorFactories.createRewriteRelativeLinksDecorator(), adrDecoratorFactories.createRewriteRelativeEmbedsDecorator(), + adrDecoratorFactories.createFrontMatterFormatterDecorator(), ]; return adrDecorators.reduce( diff --git a/plugins/adr/src/components/AdrReader/decorators.ts b/plugins/adr/src/components/AdrReader/decorators.ts index f24bb48a00..980eab5179 100644 --- a/plugins/adr/src/components/AdrReader/decorators.ts +++ b/plugins/adr/src/components/AdrReader/decorators.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { parseMadrWithFrontmatter } from '@backstage/plugin-adr-common'; import { AdrContentDecorator } from './types'; /** @@ -44,4 +45,23 @@ export const adrDecoratorFactories = Object.freeze({ ), }); }, + /** + * Formats YAML front-matter into a table format (if any exists in the markdown document) + */ + createFrontMatterFormatterDecorator(): AdrContentDecorator { + return ({ content }) => { + const parsedFrontmatter = parseMadrWithFrontmatter(content); + let table = ''; + const attrs = parsedFrontmatter.attributes; + if (Object.keys(attrs).length > 0) { + const stripNewLines = (val: unknown) => + String(val).replaceAll('\n', '
'); + const row = (vals: string[]) => `|${vals.join('|')}|\n`; + table = `${row(Object.keys(attrs))}`; + table += `${row(Object.keys(attrs).map(() => '---'))}`; + table += `${row(Object.values(attrs).map(stripNewLines))}\n\n`; + } + return { content: table + parsedFrontmatter.content }; + }; + }, }); diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index 99bc787d74..a5dd0f1089 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-airbrake-backend +## 0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/config@1.0.7 + ## 0.2.19-next.0 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index 6754446993..a35b37bcb8 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.19-next.0", + "version": "0.2.19-next.1", "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 dbc923f75c..484f124645 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-airbrake +## 0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/dev-utils@1.0.16-next.1 + - @backstage/test-utils@1.4.0-next.1 + - @backstage/theme@0.4.0-next.0 + ## 0.3.19-next.0 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index f7034ced40..0ddf3d51a0 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.19-next.0", + "version": "0.3.19-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index f7462e5bc3..c602614499 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-allure +## 0.1.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.35-next.0 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index af095a2901..3f0718e1b9 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.35-next.0", + "version": "0.1.35-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index 7ead93c55e..69b641e8ca 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-analytics-module-ga +## 0.1.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + ## 0.1.30-next.0 ### Patch Changes diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index 5851edf627..c2e34774c2 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.30-next.0", + "version": "0.1.30-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga4/CHANGELOG.md b/plugins/analytics-module-ga4/CHANGELOG.md index dd9d87b2c4..7f64c178c1 100644 --- a/plugins/analytics-module-ga4/CHANGELOG.md +++ b/plugins/analytics-module-ga4/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-analytics-module-ga4 +## 0.1.1-next.1 + +### Patch Changes + +- 99056db6169e: Fixed configuration visibility settings for `allowedContexts` and `allowedAttributes` +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/analytics-module-ga4/README.md b/plugins/analytics-module-ga4/README.md index 97bb751ca8..93138a8235 100644 --- a/plugins/analytics-module-ga4/README.md +++ b/plugins/analytics-module-ga4/README.md @@ -61,7 +61,13 @@ backend: csp: connect-src: ["'self'", 'http:', 'https:'] # Add these two lines below - script-src: ["'self'", "'unsafe-eval'", 'https://www.google-analytics.com'] + script-src: + [ + "'self'", + "'unsafe-eval'", + 'https://www.google-analytics.com', + 'https://www.googletagmanager.com', + ] img-src: ["'self'", 'data:', 'https://www.google-analytics.com'] ``` diff --git a/plugins/analytics-module-ga4/config.d.ts b/plugins/analytics-module-ga4/config.d.ts index d90ccb5938..4834d75f58 100644 --- a/plugins/analytics-module-ga4/config.d.ts +++ b/plugins/analytics-module-ga4/config.d.ts @@ -80,14 +80,14 @@ export interface Config { * metadata will be captured in Google Analytics. * Contexts that will be sent as parameters in the event. * context-name will be prefixed by c_, for example, pluginId will be c_pluginId in the event. - * + * @visibility frontend */ allowedContexts?: string[] | ['*']; /** * * Attributes that will be sent as parameters in the event * attribute-name will be prefixed by a_, for example , testAttribute will be c_testAttribute in the event. - * + * @visibility frontend */ allowedAttributes?: string[] | ['*']; }; diff --git a/plugins/analytics-module-ga4/package.json b/plugins/analytics-module-ga4/package.json index 80dd77e11b..d3b8f51fa8 100644 --- a/plugins/analytics-module-ga4/package.json +++ b/plugins/analytics-module-ga4/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga4", - "version": "0.1.1-next.0", + "version": "0.1.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index 410286ecf1..b2b954b8e1 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-apache-airflow +## 0.2.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + ## 0.2.12-next.0 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index 569f256318..95304c31f9 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.12-next.0", + "version": "0.2.12-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index afad944485..2072d4d257 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-api-docs +## 0.9.4-next.1 + +### Patch Changes + +- 83bdc3a555c1: Replaced usages of `theme.palette.theme.hint` with `theme.palette.text.secondary` as it has been removed in MUI v5 +- Updated dependencies + - @backstage/plugin-catalog@1.11.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.9.4-next.0 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index be31cea662..ea79b9b7a2 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.4-next.0", + "version": "0.9.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs/src/components/ApiDefinitionCard/ApiDefinitionCard.test.tsx b/plugins/api-docs/src/components/ApiDefinitionCard/ApiDefinitionCard.test.tsx index e2938dc9fc..eda3597225 100644 --- a/plugins/api-docs/src/components/ApiDefinitionCard/ApiDefinitionCard.test.tsx +++ b/plugins/api-docs/src/components/ApiDefinitionCard/ApiDefinitionCard.test.tsx @@ -30,7 +30,7 @@ describe('', () => { const apiDocsConfig: jest.Mocked = { getApiDefinitionWidget: jest.fn(), } as any; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( diff --git a/plugins/api-docs/src/components/ApiDefinitionCard/ApiTypeTitle.test.tsx b/plugins/api-docs/src/components/ApiDefinitionCard/ApiTypeTitle.test.tsx index 5476857a06..d249e59aeb 100644 --- a/plugins/api-docs/src/components/ApiDefinitionCard/ApiTypeTitle.test.tsx +++ b/plugins/api-docs/src/components/ApiDefinitionCard/ApiTypeTitle.test.tsx @@ -24,7 +24,7 @@ describe('', () => { const apiDocsConfig: jest.Mocked = { getApiDefinitionWidget: jest.fn(), } as any; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( diff --git a/plugins/api-docs/src/components/ApisCards/ConsumedApisCard.test.tsx b/plugins/api-docs/src/components/ApisCards/ConsumedApisCard.test.tsx index afb836ecc9..d664ce78e8 100644 --- a/plugins/api-docs/src/components/ApisCards/ConsumedApisCard.test.tsx +++ b/plugins/api-docs/src/components/ApisCards/ConsumedApisCard.test.tsx @@ -32,14 +32,9 @@ describe('', () => { getApiDefinitionWidget: jest.fn(), } as any; const catalogApi: jest.Mocked = { - getLocationById: jest.fn(), - getEntityByName: jest.fn(), - getEntities: jest.fn(), - addLocation: jest.fn(), - getLocationByRef: jest.fn(), - removeEntityByUid: jest.fn(), + getEntitiesByRefs: jest.fn(), } as any; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( @@ -99,7 +94,7 @@ describe('', () => { }, ], }; - catalogApi.getEntities.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/api-docs/src/components/ApisCards/HasApisCard.test.tsx b/plugins/api-docs/src/components/ApisCards/HasApisCard.test.tsx index 85b353f04e..169311d0c8 100644 --- a/plugins/api-docs/src/components/ApisCards/HasApisCard.test.tsx +++ b/plugins/api-docs/src/components/ApisCards/HasApisCard.test.tsx @@ -32,14 +32,9 @@ describe('', () => { getApiDefinitionWidget: jest.fn(), } as any; const catalogApi: jest.Mocked = { - getLocationById: jest.fn(), - getEntityByName: jest.fn(), - getEntities: jest.fn(), - addLocation: jest.fn(), - getLocationByRef: jest.fn(), - removeEntityByUid: jest.fn(), + getEntitiesByRefs: jest.fn(), } as any; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( @@ -99,7 +94,7 @@ describe('', () => { }, ], }; - catalogApi.getEntities.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/api-docs/src/components/ApisCards/ProvidedApisCard.test.tsx b/plugins/api-docs/src/components/ApisCards/ProvidedApisCard.test.tsx index 40ffeff330..3dbc4edd63 100644 --- a/plugins/api-docs/src/components/ApisCards/ProvidedApisCard.test.tsx +++ b/plugins/api-docs/src/components/ApisCards/ProvidedApisCard.test.tsx @@ -32,14 +32,9 @@ describe('', () => { getApiDefinitionWidget: jest.fn(), } as any; const catalogApi: jest.Mocked = { - getLocationById: jest.fn(), - getEntityByName: jest.fn(), - getEntities: jest.fn(), - addLocation: jest.fn(), - getLocationByRef: jest.fn(), - removeEntityByUid: jest.fn(), + getEntitiesByRefs: jest.fn(), } as any; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( @@ -99,7 +94,7 @@ describe('', () => { }, ], }; - catalogApi.getEntities.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/api-docs/src/components/ComponentsCards/ConsumingComponentsCard.test.tsx b/plugins/api-docs/src/components/ComponentsCards/ConsumingComponentsCard.test.tsx index abc91d8793..20a60562b0 100644 --- a/plugins/api-docs/src/components/ComponentsCards/ConsumingComponentsCard.test.tsx +++ b/plugins/api-docs/src/components/ComponentsCards/ConsumingComponentsCard.test.tsx @@ -28,14 +28,9 @@ import { ConsumingComponentsCard } from './ConsumingComponentsCard'; describe('', () => { const catalogApi: jest.Mocked = { - getLocationById: jest.fn(), - getEntityByName: jest.fn(), - getEntities: jest.fn(), - addLocation: jest.fn(), - getLocationByRef: jest.fn(), - removeEntityByUid: jest.fn(), + getEntitiesByRefs: jest.fn(), } as any; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( @@ -102,7 +97,7 @@ describe('', () => { }, ], }; - catalogApi.getEntities.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/api-docs/src/components/ComponentsCards/ProvidingComponentsCard.test.tsx b/plugins/api-docs/src/components/ComponentsCards/ProvidingComponentsCard.test.tsx index bdd45c3d58..0801d7103a 100644 --- a/plugins/api-docs/src/components/ComponentsCards/ProvidingComponentsCard.test.tsx +++ b/plugins/api-docs/src/components/ComponentsCards/ProvidingComponentsCard.test.tsx @@ -28,14 +28,9 @@ import { ProvidingComponentsCard } from './ProvidingComponentsCard'; describe('', () => { const catalogApi: jest.Mocked = { - getLocationById: jest.fn(), - getEntityByName: jest.fn(), - getEntities: jest.fn(), - addLocation: jest.fn(), - getLocationByRef: jest.fn(), - removeEntityByUid: jest.fn(), + getEntitiesByRefs: jest.fn(), } as any; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( @@ -102,7 +97,7 @@ describe('', () => { }, ], }; - catalogApi.getEntities.mockResolvedValue({ + catalogApi.getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx index c67088476b..5d5988399a 100644 --- a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx +++ b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx @@ -105,7 +105,7 @@ const useStyles = makeStyles(theme => ({ fontWeight: theme.typography.fontWeightRegular, }, [`& .model-hint`]: { - color: theme.palette.text.hint, + color: theme.palette.text.secondary, backgroundColor: theme.palette.background.paper, }, [`& .opblock-summary-method, diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index 15e38c890f..a0b9b5a289 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-apollo-explorer +## 0.1.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.12-next.0 ### Patch Changes diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index 59325f4dc4..d3e5d7bb91 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.12-next.0", + "version": "0.1.12-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index ef2230a370..ec2f673df1 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-app-backend +## 0.3.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.3.46-next.0 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 3f983e66e0..ecf9258287 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.46-next.0", + "version": "0.3.46-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 93b2d31e56..8b21729c5e 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-auth-backend +## 0.18.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.18.4-next.0 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 3425a17831..e4e6747277 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.4-next.0", + "version": "0.18.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/src/lib/session/constants.ts b/plugins/auth-backend/src/lib/session/constants.ts new file mode 100644 index 0000000000..0d14987ab2 --- /dev/null +++ b/plugins/auth-backend/src/lib/session/constants.ts @@ -0,0 +1,19 @@ +/* + * 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. + */ + +// BACKSTAGE_SESSION_EXPIRATION the default session expiration time +// TODO: find a less hard-coded way to access this, perhaps by reading it from the configuration. +export const BACKSTAGE_SESSION_EXPIRATION = 3600; diff --git a/plugins/auth-backend/src/lib/session/index.ts b/plugins/auth-backend/src/lib/session/index.ts new file mode 100644 index 0000000000..306d483ae0 --- /dev/null +++ b/plugins/auth-backend/src/lib/session/index.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 { BACKSTAGE_SESSION_EXPIRATION } from './constants'; diff --git a/plugins/auth-backend/src/providers/github/provider.ts b/plugins/auth-backend/src/providers/github/provider.ts index 7571b4a327..11a71ca018 100644 --- a/plugins/auth-backend/src/providers/github/provider.ts +++ b/plugins/auth-backend/src/providers/github/provider.ts @@ -42,12 +42,10 @@ import { OAuthRefreshRequest, } from '../../lib/oauth'; import { createAuthProviderIntegration } from '../createAuthProviderIntegration'; +import { BACKSTAGE_SESSION_EXPIRATION } from '../../lib/session'; const ACCESS_TOKEN_PREFIX = 'access-token.'; -// TODO(Rugvip): Auth providers need a way to access this in a less hardcoded way -const BACKSTAGE_SESSION_EXPIRATION = 3600; - type PrivateInfo = { refreshToken?: string; }; diff --git a/plugins/auth-backend/src/providers/microsoft/provider.ts b/plugins/auth-backend/src/providers/microsoft/provider.ts index 5d02b7ef61..bc581f6d10 100644 --- a/plugins/auth-backend/src/providers/microsoft/provider.ts +++ b/plugins/auth-backend/src/providers/microsoft/provider.ts @@ -51,8 +51,7 @@ import { Logger } from 'winston'; import fetch from 'node-fetch'; import { decodeJwt } from 'jose'; import { Profile as PassportProfile } from 'passport'; - -const BACKSTAGE_SESSION_EXPIRATION = 3600; +import { BACKSTAGE_SESSION_EXPIRATION } from '../../lib/session'; type PrivateInfo = { refreshToken: string; diff --git a/plugins/auth-backend/src/providers/oidc/provider.ts b/plugins/auth-backend/src/providers/oidc/provider.ts index a5196f0930..ed59611f21 100644 --- a/plugins/auth-backend/src/providers/oidc/provider.ts +++ b/plugins/auth-backend/src/providers/oidc/provider.ts @@ -48,6 +48,7 @@ import { commonByEmailLocalPartResolver, commonByEmailResolver, } from '../resolvers'; +import { BACKSTAGE_SESSION_EXPIRATION } from '../../lib/session'; type PrivateInfo = { refreshToken?: string; @@ -179,17 +180,15 @@ export class OidcAuthProvider implements OAuthHandlers { // Then populate the profile with it private async handleResult(result: OidcAuthResult): Promise { const { profile } = await this.authHandler(result, this.resolverContext); - const response: OAuthResponse = { - providerInfo: { - idToken: result.tokenset.id_token, - accessToken: result.tokenset.access_token!, - scope: result.tokenset.scope!, - expiresInSeconds: result.tokenset.expires_in, - }, - profile, - }; + + const expiresInSeconds = + result.tokenset.expires_in === undefined + ? BACKSTAGE_SESSION_EXPIRATION + : Math.min(result.tokenset.expires_in, BACKSTAGE_SESSION_EXPIRATION); + + let backstageIdentity = undefined; if (this.signInResolver) { - response.backstageIdentity = await this.signInResolver( + backstageIdentity = await this.signInResolver( { result, profile, @@ -198,7 +197,16 @@ export class OidcAuthProvider implements OAuthHandlers { ); } - return response; + return { + backstageIdentity, + providerInfo: { + idToken: result.tokenset.id_token, + accessToken: result.tokenset.access_token!, + scope: result.tokenset.scope!, + expiresInSeconds, + }, + profile, + }; } } diff --git a/plugins/auth-backend/src/service/router.ts b/plugins/auth-backend/src/service/router.ts index 2996ff68be..fa8dd95727 100644 --- a/plugins/auth-backend/src/service/router.ts +++ b/plugins/auth-backend/src/service/router.ts @@ -37,6 +37,7 @@ import passport from 'passport'; import { Minimatch } from 'minimatch'; import { CatalogAuthResolverContext } from '../lib/resolvers'; import { AuthDatabase } from '../database/AuthDatabase'; +import { BACKSTAGE_SESSION_EXPIRATION } from '../lib/session'; /** @public */ export type ProviderFactories = { [s: string]: AuthProviderFactory }; @@ -77,7 +78,7 @@ export async function createRouter( logger, database: authDb, }); - const keyDurationSeconds = 3600; + const keyDurationSeconds = BACKSTAGE_SESSION_EXPIRATION; const tokenIssuer = new TokenFactory({ issuer: authUrl, diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 3dacefa8d0..6104302559 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-node +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + ## 0.2.15-next.0 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 155c107525..5945d50c91 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.15-next.0", + "version": "0.2.15-next.1", "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 cf6e17985c..875e5b9a60 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-azure-devops-backend +## 0.3.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.3.25-next.0 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index af4e285bc7..648cf7407b 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.25-next.0", + "version": "0.3.25-next.1", "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 7bbf34f381..d680899d33 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-azure-devops +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 0e9b38dfe7..54ea85f79e 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.3.1-next.0", + "version": "0.3.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index bb29d92f51..7d2034f88e 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-azure-sites-backend +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index 84f5fcb6a1..d5935d6f5c 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.8-next.0", + "version": "0.1.8-next.1", "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 3412e100c1..917080d458 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-azure-sites +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index 59bfaf839a..491d298c2c 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.8-next.0", + "version": "0.1.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 57e5d63270..fb12b9a417 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-badges-backend +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index e29d3f9e8f..be1a606a1a 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.2.1-next.0", + "version": "0.2.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -59,6 +59,7 @@ "cross-fetch": "^3.1.5" }, "files": [ - "dist" + "dist", + "migrations/**/*.{js,d.ts}" ] } diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index 656745c506..4bac0de4f6 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-badges +## 0.2.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.2.43-next.0 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index 2c3d72f234..4fbcfe403e 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.43-next.0", + "version": "0.2.43-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 0861db530f..c325016f94 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-bazaar-backend +## 0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/config@1.0.7 + ## 0.2.9-next.0 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index be621f5d5f..c255b61f10 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.9-next.0", + "version": "0.2.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index 97fc659f03..c7441d31d1 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-bazaar +## 0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.11.1-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli@0.22.8-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/theme@0.4.0-next.0 + ## 0.2.9-next.0 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index 11f8dce0dc..452e732b51 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.9-next.0", + "version": "0.2.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 04b2cc787b..2c3f2a383f 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.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + ## 0.2.6 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index a63b9588fb..3f2ebfe7c6 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.6", + "version": "0.2.7-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 cb9f5b1a5e..355d21855f 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-bitrise +## 0.1.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.46-next.0 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index db4769d6f1..d40ad141e3 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.46-next.0", + "version": "0.1.46-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index e4b6e3d63a..58a08b9ba0 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/integration-aws-node@0.1.4-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/plugin-kubernetes-common@0.6.4-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 07309f81cc..a79839e5e2 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.2.1-next.0", + "version": "0.2.1-next.1", "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 1783335c0f..8311fd75de 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.17-next.1 + +### Patch Changes + +- c7f848bcea3c: Support authentication with a service principal or managed identity for Azure DevOps + + Azure DevOps recently released support, in public preview, for authenticating with a service principal or managed identity instead of a personal access token (PAT): https://devblogs.microsoft.com/devops/introducing-service-principal-and-managed-identity-support-on-azure-devops/. With this change the Azure integration now supports service principals and managed identities for Azure AD backed Azure DevOps organizations. Service principal and managed identity authentication is not supported on Azure DevOps Server (on-premises) organizations. + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.17-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index eb94c176f3..0e12fc690b 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.17-next.0", + "version": "0.1.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/src/lib/azure.ts b/plugins/catalog-backend-module-azure/src/lib/azure.ts index 714090d5bc..916d70a9fa 100644 --- a/plugins/catalog-backend-module-azure/src/lib/azure.ts +++ b/plugins/catalog-backend-module-azure/src/lib/azure.ts @@ -58,9 +58,9 @@ export async function codeSearch( do { const response = await fetch(searchUrl, { - ...getAzureRequestOptions(azureConfig, { + ...(await getAzureRequestOptions(azureConfig, { 'Content-Type': 'application/json', - }), + })), method: 'POST', body: JSON.stringify({ searchText: `path:${path} repo:${repo || '*'} proj:${project || '*'}`, diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index c11afef754..6a2e252a11 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.7-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + ## 0.1.13-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 946a50d6a5..b751d467e4 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.13-next.0", + "version": "0.1.13-next.1", "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 5609b696c4..347e63be7e 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/config@1.0.7 + ## 0.1.11-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 cbb4c89e04..1a0e7d957e 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.11-next.0", + "version": "0.1.11-next.1", "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 c4bf6ca2e2..cecfefc635 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.7-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.13-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index 2efd5558ae..dc74bf6ae1 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.13-next.0", + "version": "0.2.13-next.1", "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 9f22598c98..e3e4998e0c 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/config@1.0.7 + ## 0.1.14-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index f104b894f2..9f573d2119 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.14-next.0", + "version": "0.1.14-next.1", "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 42ec45f0d1..84ceadf79d 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-catalog-backend-module-github +## 0.3.1-next.1 + +### Patch Changes + +- df8411779da1: Add support for Repository Variables and Secrets to the `publish:github` and `github:repo:create` scaffolder actions. You will need to add `read/write` permissions to your GITHUB_TOKEN and/or Github Backstage App for Repository `Secrets` and `Variables` + + Upgrade octokit introduces some breaking changes. + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index f4cd2d1e0b..5ad851d57f 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.3.1-next.0", + "version": "0.3.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts b/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts index 9709977010..cf5e484fc2 100644 --- a/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts @@ -233,6 +233,7 @@ export class GithubMultiOrgReaderProcessor implements CatalogProcessor { .map(install => install.target_type === 'Organization' && install.account && + 'login' in install.account && install.account.login ? { name: install.account.login, diff --git a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts index 99bef6e074..2622b2483d 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts @@ -1694,7 +1694,6 @@ describe('GithubMultiOrgEntityProvider', () => { }, }, }); - await new Promise(process.nextTick); expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(1); expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({ @@ -1867,7 +1866,6 @@ describe('GithubMultiOrgEntityProvider', () => { }, }, }); - await new Promise(process.nextTick); expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(1); expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({ diff --git a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts index 51796c2116..4d343493f6 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts @@ -388,7 +388,10 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { // https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#membership if (params.topic.includes('membership')) { - this.onMembershipChangedInTeam(eventPayload as MembershipEvent, orgs); + await this.onMembershipChangedInTeam( + eventPayload as MembershipEvent, + orgs, + ); } return; @@ -838,6 +841,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider { .map(install => install.target_type === 'Organization' && install.account && + 'login' in install.account && install.account.login ? install.account.login : undefined, diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index c7fdb3e600..c35a8dd46e 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.2-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/api-report.md b/plugins/catalog-backend-module-gitlab/api-report.md index 2596b5c99a..6620f6445f 100644 --- a/plugins/catalog-backend-module-gitlab/api-report.md +++ b/plugins/catalog-backend-module-gitlab/api-report.md @@ -40,6 +40,7 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor { options: { logger: Logger; skipReposWithoutExactFileMatch?: boolean; + skipForkedRepos?: boolean; }, ): GitLabDiscoveryProcessor; // (undocumented) diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 31f67c8b28..73980f568a 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.2-next.0", + "version": "0.2.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts index 9f2cd9b17a..c9bd4d9187 100644 --- a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts @@ -42,10 +42,15 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor { private readonly logger: Logger; private readonly cache: CacheClient; private readonly skipReposWithoutExactFileMatch: boolean; + private readonly skipForkedRepos: boolean; static fromConfig( config: Config, - options: { logger: Logger; skipReposWithoutExactFileMatch?: boolean }, + options: { + logger: Logger; + skipReposWithoutExactFileMatch?: boolean; + skipForkedRepos?: boolean; + }, ): GitLabDiscoveryProcessor { const integrations = ScmIntegrations.fromConfig(config); const pluginCache = @@ -63,12 +68,14 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor { pluginCache: PluginCacheManager; logger: Logger; skipReposWithoutExactFileMatch?: boolean; + skipForkedRepos?: boolean; }) { this.integrations = options.integrations; this.cache = options.pluginCache.getClient(); this.logger = options.logger; this.skipReposWithoutExactFileMatch = options.skipReposWithoutExactFileMatch || false; + this.skipForkedRepos = options.skipForkedRepos || false; } getProcessorName(): string { @@ -140,6 +147,13 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor { } } + if ( + this.skipForkedRepos && + project.hasOwnProperty('forked_from_project') + ) { + continue; + } + res.matches.push(project); } diff --git a/plugins/catalog-backend-module-gitlab/src/lib/types.ts b/plugins/catalog-backend-module-gitlab/src/lib/types.ts index c27007861b..341e2a9d9a 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/types.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/types.ts @@ -22,6 +22,10 @@ export type GitlabGroupDescription = { projects: GitLabProject[]; }; +export type GitlabProjectForkedFrom = { + id: number; +}; + export type GitLabProject = { id: number; default_branch?: string; @@ -29,6 +33,7 @@ export type GitLabProject = { last_activity_at: string; web_url: string; path_with_namespace?: string; + forked_from_project?: GitlabProjectForkedFrom; }; export type GitLabUser = { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts index 3d6ff0a91a..e29cdccc04 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts @@ -264,6 +264,48 @@ describe('GitlabOrgDiscoveryEntityProvider', () => { is_admin: false, note: '', }, + { + id: 2, + username: 'test2', + name: '', + state: 'active', + avatar_url: '', + web_url: 'https://gitlab.example/test2', + created_at: '2023-01-19T07:27:03.333Z', + bio: '', + location: null, + public_email: null, + skype: '', + linkedin: '', + twitter: '', + website_url: '', + organization: null, + job_title: '', + pronouns: null, + bot: false, + work_information: null, + followers: 0, + following: 0, + is_followed: false, + local_time: null, + last_sign_in_at: '2023-01-19T07:27:49.601Z', + confirmed_at: '2023-01-19T07:27:02.905Z', + last_activity_on: '2023-01-19', + email: 'test@example.com', + theme_id: 1, + color_scheme_id: 1, + projects_limit: 100000, + current_sign_in_at: '2023-01-19T09:09:10.676Z', + identities: [], + can_create_group: true, + can_create_project: true, + two_factor_enabled: false, + external: false, + private_profile: false, + commit_email: 'test@example.com', + is_admin: false, + note: '', + }, ]; return res(ctx.json(response)); }), @@ -374,6 +416,31 @@ describe('GitlabOrgDiscoveryEntityProvider', () => { }, locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', }, + { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + annotations: { + 'backstage.io/managed-by-location': + 'url:https://test-gitlab/test2', + 'backstage.io/managed-by-origin-location': + 'url:https://test-gitlab/test2', + 'test-gitlab/user-login': 'https://gitlab.example/test2', + }, + name: 'test2', + }, + spec: { + memberOf: [], + profile: { + displayName: undefined, + email: 'test@example.com', + picture: undefined, + }, + }, + }, + locationKey: 'GitlabOrgDiscoveryEntityProvider:test-id', + }, { entity: { apiVersion: 'backstage.io/v1alpha1', diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts index 1fe607afbb..02c036f27a 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -319,8 +319,8 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { }, spec: { profile: { - displayName: user.name, - picture: user.avatar_url, + displayName: user.name || undefined, + picture: user.avatar_url || undefined, }, memberOf: [], }, diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 887a38f1fc..f9d2c7b6ee 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + ## 0.3.3-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 d34042afd4..6667b721f5 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.3-next.0", + "version": "0.3.3-next.1", "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 540143a4d6..2641372a77 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.5.13-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index b931f9b752..512e2e2786 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.13-next.0", + "version": "0.5.13-next.1", "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 dfd79f3023..7d3c62f7a8 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + ## 0.5.5-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 120c4a46b8..6b2ef64c7a 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.5-next.0", + "version": "0.5.5-next.1", "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 f35874880d..33d393c8b5 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.12-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 66ac0df179..511e613346 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.12-next.0", + "version": "0.1.12-next.1", "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 0ae5333d51..5cc80e59ce 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index 2a16f0c46d..00d2f0c3c5 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.3-next.0", + "version": "0.1.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-unprocessed/.eslintrc.js b/plugins/catalog-backend-module-unprocessed/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/catalog-backend-module-unprocessed/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md new file mode 100644 index 0000000000..503d2201ea --- /dev/null +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -0,0 +1,14 @@ +# @backstage/plugin-catalog-backend-module-unprocessed + +## 0.1.0-next.0 + +### Minor Changes + +- d44fcd9829c2: Added a new plugin to expose entities which are unprocessed or have errors processing + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 diff --git a/plugins/catalog-backend-module-unprocessed/README.md b/plugins/catalog-backend-module-unprocessed/README.md new file mode 100644 index 0000000000..dc5e830fa4 --- /dev/null +++ b/plugins/catalog-backend-module-unprocessed/README.md @@ -0,0 +1,38 @@ +# @backstage/plugin-catalog-backend-module-unprocessed-node + +This catalog-backend module adds support for viewing unprocessed entities. An unprocessed entity is one that doesn't show up in the catalog. + +A distinction is made between `failed` and `pending` entities. + +A `failed` entity has validation error that breaks processing. + +A `pending` entity has not been processed yet. + +## Installation + +### backend + +In `packages/backend/src/plugins/catalog.ts` import the module and initialize it after invoking `CatalogBuilder.build()`: + +```ts +import { UnprocessedEntitesModule } from '@backstage/plugin-catalog-backend-module-unprocessed'; + +//... + +const unprocessed = new UnprocessedEntitesModule( + await env.database.getClient(), + router, + env.logger, +); +unprocessed.registerRoutes(); +``` + +### backend-next + +In `packages/backend-next/src/index.ts` add the module: + +```ts +backend.add(catalogModuleUnprocessedEntities()); +``` + +_This plugin was created through the Backstage CLI_ diff --git a/plugins/catalog-backend-module-unprocessed/api-report.md b/plugins/catalog-backend-module-unprocessed/api-report.md new file mode 100644 index 0000000000..3fc81c62cc --- /dev/null +++ b/plugins/catalog-backend-module-unprocessed/api-report.md @@ -0,0 +1,19 @@ +## API Report File for "@backstage/plugin-catalog-backend-module-unprocessed" + +> 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'; +import { HttpRouterService } from '@backstage/backend-plugin-api'; +import { Knex } from 'knex'; + +// @public +export const catalogModuleUnprocessedEntities: () => BackendFeature; + +// @public +export class UnprocessedEntitesModule { + constructor(database: Knex, router: HttpRouterService); + // (undocumented) + registerRoutes(): void; +} +``` diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json new file mode 100644 index 0000000000..e4467c940e --- /dev/null +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -0,0 +1,37 @@ +{ + "name": "@backstage/plugin-catalog-backend-module-unprocessed", + "description": "Backstage Catalog module to view unprocessed entities", + "version": "0.1.0-next.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "backend-plugin-module" + }, + "scripts": { + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "devDependencies": { + "@backstage/cli": "workspace:^" + }, + "files": [ + "dist" + ], + "dependencies": { + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/catalog-model": "workspace:^", + "@backstage/plugin-auth-node": "workspace:^", + "express-promise-router": "^4.1.1", + "knex": "^2.4.2" + } +} diff --git a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts new file mode 100644 index 0000000000..6ea184ce83 --- /dev/null +++ b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts @@ -0,0 +1,132 @@ +/* + * 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 { + HydratedRefreshState, + RefreshState, + UnprocessedEntitiesRequest, + UnprocessedEntitiesResponse, +} from './types'; +import { Knex } from 'knex'; +import { HttpRouterService } from '@backstage/backend-plugin-api'; +import Router from 'express-promise-router'; +import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; + +/** + * Module providing Unprocessed Entities API endpoints + * + * @public + */ +export class UnprocessedEntitesModule { + private readonly moduleRouter; + + constructor( + private readonly database: Knex, + private readonly router: HttpRouterService, + ) { + this.moduleRouter = Router(); + this.router.use(this.moduleRouter); + } + + private async unprocessed( + request: UnprocessedEntitiesRequest, + ): Promise { + if (request.reason === 'pending') { + return { + type: 'pending', + entities: await this.pending(request.owner), + }; + } + return { + type: 'failed', + entities: await this.failed(request.owner), + }; + } + + private hydrateRefreshState(r: RefreshState): HydratedRefreshState { + return { + ...r, + unprocessed_entity: JSON.parse(r.unprocessed_entity), + ...(r.processed_entity && { + processed_entity: JSON.parse(r.processed_entity), + }), + ...(r.errors && { errors: JSON.parse(r.errors) }), + ...(r.cache && { cache: JSON.parse(r.cache) }), + }; + } + + private async pending(owner?: string): Promise { + const res = ( + await this.database('refresh_state.*') + .from('refresh_state') + .leftJoin( + 'final_entities', + 'final_entities.entity_id', + 'refresh_state.entity_id', + ) + .whereNull('final_entities.entity_id') + ).map(this.hydrateRefreshState); + if (owner) { + return res.filter(r => r.unprocessed_entity.spec?.owner === owner); + } + + return res; + } + + private async failed(owner?: string): Promise { + const res = ( + await this.database('refresh_state.*') + .from('refresh_state') + .rightJoin( + 'final_entities', + 'final_entities.entity_id', + 'refresh_state.entity_id', + ) + .whereNull('final_entities.final_entity') + ).map(this.hydrateRefreshState); + if (owner) { + return res.filter(r => r.unprocessed_entity.spec?.owner === owner); + } + + return res; + } + + registerRoutes() { + this.moduleRouter + .get('/entities/unprocessed/failed', async (req, res) => { + return res.json( + await this.unprocessed({ + reason: 'failed', + owner: req.query.owner as string, + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), + }), + ); + }) + .get('/entities/unprocessed/pending', async (req, res) => { + return res.json( + await this.unprocessed({ + reason: 'pending', + owner: req.query.owner as string, + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), + }), + ); + }); + } +} diff --git a/plugins/catalog-backend-module-unprocessed/src/index.ts b/plugins/catalog-backend-module-unprocessed/src/index.ts new file mode 100644 index 0000000000..21cb2dbcd6 --- /dev/null +++ b/plugins/catalog-backend-module-unprocessed/src/index.ts @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * Node.js library for the catalog-backend-module-unprocessed plugin. + * + * @packageDocumentation + */ + +export * from './module'; +export * from './UnprocessedEntitiesModule'; diff --git a/plugins/catalog-backend-module-unprocessed/src/module.ts b/plugins/catalog-backend-module-unprocessed/src/module.ts new file mode 100644 index 0000000000..1c4b6c658f --- /dev/null +++ b/plugins/catalog-backend-module-unprocessed/src/module.ts @@ -0,0 +1,51 @@ +/* + * 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 { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { UnprocessedEntitesModule } from './UnprocessedEntitiesModule'; + +/** + * Catalog Module for Unprocessed Entities + * + * @public + */ +export const catalogModuleUnprocessedEntities = createBackendModule({ + pluginId: 'catalog', + moduleId: 'catalogModuleUnprocessedEntities', + register(env) { + env.registerInit({ + deps: { + database: coreServices.database, + router: coreServices.httpRouter, + logger: coreServices.logger, + }, + async init({ database, router, logger }) { + const module = new UnprocessedEntitesModule( + await database.getClient(), + router, + ); + + module.registerRoutes(); + logger.info( + 'registered additional routes for catalogModuleUnprocessedEntities', + ); + }, + }); + }, +}); diff --git a/plugins/catalog-backend-module-unprocessed/src/setupTests.ts b/plugins/catalog-backend-module-unprocessed/src/setupTests.ts new file mode 100644 index 0000000000..4b9026cde5 --- /dev/null +++ b/plugins/catalog-backend-module-unprocessed/src/setupTests.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 {}; diff --git a/plugins/catalog-backend-module-unprocessed/src/types.ts b/plugins/catalog-backend-module-unprocessed/src/types.ts new file mode 100644 index 0000000000..8d70345682 --- /dev/null +++ b/plugins/catalog-backend-module-unprocessed/src/types.ts @@ -0,0 +1,69 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; + +export type HydratedRefreshState = { + entity_id: string; + entity_ref: string; + unprocessed_entity: Entity; + unprocessed_hash?: string; + processed_entity?: Entity; + result_hash?: string; + cache?: RefreshStateCache; + next_update_at: string | Date; + last_discovery_at: string | Date; // remove? + errors?: RefreshStateError[]; + location_key?: string; +}; + +export type RefreshState = { + entity_id: string; + entity_ref: string; + unprocessed_entity: string; + unprocessed_hash?: string; + processed_entity?: string; + result_hash?: string; + cache?: string; + next_update_at: string | Date; + last_discovery_at: string | Date; // remove? + errors?: string; + location_key?: string; +}; +export type RefreshStateCache = { + ttl: number; + cache: object; +}; + +export type RefreshStateError = { + name: string; + message: string; + cause: { + name: string; + message: string; + stack: string; + }; +}; + +export interface UnprocessedEntitiesRequest { + reason: 'failed' | 'pending'; + owner?: string; + authorizationToken?: string; +} + +export interface UnprocessedEntitiesResponse { + type: 'pending' | 'failed'; + entities: HydratedRefreshState[]; +} diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index d97663c66f..8cd32e12f9 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog-backend +## 1.9.2-next.1 + +### Patch Changes + +- 77e04a2d55be: Replace getBearerToken with library function of same +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.2-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.9.2-next.0 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index b22541bda1..d6a9040668 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.9.2-next.0", + "version": "1.9.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -53,6 +53,7 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", + "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", diff --git a/plugins/catalog-backend/src/service/createRouter.ts b/plugins/catalog-backend/src/service/createRouter.ts index 5ac1f2eda7..997cd481a6 100644 --- a/plugins/catalog-backend/src/service/createRouter.ts +++ b/plugins/catalog-backend/src/service/createRouter.ts @@ -53,6 +53,7 @@ import { import type { ApiRouter } from '@backstage/backend-openapi-utils'; import spec from '../schema/openapi.generated'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; +import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; /** * Options used by {@link createRouter}. @@ -101,7 +102,7 @@ export async function createRouter( if (refreshService) { router.post('/refresh', async (req, res) => { const refreshOptions: RefreshOptions = req.body; - refreshOptions.authorizationToken = getBearerToken( + refreshOptions.authorizationToken = getBearerTokenFromAuthorizationHeader( req.header('authorization'), ); @@ -122,7 +123,9 @@ export async function createRouter( fields: parseEntityTransformParams(req.query), order: parseEntityOrderParams(req.query), pagination: parseEntityPaginationParams(req.query), - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); // Add a Link header to the next page @@ -140,7 +143,9 @@ export async function createRouter( const { items, pageInfo, totalItems } = await entitiesCatalog.queryEntities({ ...parseQueryEntitiesParams(req.query), - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); res.json({ @@ -160,7 +165,9 @@ export async function createRouter( const { uid } = req.params; const { entities } = await entitiesCatalog.entities({ filter: basicEntityFilter({ 'metadata.uid': uid }), - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); if (!entities.length) { throw new NotFoundError(`No entity with uid ${uid}`); @@ -170,7 +177,9 @@ export async function createRouter( .delete('/entities/by-uid/:uid', async (req, res) => { const { uid } = req.params; await entitiesCatalog.removeEntityByUid(uid, { - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); res.status(204).end(); }) @@ -182,7 +191,9 @@ export async function createRouter( 'metadata.namespace': namespace, 'metadata.name': name, }), - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); if (!entities.length) { throw new NotFoundError( @@ -197,14 +208,18 @@ export async function createRouter( const { kind, namespace, name } = req.params; const entityRef = stringifyEntityRef({ kind, namespace, name }); const response = await entitiesCatalog.entityAncestry(entityRef, { - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); res.status(200).json(response); }, ) .post('/entities/by-refs', async (req, res) => { const request = entitiesBatchRequest(req); - const token = getBearerToken(req.header('authorization')); + const token = getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ); const response = await entitiesCatalog.entitiesBatch({ entityRefs: request.entityRefs, fields: parseEntityTransformParams(req.query, request.fields), @@ -216,7 +231,9 @@ export async function createRouter( const response = await entitiesCatalog.facets({ filter: parseEntityFilterParams(req.query), facets: parseEntityFacetParams(req.query), - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); res.status(200).json(response); }); @@ -235,13 +252,17 @@ export async function createRouter( } const output = await locationService.createLocation(location, dryRun, { - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); res.status(201).json(output); }) .get('/locations', async (req, res) => { const locations = await locationService.listLocations({ - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); res.status(200).json(locations.map(l => ({ data: l }))); }) @@ -249,7 +270,9 @@ export async function createRouter( .get('/locations/:id', async (req, res) => { const { id } = req.params; const output = await locationService.getLocation(id, { - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); res.status(200).json(output); }) @@ -258,7 +281,9 @@ export async function createRouter( const { id } = req.params; await locationService.deleteLocation(id, { - authorizationToken: getBearerToken(req.header('authorization')), + authorizationToken: getBearerTokenFromAuthorizationHeader( + req.header('authorization'), + ), }); res.status(204).end(); }); @@ -331,13 +356,3 @@ export async function createRouter( router.use(errorHandler()); return router; } - -function getBearerToken( - authorizationHeader: string | undefined, -): string | undefined { - if (typeof authorizationHeader !== 'string') { - return undefined; - } - const matches = authorizationHeader.match(/Bearer\s+(\S+)/i); - return matches?.[1]; -} diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index 02647e84b2..d8122a2068 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-common +## 1.0.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.0.13 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index 6cc68317b7..0944fa3dee 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.13", + "version": "1.0.14-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 7b6a839605..17b1d4be8a 100644 --- a/plugins/catalog-customized/CHANGELOG.md +++ b/plugins/catalog-customized/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-catalog-customized +## 0.0.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.11.1-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + ## 0.0.11-next.0 ### Patch Changes diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json index eb5e1ded05..188d5326a0 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.11-next.0", + "version": "0.0.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 36398fd099..9de459f2c8 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-graph +## 0.2.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/theme@0.4.0-next.0 + ## 0.2.31-next.0 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 510bc13b9c..b827877330 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.31-next.0", + "version": "0.2.31-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graphql/CHANGELOG.md b/plugins/catalog-graphql/CHANGELOG.md index 18ffdfac5d..1d4f700a19 100644 --- a/plugins/catalog-graphql/CHANGELOG.md +++ b/plugins/catalog-graphql/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-graphql +## 0.3.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.3.20 ### Patch Changes diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 5bc4542557..b861ccbd41 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", + "version": "0.3.21-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 7c9646a22e..c462ee3ecc 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-import +## 0.9.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + ## 0.9.9-next.0 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 8fc04f95f4..e76b25cab9 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.9-next.0", + "version": "0.9.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 903088747e..4d282e7db8 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-node +## 1.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/types@1.0.2 + ## 1.3.7-next.0 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index ec47249a1c..c4cbcd7b6b 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.7-next.0", + "version": "1.3.7-next.1", "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 2a267bfd1d..1b4a36191d 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-catalog-react +## 1.7.0-next.1 + +### Patch Changes + +- 429319d080cd: `EntityAutocompletePicker` add `initialSelectedOptions` prop +- 429319d080cd: `EntityLifecycleFilter` loads data using the facets endpoint +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + - @backstage/plugin-permission-react@0.4.13-next.0 + ## 1.7.0-next.0 ### Minor Changes diff --git a/plugins/catalog-react/api-report.md b/plugins/catalog-react/api-report.md index f9725e41e8..2fab514de1 100644 --- a/plugins/catalog-react/api-report.md +++ b/plugins/catalog-react/api-report.md @@ -195,7 +195,7 @@ export class EntityLifecycleFilter implements EntityFilter { // @public (undocumented) export const EntityLifecyclePicker: (props: { initialFilter?: string[]; -}) => JSX.Element | null; +}) => JSX.Element; // @public export const EntityListContext: React_2.Context< @@ -555,7 +555,7 @@ export function useEntityTypeFilter(): { setSelectedTypes: (types: string[]) => void; }; -// @public (undocumented) +// @public export function useRelatedEntities( entity: Entity, relationFilter: { diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 7d925d825b..c3b5777051 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.7.0-next.0", + "version": "1.7.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx index 3a9a100357..b6de85937d 100644 --- a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx +++ b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx @@ -54,6 +54,7 @@ export type EntityAutocompletePickerProps< showCounts?: boolean; Filter: ConstructableFilter>; InputProps?: TextFieldProps; + initialSelectedOptions?: string[]; }; /** @public */ @@ -61,7 +62,15 @@ export function EntityAutocompletePicker< T extends DefaultEntityFilters = DefaultEntityFilters, Name extends AllowedEntityFilters = AllowedEntityFilters, >(props: EntityAutocompletePickerProps) { - const { label, name, path, showCounts, Filter, InputProps } = props; + const { + label, + name, + path, + showCounts, + Filter, + InputProps, + initialSelectedOptions = [], + } = props; const { updateFilters, @@ -90,7 +99,8 @@ export function EntityAutocompletePicker< const [selectedOptions, setSelectedOptions] = useState( queryParameters.length ? queryParameters - : (filters[name] as unknown as { values: string[] })?.values ?? [], + : (filters[name] as unknown as { values: string[] })?.values ?? + initialSelectedOptions, ); // Set selected options on query parameter updates; this happens at initial page load and from diff --git a/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.test.tsx b/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.test.tsx index 3ee610ddaf..19554f18b7 100644 --- a/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.test.tsx @@ -14,146 +14,116 @@ * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; -import { fireEvent, render, screen } from '@testing-library/react'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import React from 'react'; import { MockEntityListContextProvider } from '../../testUtils/providers'; import { EntityLifecycleFilter } from '../../filters'; import { EntityLifecyclePicker } from './EntityLifecyclePicker'; - -const sampleEntities: Entity[] = [ - { - apiVersion: '1', - kind: 'Component', - metadata: { - name: 'component-1', - }, - spec: { - lifecycle: 'production', - }, - }, - { - apiVersion: '1', - kind: 'Component', - metadata: { - name: 'component-2', - }, - spec: { - lifecycle: 'experimental', - }, - }, - { - apiVersion: '1', - kind: 'Component', - metadata: { - name: 'component-3', - }, - spec: { - lifecycle: 'experimental', - }, - }, -]; +import { TestApiProvider } from '@backstage/test-utils'; +import { catalogApiRef } from '../../api'; +import { CatalogApi } from '@backstage/catalog-client'; describe('', () => { - it('renders all lifecycles', () => { - render( - - - , - ); - expect(screen.getByText('Lifecycle')).toBeInTheDocument(); + const catalogApi = { + getEntityFacets: jest.fn(), + } as unknown as jest.Mocked; - fireEvent.click(screen.getByTestId('lifecycle-picker-expand')); - sampleEntities - .map(e => e.spec?.lifecycle!) - .forEach(lifecycle => { - expect(screen.getByText(lifecycle as string)).toBeInTheDocument(); - }); + beforeEach(() => { + catalogApi.getEntityFacets.mockResolvedValue({ + facets: { + 'spec.lifecycle': [ + { count: 1, value: 'experimental' }, + { count: 1, value: 'production' }, + ], + }, + }); }); - it('renders unique lifecycles in alphabetical order', () => { - render( - - - , - ); - expect(screen.getByText('Lifecycle')).toBeInTheDocument(); - - fireEvent.click(screen.getByTestId('lifecycle-picker-expand')); - - expect(screen.getAllByRole('option').map(o => o.textContent)).toEqual([ - 'experimental', - 'production', - ]); + afterEach(() => { + jest.resetAllMocks(); }); - it('respects the query parameter filter value', () => { + it('renders all lifecycles', async () => { + render( + + + + + , + ); + expect(await screen.findByText('Lifecycle')).toBeInTheDocument(); + + fireEvent.click(await screen.findByTestId('lifecycles-picker-expand')); + expect(screen.getByText('experimental')).toBeInTheDocument(); + expect(screen.getByText('production')).toBeInTheDocument(); + }); + + it('respects the query parameter filter value', async () => { const updateFilters = jest.fn(); const queryParameters = { lifecycles: ['experimental'] }; render( - - - , + + + + + , ); + await waitFor(() => expect(catalogApi.getEntityFacets).toHaveBeenCalled()); expect(updateFilters).toHaveBeenLastCalledWith({ lifecycles: new EntityLifecycleFilter(['experimental']), }); }); - it('adds lifecycles to filters', () => { + it('adds lifecycles to filters', async () => { const updateFilters = jest.fn(); render( - - - , + + + + + , ); expect(updateFilters).toHaveBeenLastCalledWith({ lifecycles: undefined, }); - fireEvent.click(screen.getByTestId('lifecycle-picker-expand')); + fireEvent.click(await screen.findByTestId('lifecycles-picker-expand')); fireEvent.click(screen.getByText('production')); expect(updateFilters).toHaveBeenLastCalledWith({ lifecycles: new EntityLifecycleFilter(['production']), }); }); - it('removes lifecycles from filters', () => { + it('removes lifecycles from filters', async () => { const updateFilters = jest.fn(); render( - - - , + + + + + , ); + + await waitFor(() => expect(catalogApi.getEntityFacets).toHaveBeenCalled()); expect(updateFilters).toHaveBeenLastCalledWith({ lifecycles: new EntityLifecycleFilter(['production']), }); - fireEvent.click(screen.getByTestId('lifecycle-picker-expand')); + fireEvent.click(screen.getByTestId('lifecycles-picker-expand')); expect(screen.getByLabelText('production')).toBeChecked(); fireEvent.click(screen.getByLabelText('production')); @@ -162,67 +132,85 @@ describe('', () => { }); }); - it('responds to external queryParameters changes', () => { + it('responds to external queryParameters changes', async () => { const updateFilters = jest.fn(); const rendered = render( - - - , + + + + + , ); + + await waitFor(() => expect(catalogApi.getEntityFacets).toHaveBeenCalled()); expect(updateFilters).toHaveBeenLastCalledWith({ lifecycles: new EntityLifecycleFilter(['experimental']), }); + rendered.rerender( - - - , + + + + + , ); expect(updateFilters).toHaveBeenLastCalledWith({ lifecycles: new EntityLifecycleFilter(['production']), }); }); - it('removes lifecycles from filters if there are no available lifecycles', () => { + + it('removes lifecycles from filters if there are no available lifecycles', async () => { + catalogApi.getEntityFacets.mockResolvedValue({ + facets: { + 'spec.lifecycle': [], + }, + }); + const updateFilters = jest.fn(); render( - - - , + + + + + , ); + + await waitFor(() => expect(catalogApi.getEntityFacets).toHaveBeenCalled()); expect(updateFilters).toHaveBeenLastCalledWith({ lifecycles: undefined, }); }); - it('responds to initialFilter prop', () => { + + it('responds to initialFilter prop', async () => { const updateFilters = jest.fn(); render( - - - , + + + + + , ); + + await waitFor(() => expect(catalogApi.getEntityFacets).toHaveBeenCalled()); expect(updateFilters).toHaveBeenLastCalledWith({ lifecycles: new EntityLifecycleFilter(['production']), }); diff --git a/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.tsx b/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.tsx index dd107b2673..a1bd6ef86b 100644 --- a/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.tsx +++ b/plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.tsx @@ -14,22 +14,10 @@ * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; -import { - Box, - Checkbox, - FormControlLabel, - makeStyles, - TextField, - Typography, -} from '@material-ui/core'; -import CheckBoxIcon from '@material-ui/icons/CheckBox'; -import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { Autocomplete } from '@material-ui/lab'; -import React, { useEffect, useMemo, useState } from 'react'; -import { useEntityList } from '../../hooks/useEntityListProvider'; +import { makeStyles } from '@material-ui/core'; +import React from 'react'; import { EntityLifecycleFilter } from '../../filters'; +import { EntityAutocompletePicker } from '../EntityAutocompletePicker'; /** @public */ export type CatalogReactEntityLifecyclePickerClassKey = 'input'; @@ -43,98 +31,19 @@ const useStyles = makeStyles( }, ); -const icon = ; -const checkedIcon = ; - /** @public */ export const EntityLifecyclePicker = (props: { initialFilter?: string[] }) => { const { initialFilter = [] } = props; const classes = useStyles(); - const { - updateFilters, - backendEntities, - filters, - queryParameters: { lifecycles: lifecyclesParameter }, - } = useEntityList(); - - const queryParamLifecycles = useMemo( - () => [lifecyclesParameter].flat().filter(Boolean) as string[], - [lifecyclesParameter], - ); - - const [selectedLifecycles, setSelectedLifecycles] = useState( - queryParamLifecycles.length - ? queryParamLifecycles - : filters.lifecycles?.values ?? initialFilter, - ); - - // Set selected lifecycles on query parameter updates; this happens at initial page load and from - // external updates to the page location. - useEffect(() => { - if (queryParamLifecycles.length) { - setSelectedLifecycles(queryParamLifecycles); - } - }, [queryParamLifecycles]); - - const availableLifecycles = useMemo( - () => - [ - ...new Set( - backendEntities - .map((e: Entity) => e.spec?.lifecycle) - .filter(Boolean) as string[], - ), - ].sort(), - [backendEntities], - ); - - useEffect(() => { - updateFilters({ - lifecycles: - selectedLifecycles.length && availableLifecycles.length - ? new EntityLifecycleFilter(selectedLifecycles) - : undefined, - }); - }, [selectedLifecycles, updateFilters, availableLifecycles]); - - if (!availableLifecycles.length) return null; return ( - - - Lifecycle - - setSelectedLifecycles(value) - } - renderOption={(option, { selected }) => ( - - } - onClick={event => event.preventDefault()} - label={option} - /> - )} - size="small" - popupIcon={} - renderInput={params => ( - - )} - /> - - + ); }; diff --git a/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.stories.tsx b/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.stories.tsx index bee5587ea1..d50fdc964b 100644 --- a/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.stories.tsx +++ b/plugins/catalog-react/src/components/EntityPeekAheadPopover/EntityPeekAheadPopover.stories.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { EntityPeekAheadPopover, EntityPeekAheadPopoverProps, @@ -80,7 +80,7 @@ const defaultArgs = { export default { title: 'Catalog /PeekAheadPopover', decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp( <> ) => + (Story: ComponentType>) => wrapInTestApp(, { mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef, diff --git a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLinks.stories.tsx b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLinks.stories.tsx index 176dd24530..7b94bd14df 100644 --- a/plugins/catalog-react/src/components/EntityRefLink/EntityRefLinks.stories.tsx +++ b/plugins/catalog-react/src/components/EntityRefLink/EntityRefLinks.stories.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { EntityRefLinks, EntityRefLinksProps } from './EntityRefLinks'; import { wrapInTestApp } from '@backstage/test-utils'; import { CompoundEntityRef } from '@backstage/catalog-model'; @@ -27,7 +27,7 @@ const defaultArgs = { export default { title: 'Catalog /EntityRefLinks', decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp(, { mountedRoutes: { '/catalog/:namespace/:kind/:name': entityRouteRef, diff --git a/plugins/catalog-react/src/hooks/useRelatedEntities.test.tsx b/plugins/catalog-react/src/hooks/useRelatedEntities.test.tsx new file mode 100644 index 0000000000..0d415274e0 --- /dev/null +++ b/plugins/catalog-react/src/hooks/useRelatedEntities.test.tsx @@ -0,0 +1,84 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { TestApiProvider } from '@backstage/test-utils'; +import { WrapperComponent, renderHook } from '@testing-library/react-hooks'; +import React from 'react'; +import { catalogApiRef } from '../api'; +import { useRelatedEntities } from './useRelatedEntities'; + +describe('useRelatedEntities', () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + const entity: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { name: 'test' }, + relations: [ + { + type: 'ownedBy', + targetRef: 'group:default/the-owners-1', + }, + { + type: 'ownedBy', + targetRef: 'group:default/the-owners-2', + }, + { + type: 'partOf', + targetRef: 'component:default/larger-thing', + }, + ], + }; + + const catalogApi = { + getEntitiesByRefs: jest.fn(), + }; + + const wrapper: WrapperComponent<{}> = ({ children }) => { + return ( + + {children} + + ); + }; + + it('filters and requests entities', async () => { + catalogApi.getEntitiesByRefs.mockResolvedValueOnce({ + items: [entity, null], // one of them doesn't exist + }); + + const rendered = renderHook( + () => useRelatedEntities(entity, { type: 'ownedby', kind: 'grOUP' }), + { wrapper }, + ); + + expect(rendered.result.current).toEqual({ loading: true }); + + await rendered.waitForValueToChange(() => rendered.result.current.loading); + + expect(catalogApi.getEntitiesByRefs).toHaveBeenCalledWith({ + entityRefs: ['group:default/the-owners-1', 'group:default/the-owners-2'], + }); + + expect(rendered.result.current).toEqual({ + loading: false, + entities: [entity], // filtered out the null + }); + }); +}); diff --git a/plugins/catalog-react/src/hooks/useRelatedEntities.ts b/plugins/catalog-react/src/hooks/useRelatedEntities.ts index 4cf5690ac3..7ec0a13d53 100644 --- a/plugins/catalog-react/src/hooks/useRelatedEntities.ts +++ b/plugins/catalog-react/src/hooks/useRelatedEntities.ts @@ -13,15 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { Entity, parseEntityRef } from '@backstage/catalog-model'; import { useApi } from '@backstage/core-plugin-api'; -import { chunk, groupBy } from 'lodash'; import useAsync from 'react-use/lib/useAsync'; import { catalogApiRef } from '../api'; -const BATCH_SIZE = 20; - -/** @public */ +/** + * Fetches all entities that appear in the entity's relations, optionally + * filtered by relation type and kind. + * + * @public + */ export function useRelatedEntities( entity: Entity, relationFilter: { type?: string; kind?: string }, @@ -32,70 +35,30 @@ export function useRelatedEntities( } { const filterByTypeLower = relationFilter?.type?.toLocaleLowerCase('en-US'); const filterByKindLower = relationFilter?.kind?.toLocaleLowerCase('en-US'); - const catalogApi = useApi(catalogApiRef); + const { loading, value: entities, error, } = useAsync(async () => { - const relations = entity.relations - ?.map(r => ({ type: r.type, target: parseEntityRef(r.targetRef) })) - .filter( - r => - (!filterByTypeLower || - r.type.toLocaleLowerCase('en-US') === filterByTypeLower) && - (!filterByKindLower || r.target.kind === filterByKindLower), - ); + const relations = entity.relations?.filter( + r => + (!filterByTypeLower || + r.type.toLocaleLowerCase('en-US') === filterByTypeLower) && + (!filterByKindLower || + parseEntityRef(r.targetRef).kind === filterByKindLower), + ); - if (!relations) { + if (!relations?.length) { return []; } - // Group the relations by kind and namespace to reduce the size of the request query string. - // Without this grouping, the kind and namespace would need to be specified for each relation, e.g. - // `filter=kind=component,namespace=default,name=example1&filter=kind=component,namespace=default,name=example2` - // with grouping, we can generate a query a string like - // `filter=kind=component,namespace=default,name=example1,example2` - const relationsByKindAndNamespace = Object.values( - groupBy(relations, ({ target }) => { - return `${target.kind}:${target.namespace}`.toLocaleLowerCase('en-US'); - }), - ); + const { items } = await catalogApi.getEntitiesByRefs({ + entityRefs: relations.map(r => r.targetRef), + }); - // Split the names within each group into batches to further reduce the query string length. - const batchedRelationsByKindAndNamespace: { - kind: string; - namespace: string; - nameBatches: string[][]; - }[] = []; - for (const rs of relationsByKindAndNamespace) { - batchedRelationsByKindAndNamespace.push({ - // All relations in a group have the same kind and namespace, so its arbitrary which we pick - kind: rs[0].target.kind, - namespace: rs[0].target.namespace, - nameBatches: chunk( - rs.map(r => r.target.name), - BATCH_SIZE, - ), - }); - } - - const results = await Promise.all( - batchedRelationsByKindAndNamespace.flatMap(rs => { - return rs.nameBatches.map(names => { - return catalogApi.getEntities({ - filter: { - kind: rs.kind, - 'metadata.namespace': rs.namespace, - 'metadata.name': names, - }, - }); - }); - }), - ); - - return results.flatMap(r => r.items); + return items.filter((x): x is Entity => Boolean(x)); }, [entity, filterByTypeLower, filterByKindLower]); return { diff --git a/plugins/catalog-react/src/hooks/useStarredEntities.test.tsx b/plugins/catalog-react/src/hooks/useStarredEntities.test.tsx index eccad8e17f..f21b3cb710 100644 --- a/plugins/catalog-react/src/hooks/useStarredEntities.test.tsx +++ b/plugins/catalog-react/src/hooks/useStarredEntities.test.tsx @@ -27,7 +27,7 @@ import { useStarredEntities } from './useStarredEntities'; describe('useStarredEntities', () => { let mockApi: StarredEntitiesApi; - let wrapper: React.ComponentType; + let wrapper: React.ComponentType>; const mockEntity: Entity = { apiVersion: '1', diff --git a/plugins/catalog-react/src/hooks/useStarredEntity.test.tsx b/plugins/catalog-react/src/hooks/useStarredEntity.test.tsx index ad168e5f9d..d24b27f903 100644 --- a/plugins/catalog-react/src/hooks/useStarredEntity.test.tsx +++ b/plugins/catalog-react/src/hooks/useStarredEntity.test.tsx @@ -27,7 +27,7 @@ describe('useStarredEntity', () => { toggleStarred: jest.fn(), starredEntitie$: jest.fn(), }; - let wrapper: React.ComponentType; + let wrapper: React.ComponentType>; beforeEach(() => { wrapper = (props: PropsWithChildren<{}>) => ( diff --git a/plugins/catalog-unprocessed-entities/.eslintrc.js b/plugins/catalog-unprocessed-entities/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/catalog-unprocessed-entities/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md new file mode 100644 index 0000000000..df84c73c7d --- /dev/null +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -0,0 +1,16 @@ +# @backstage/plugin-catalog-unprocessed-entities + +## 0.1.0-next.0 + +### Minor Changes + +- d44fcd9829c2: Added a new plugin to expose entities which are unprocessed or have errors processing + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 diff --git a/plugins/catalog-unprocessed-entities/README.md b/plugins/catalog-unprocessed-entities/README.md new file mode 100644 index 0000000000..fd824bec94 --- /dev/null +++ b/plugins/catalog-unprocessed-entities/README.md @@ -0,0 +1,29 @@ +# catalog-unprocessed-entities + +Frontend plugin to view unprocessed entities. + +## Requirements + +Requires the `@backstage/plugin-catalog-backend-module-unprocessed` module to be installed. + +## Installation + +Import into your App.tsx and include into the `` component: + +```tsx +import { CatalogUnprocessedEntitiesPage } from '@backstage/plugin-catalog-unprocessed-entities'; +//... + +} +/>; +``` + +## Getting started + +Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/catalog-unprocessed-entities](http://localhost:3000/catalog-unprocessed-entities). + +You can also serve the plugin in isolation by running `yarn start` in the plugin directory. +This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads. +It is only meant for local development, and the setup for it can be found inside the [/dev](./dev) directory. diff --git a/plugins/catalog-unprocessed-entities/api-report.md b/plugins/catalog-unprocessed-entities/api-report.md new file mode 100644 index 0000000000..b1e0d6f53d --- /dev/null +++ b/plugins/catalog-unprocessed-entities/api-report.md @@ -0,0 +1,24 @@ +## API Report File for "@backstage/plugin-catalog-unprocessed-entities" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { RouteRef } from '@backstage/core-plugin-api'; + +// @public +export const CatalogUnprocessedEntitiesPage: () => JSX.Element; + +// @public +export const catalogUnprocessedEntitiesPlugin: BackstagePlugin< + { + root: RouteRef; + }, + {}, + {} +>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/catalog-unprocessed-entities/dev/index.tsx b/plugins/catalog-unprocessed-entities/dev/index.tsx new file mode 100644 index 0000000000..ab11cb554d --- /dev/null +++ b/plugins/catalog-unprocessed-entities/dev/index.tsx @@ -0,0 +1,30 @@ +/* + * 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 { createDevApp } from '@backstage/dev-utils'; +import { + catalogUnprocessedEntitiesPlugin, + CatalogUnprocessedEntitiesPage, +} from '../src/plugin'; + +createDevApp() + .registerPlugin(catalogUnprocessedEntitiesPlugin) + .addPage({ + element: , + title: 'Root Page', + path: '/catalog-unprocessed-entities', + }) + .render(); diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json new file mode 100644 index 0000000000..d25ebba958 --- /dev/null +++ b/plugins/catalog-unprocessed-entities/package.json @@ -0,0 +1,53 @@ +{ + "name": "@backstage/plugin-catalog-unprocessed-entities", + "version": "0.1.0-next.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "frontend-plugin" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/catalog-model": "workspace:^", + "@backstage/core-components": "workspace:^", + "@backstage/core-plugin-api": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/theme": "workspace:^", + "@material-ui/core": "^4.9.13", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.60", + "react-use": "^17.2.4" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/core-app-api": "workspace:^", + "@backstage/dev-utils": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^12.1.3", + "@testing-library/user-event": "^14.0.0", + "@types/node": "*", + "cross-fetch": "^3.1.5", + "msw": "^1.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/catalog-unprocessed-entities/src/api/index.ts b/plugins/catalog-unprocessed-entities/src/api/index.ts new file mode 100644 index 0000000000..a4f2294aac --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/api/index.ts @@ -0,0 +1,59 @@ +/* + * 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 { DiscoveryApi, createApiRef } from '@backstage/core-plugin-api'; +import { ResponseError } from '@backstage/errors'; +import { UnprocessedEntity } from '../types'; + +/** + * {@link @backstage/core-plugin-api#ApiRef} for the {@link CatalogUnprocessedEntitiesApi} + * + * @public + */ +export const catalogUnprocessedEntitiesApiRef = + createApiRef({ + id: 'plugin.catalog-unprocessed-entities.service', + }); + +/** + * API client for the Catalog Unprocessed Entities plugin + * + * @public + */ +export class CatalogUnprocessedEntitiesApi { + url: string = ''; + + constructor(public discovery: DiscoveryApi) {} + + private async fetch(path: string, init?: RequestInit): Promise { + if (!this.url) { + this.url = await this.discovery.getBaseUrl('catalog'); + } + const resp = await fetch(`${this.url}/${path}`, init); + if (!resp.ok) { + throw await ResponseError.fromResponse(resp); + } + + return await resp.json(); + } + + async pending(): Promise<{ entities: UnprocessedEntity[] }> { + return await this.fetch('entities/unprocessed/pending'); + } + + async failed(): Promise<{ entities: UnprocessedEntity[] }> { + return await this.fetch('entities/unprocessed/failed'); + } +} diff --git a/plugins/catalog-unprocessed-entities/src/components/EntityDialog.tsx b/plugins/catalog-unprocessed-entities/src/components/EntityDialog.tsx new file mode 100644 index 0000000000..a02d8419d4 --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/components/EntityDialog.tsx @@ -0,0 +1,89 @@ +/* + * 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, { useState } from 'react'; + +import Dialog from '@material-ui/core/Dialog'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import IconButton from '@material-ui/core/IconButton'; +import { makeStyles, createStyles, Theme } from '@material-ui/core/styles'; +import CloseIcon from '@material-ui/icons/Close'; +import DescriptionIcon from '@material-ui/icons/Description'; + +import { UnprocessedEntity } from './../types'; +import { CodeSnippet } from '@backstage/core-components'; + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + closeButton: { + position: 'absolute', + right: theme.spacing(1), + top: theme.spacing(1), + color: theme.palette.grey[500], + }, + entity: { + overflow: 'scroll', + width: '100%', + }, + codeBox: { + border: '1px solid black', + padding: '1em', + }, + }), +); + +export const EntityDialog = ({ entity }: { entity: UnprocessedEntity }) => { + const [open, setOpen] = useState(false); + const classes = useStyles(); + + const openDialog = () => { + setOpen(true); + }; + + const closeDialog = () => { + setOpen(false); + }; + + const dialogContent = () => { + return ( + + ); + }; + + return ( + <> + + + + + + + + + + {dialogContent()} + + + ); +}; diff --git a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx new file mode 100644 index 0000000000..44a146f027 --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx @@ -0,0 +1,161 @@ +/* + * 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 { + ErrorPanel, + MarkdownContent, + Progress, + Table, + TableColumn, +} from '@backstage/core-components'; +import { useApi } from '@backstage/core-plugin-api'; +import { BackstageThemeOptions } from '@backstage/theme'; +import { Box, Typography, makeStyles } from '@material-ui/core'; + +import { UnprocessedEntity } from '../types'; +import { EntityDialog } from './EntityDialog'; +import { catalogUnprocessedEntitiesApiRef } from '../api'; +import useAsync from 'react-use/lib/useAsync'; + +const useStyles = makeStyles((theme: BackstageThemeOptions) => ({ + errorBox: { + color: theme.palette.status.error, + backgroundColor: theme.palette.errorBackground, + padding: '1em', + margin: '1em', + border: `1px solid ${theme.palette.status.error}`, + }, + errorTitle: { + width: '100%', + fontWeight: 'bold', + }, + successMessage: { + background: theme.palette.infoBackground, + color: theme.palette.infoText, + }, +})); + +const RenderErrorContext = ({ + error, + rowData, +}: { + error: { message: string }; + rowData: UnprocessedEntity; +}) => { + if (error.message.includes('tags.')) { + return ( + <> + Tags +
    + {rowData.unprocessed_entity.metadata.tags?.map(t => ( +
  • {t}
  • + ))} +
+ + ); + } + + if (error.message.includes('metadata.name')) { + return ( + <> + Name + + {rowData.unprocessed_entity.metadata.name} + + + ); + } + + return null; +}; + +export const FailedEntities = () => { + const classes = useStyles(); + const unprocessedApi = useApi(catalogUnprocessedEntitiesApiRef); + const { + loading, + error, + value: data, + } = useAsync(async () => await unprocessedApi.failed()); + + if (loading) { + return ; + } + if (error) { + return ; + } + + const columns: TableColumn[] = [ + { + title: entityRef, + render: (rowData: UnprocessedEntity | {}) => + (rowData as UnprocessedEntity).entity_ref, + }, + { + title: Kind, + render: (rowData: UnprocessedEntity | {}) => + (rowData as UnprocessedEntity).unprocessed_entity.kind, + }, + { + title: Owner, + render: (rowData: UnprocessedEntity | {}) => + (rowData as UnprocessedEntity).unprocessed_entity.spec?.owner || + 'unknown', + }, + { + title: Raw, + render: (rowData: UnprocessedEntity | {}) => ( + + ), + }, + ]; + return ( + <> + + No failed entities found + + } + detailPanel={({ rowData }) => { + const errors = (rowData as UnprocessedEntity).errors; + return ( + <> + {errors?.map(e => { + return ( + + + {e.name} + + + + + ); + })} + + ); + }} + /> + + ); +}; diff --git a/plugins/catalog-unprocessed-entities/src/components/PendingEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/PendingEntities.tsx new file mode 100644 index 0000000000..88ace1cfb0 --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/components/PendingEntities.tsx @@ -0,0 +1,96 @@ +/* + * 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 { + ErrorPanel, + Progress, + TableColumn, + Table, +} from '@backstage/core-components'; +import { Typography, makeStyles } from '@material-ui/core'; + +import { UnprocessedEntity } from '../types'; + +import { EntityDialog } from './EntityDialog'; +import { useApi } from '@backstage/core-plugin-api'; +import useAsync from 'react-use/lib/useAsync'; +import { catalogUnprocessedEntitiesApiRef } from '../api'; +import { BackstageTheme } from '@backstage/theme'; + +const useStyles = makeStyles((theme: BackstageTheme) => ({ + successMessage: { + background: theme.palette.infoBackground, + color: theme.palette.infoText, + padding: theme.spacing(2), + }, +})); + +export const PendingEntities = () => { + const classes = useStyles(); + const unprocessedApi = useApi(catalogUnprocessedEntitiesApiRef); + const { + loading, + error, + value: data, + } = useAsync(async () => await unprocessedApi.pending()); + + if (loading) { + return ; + } + if (error) { + return ; + } + + const columns: TableColumn[] = [ + { + title: entityRef, + render: (rowData: UnprocessedEntity | {}) => + (rowData as UnprocessedEntity).entity_ref, + }, + { + title: Kind, + render: (rowData: UnprocessedEntity | {}) => + (rowData as UnprocessedEntity).unprocessed_entity.kind, + }, + { + title: Owner, + render: (rowData: UnprocessedEntity | {}) => + (rowData as UnprocessedEntity).unprocessed_entity.spec?.owner || + 'unknown', + }, + { + title: Raw, + render: (rowData: UnprocessedEntity | {}) => ( + + ), + }, + ]; + return ( + <> +
+ No pending entities found + + } + /> + + ); +}; diff --git a/plugins/catalog-unprocessed-entities/src/components/UnprocessedEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/UnprocessedEntities.tsx new file mode 100644 index 0000000000..ba186888ec --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/components/UnprocessedEntities.tsx @@ -0,0 +1,56 @@ +/* + * 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, { useState } from 'react'; + +import { Page, Header, Content } from '@backstage/core-components'; +import { Tab } from '@material-ui/core'; +import { TabContext, TabList, TabPanel } from '@material-ui/lab'; + +import { FailedEntities } from './FailedEntities'; +import { PendingEntities } from './PendingEntities'; + +export const UnprocessedEntitiesContent = () => { + const [tab, setTab] = useState('failed'); + const handleChange = (_event: React.ChangeEvent<{}>, tabValue: string) => { + setTab(tabValue); + }; + + return ( + + + + + + + + + + + + + + + ); +}; + +export const UnprocessedEntities = () => { + return ( + +
+ + + ); +}; diff --git a/plugins/catalog-unprocessed-entities/src/index.ts b/plugins/catalog-unprocessed-entities/src/index.ts new file mode 100644 index 0000000000..a65283926e --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/index.ts @@ -0,0 +1,19 @@ +/* + * 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 { + catalogUnprocessedEntitiesPlugin, + CatalogUnprocessedEntitiesPage, +} from './plugin'; diff --git a/plugins/catalog-unprocessed-entities/src/plugin.test.ts b/plugins/catalog-unprocessed-entities/src/plugin.test.ts new file mode 100644 index 0000000000..add3d677f0 --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/plugin.test.ts @@ -0,0 +1,22 @@ +/* + * 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 { catalogUnprocessedEntitiesPlugin } from './plugin'; + +describe('catalog-unprocessed-entities', () => { + it('should export plugin', () => { + expect(catalogUnprocessedEntitiesPlugin).toBeDefined(); + }); +}); diff --git a/plugins/catalog-unprocessed-entities/src/plugin.ts b/plugins/catalog-unprocessed-entities/src/plugin.ts new file mode 100644 index 0000000000..88d3ed45ea --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/plugin.ts @@ -0,0 +1,64 @@ +/* + * 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 { + createApiFactory, + createPlugin, + createRoutableExtension, + discoveryApiRef, +} from '@backstage/core-plugin-api'; + +import { rootRouteRef } from './routes'; +import { + CatalogUnprocessedEntitiesApi, + catalogUnprocessedEntitiesApiRef, +} from './api'; + +/** + * Plugin entry point + * + * @public + */ +export const catalogUnprocessedEntitiesPlugin = createPlugin({ + id: 'catalog-unprocessed-entities', + routes: { + root: rootRouteRef, + }, + apis: [ + createApiFactory({ + api: catalogUnprocessedEntitiesApiRef, + deps: { discoveryApi: discoveryApiRef }, + factory: ({ discoveryApi }) => + new CatalogUnprocessedEntitiesApi(discoveryApi), + }), + ], +}); + +/** + * Tool page for the Catalog Unprocessed Entities Plugin + * + * @public + */ +export const CatalogUnprocessedEntitiesPage = + catalogUnprocessedEntitiesPlugin.provide( + createRoutableExtension({ + name: 'CatalogUnprocessedEntitiesPage', + component: () => + import('./components/UnprocessedEntities').then( + m => m.UnprocessedEntities, + ), + mountPoint: rootRouteRef, + }), + ); diff --git a/plugins/catalog-unprocessed-entities/src/routes.ts b/plugins/catalog-unprocessed-entities/src/routes.ts new file mode 100644 index 0000000000..1bd268c392 --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/routes.ts @@ -0,0 +1,20 @@ +/* + * 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 { createRouteRef } from '@backstage/core-plugin-api'; + +export const rootRouteRef = createRouteRef({ + id: 'catalog-unprocessed-entities', +}); diff --git a/plugins/catalog-unprocessed-entities/src/setupTests.ts b/plugins/catalog-unprocessed-entities/src/setupTests.ts new file mode 100644 index 0000000000..73dd8dce47 --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/setupTests.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. + */ +import '@testing-library/jest-dom'; +import 'cross-fetch/polyfill'; diff --git a/plugins/catalog-unprocessed-entities/src/types.ts b/plugins/catalog-unprocessed-entities/src/types.ts new file mode 100644 index 0000000000..490027b57a --- /dev/null +++ b/plugins/catalog-unprocessed-entities/src/types.ts @@ -0,0 +1,45 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; + +export type UnprocessedEntity = { + entity_id: string; + entity_ref: string; + unprocessed_entity: Entity; + unprocessed_hash?: string; + processed_entity?: Entity; + result_hash?: string; + cache?: UnprocessedEntityCache; + next_update_at: string | Date; + last_discovery_at: string | Date; // remove? + errors?: UnprocessedEntityError[]; + location_key?: string; +}; + +export type UnprocessedEntityCache = { + ttl: number; + cache: object; +}; + +export type UnprocessedEntityError = { + name: string; + message: string; + cause: { + name: string; + message: string; + stack: string; + }; +}; diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 07603b5a5b..fc76828391 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-catalog +## 1.11.1-next.1 + +### Patch Changes + +- 08f177b91084: Add link from Template entity to the scaffolder launch page for the template in the AboutCard. +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.11.1-next.0 ### Patch Changes diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md index 970d8d3251..6bb4fcc4a1 100644 --- a/plugins/catalog/api-report.md +++ b/plugins/catalog/api-report.md @@ -105,6 +105,13 @@ export const catalogPlugin: BackstagePlugin< }, true >; + createFromTemplate: ExternalRouteRef< + { + namespace: string; + templateName: string; + }, + true + >; }, CatalogInputPluginOptions >; diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index e76be49515..7ce5ee9b1c 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.11.1-next.0", + "version": "1.11.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,6 +40,7 @@ "@backstage/integration-react": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", + "@backstage/plugin-scaffolder-common": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@backstage/plugin-search-react": "workspace:^", "@backstage/theme": "workspace:^", diff --git a/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx b/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx index 869d6f1757..e8d2657e9f 100644 --- a/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx @@ -30,7 +30,7 @@ import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import userEvent from '@testing-library/user-event'; import { screen } from '@testing-library/react'; import React from 'react'; -import { viewTechDocRouteRef } from '../../routes'; +import { createFromTemplateRouteRef, viewTechDocRouteRef } from '../../routes'; import { AboutCard } from './AboutCard'; describe('', () => { @@ -505,4 +505,165 @@ describe('', () => { expect(screen.getByText('View TechDocs')).toBeVisible(); expect(screen.getByText('View TechDocs').closest('a')).toBeNull(); }); + + it('renders launch template link', async () => { + const entity = { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { + name: 'create-react-app-template', + namespace: 'default', + }, + }; + + await renderInTestApp( + + + + + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + '/create/templates/:namespace/:templateName': + createFromTemplateRouteRef, + }, + }, + ); + + expect(screen.getByText('Launch Template')).toBeVisible(); + expect(screen.getByText('Launch Template').closest('a')).toHaveAttribute( + 'href', + '/create/templates/default/create-react-app-template', + ); + }); + + it.each([ + { + testName: 'entity is not a template', + entity: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Component', + metadata: { + name: 'create-react-app-template', + namespace: 'default', + }, + }, + }, + { + testName: 'apiVersion is not scaffolder.backstage.io/v1beta3', + entity: { + apiVersion: 'v1', + kind: 'Template', + metadata: { + name: 'create-react-app-template', + namespace: 'default', + }, + }, + }, + ])( + 'should not render launch template link when $testName', + async ({ entity }) => { + await renderInTestApp( + + + + + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + '/create/templates/:namespace/:templateName': + createFromTemplateRouteRef, + }, + }, + ); + + expect(screen.queryByText('Launch Template')).toBeNull(); + }, + ); + + it('renders disabled launch template link when route is not bound', async () => { + const entity = { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { + name: 'create-react-app-template', + namespace: 'default', + }, + }; + + await renderInTestApp( + + + + + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + }, + }, + ); + + expect(screen.getByText('Launch Template')).toBeVisible(); + expect(screen.getByText('Launch Template').closest('a')).toBeNull(); + }); }); diff --git a/plugins/catalog/src/components/AboutCard/AboutCard.tsx b/plugins/catalog/src/components/AboutCard/AboutCard.tsx index cb48be2b26..a08a9be5a4 100644 --- a/plugins/catalog/src/components/AboutCard/AboutCard.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutCard.tsx @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { ANNOTATION_EDIT_URL, ANNOTATION_LOCATION, @@ -30,6 +29,7 @@ import { alertApiRef, errorApiRef, useApi, + useApp, useRouteRef, } from '@backstage/core-plugin-api'; import { @@ -41,6 +41,7 @@ import { getEntitySourceLocation, useEntity, } from '@backstage/plugin-catalog-react'; +import { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { Card, CardContent, @@ -49,11 +50,13 @@ import { IconButton, makeStyles, } from '@material-ui/core'; +import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; import CachedIcon from '@material-ui/icons/Cached'; import DocsIcon from '@material-ui/icons/Description'; import EditIcon from '@material-ui/icons/Edit'; import React, { useCallback } from 'react'; -import { viewTechDocRouteRef } from '../../routes'; + +import { createFromTemplateRouteRef, viewTechDocRouteRef } from '../../routes'; import { AboutContent } from './AboutContent'; const useStyles = makeStyles({ @@ -90,6 +93,7 @@ export interface AboutCardProps { */ export function AboutCard(props: AboutCardProps) { const { variant } = props; + const app = useApp(); const classes = useStyles(); const { entity } = useEntity(); const scmIntegrationsApi = useApi(scmIntegrationsApiRef); @@ -97,6 +101,7 @@ export function AboutCard(props: AboutCardProps) { const alertApi = useApi(alertApiRef); const errorApi = useApi(errorApiRef); const viewTechdocLink = useRouteRef(viewTechDocRouteRef); + const templateRoute = useRouteRef(createFromTemplateRouteRef); const entitySourceLocation = getEntitySourceLocation( entity, @@ -126,6 +131,26 @@ export function AboutCard(props: AboutCardProps) { }), }; + const subHeaderLinks = [viewInSource, viewInTechDocs]; + + if (isTemplateEntityV1beta3(entity)) { + const Icon = app.getSystemIcon('scaffolder') ?? CreateComponentIcon; + + const launchTemplate: IconLinkVerticalProps = { + label: 'Launch Template', + icon: , + disabled: !templateRoute, + href: + templateRoute && + templateRoute({ + templateName: entity.metadata.name, + namespace: entity.metadata.namespace || DEFAULT_NAMESPACE, + }), + }; + + subHeaderLinks.push(launchTemplate); + } + let cardClass = ''; if (variant === 'gridItem') { cardClass = classes.gridItemCard; @@ -179,7 +204,7 @@ export function AboutCard(props: AboutCardProps) { } - subheader={} + subheader={} /> diff --git a/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.test.tsx b/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.test.tsx index 94a9a86b70..0ebda6e64d 100644 --- a/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.test.tsx +++ b/plugins/catalog/src/components/DependencyOfComponentsCard/DependencyOfComponentsCard.test.tsx @@ -27,12 +27,14 @@ import React from 'react'; import { DependencyOfComponentsCard } from './DependencyOfComponentsCard'; describe('', () => { - const getEntities: jest.MockedFunction = jest.fn(); - let Wrapper: React.ComponentType; + const getEntitiesByRefs: jest.MockedFunction< + CatalogApi['getEntitiesByRefs'] + > = jest.fn(); + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -85,7 +87,7 @@ describe('', () => { }, ], }; - getEntities.mockResolvedValue({ + getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.test.tsx b/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.test.tsx index 657f95c60f..ee8931143f 100644 --- a/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.test.tsx +++ b/plugins/catalog/src/components/DependsOnComponentsCard/DependsOnComponentsCard.test.tsx @@ -27,12 +27,14 @@ import React from 'react'; import { DependsOnComponentsCard } from './DependsOnComponentsCard'; describe('', () => { - const getEntities: jest.MockedFunction = jest.fn(); - let Wrapper: React.ComponentType; + const getEntitiesByRefs: jest.MockedFunction< + CatalogApi['getEntitiesByRefs'] + > = jest.fn(); + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -85,7 +87,7 @@ describe('', () => { }, ], }; - getEntities.mockResolvedValue({ + getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.test.tsx b/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.test.tsx index 5a77cd6ab4..0e760f9155 100644 --- a/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.test.tsx +++ b/plugins/catalog/src/components/DependsOnResourcesCard/DependsOnResourcesCard.test.tsx @@ -27,12 +27,14 @@ import React from 'react'; import { DependsOnResourcesCard } from './DependsOnResourcesCard'; describe('', () => { - const getEntities: jest.MockedFunction = jest.fn(); - let Wrapper: React.ComponentType; + const getEntitiesByRefs: jest.MockedFunction< + CatalogApi['getEntitiesByRefs'] + > = jest.fn(); + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -85,7 +87,7 @@ describe('', () => { }, ], }; - getEntities.mockResolvedValue({ + getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx index 1961fe6cac..5e6e8ff3a9 100644 --- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx @@ -142,7 +142,7 @@ export function EntityContextMenu(props: EntityContextMenuProps) { transformOrigin={{ vertical: 'top', horizontal: 'right' }} aria-labelledby="long-menu" > - + {extraItems} ', () => { - const getEntities: jest.MockedFunction = jest.fn(); - let Wrapper: React.ComponentType; + const getEntitiesByRefs: jest.MockedFunction< + CatalogApi['getEntitiesByRefs'] + > = jest.fn(); + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -85,7 +87,7 @@ describe('', () => { }, ], }; - getEntities.mockResolvedValue({ + getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.test.tsx b/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.test.tsx index 364d503a96..d78d307c96 100644 --- a/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.test.tsx +++ b/plugins/catalog/src/components/HasResourcesCard/HasResourcesCard.test.tsx @@ -27,12 +27,14 @@ import React from 'react'; import { HasResourcesCard } from './HasResourcesCard'; describe('', () => { - const getEntities: jest.MockedFunction = jest.fn(); - let Wrapper: React.ComponentType; + const getEntitiesByRefs: jest.MockedFunction< + CatalogApi['getEntitiesByRefs'] + > = jest.fn(); + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -80,7 +82,7 @@ describe('', () => { }, ], }; - getEntities.mockResolvedValue({ + getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.test.tsx b/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.test.tsx index b76a0a68ec..713313b7c6 100644 --- a/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.test.tsx +++ b/plugins/catalog/src/components/HasSubcomponentsCard/HasSubcomponentsCard.test.tsx @@ -27,12 +27,14 @@ import React from 'react'; import { HasSubcomponentsCard } from './HasSubcomponentsCard'; describe('', () => { - const getEntities: jest.MockedFunction = jest.fn(); - let Wrapper: React.ComponentType; + const getEntitiesByRefs: jest.MockedFunction< + CatalogApi['getEntitiesByRefs'] + > = jest.fn(); + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -85,7 +87,7 @@ describe('', () => { }, ], }; - getEntities.mockResolvedValue({ + getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.test.tsx b/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.test.tsx index 634fe57e82..9844708f85 100644 --- a/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.test.tsx +++ b/plugins/catalog/src/components/HasSystemsCard/HasSystemsCard.test.tsx @@ -27,12 +27,14 @@ import React from 'react'; import { HasSystemsCard } from './HasSystemsCard'; describe('', () => { - const getEntities: jest.MockedFunction = jest.fn(); - let Wrapper: React.ComponentType; + const getEntitiesByRefs: jest.MockedFunction< + CatalogApi['getEntitiesByRefs'] + > = jest.fn(); + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} ); @@ -85,7 +87,7 @@ describe('', () => { }, ], }; - getEntities.mockResolvedValue({ + getEntitiesByRefs.mockResolvedValue({ items: [ { apiVersion: 'v1', diff --git a/plugins/catalog/src/plugin.ts b/plugins/catalog/src/plugin.ts index ea6ddcaff2..711f52767a 100644 --- a/plugins/catalog/src/plugin.ts +++ b/plugins/catalog/src/plugin.ts @@ -21,7 +21,11 @@ import { entityRouteRef, starredEntitiesApiRef, } from '@backstage/plugin-catalog-react'; -import { createComponentRouteRef, viewTechDocRouteRef } from './routes'; +import { + createComponentRouteRef, + createFromTemplateRouteRef, + viewTechDocRouteRef, +} from './routes'; import { createApiFactory, createComponentExtension, @@ -77,6 +81,7 @@ export const catalogPlugin = createPlugin({ externalRoutes: { createComponent: createComponentRouteRef, viewTechDoc: viewTechDocRouteRef, + createFromTemplate: createFromTemplateRouteRef, }, __experimentalConfigure( options?: CatalogInputPluginOptions, diff --git a/plugins/catalog/src/routes.ts b/plugins/catalog/src/routes.ts index 5c0d195d74..ab70a3c551 100644 --- a/plugins/catalog/src/routes.ts +++ b/plugins/catalog/src/routes.ts @@ -30,6 +30,12 @@ export const viewTechDocRouteRef = createExternalRouteRef({ params: ['namespace', 'kind', 'name'], }); +export const createFromTemplateRouteRef = createExternalRouteRef({ + id: 'create-from-template', + optional: true, + params: ['namespace', 'templateName'], +}); + export const rootRouteRef = createRouteRef({ id: 'catalog', }); diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 3466ea9586..74621df0ee 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.15-next.1 + +### Patch Changes + +- 50c4457119ec: Fixed publish configuration. +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-cicd-statistics@0.1.21-next.1 + ## 0.1.15-next.0 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 0f44e7c0fa..8a0948db17 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,14 +1,13 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.15-next.0", + "version": "0.1.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "publishConfig": { "access": "public", - "main": "dist/index.cjs.js", - "module": "dist/index.esm.js", + "main": "dist/index.esm.js", "types": "dist/index.d.ts" }, "backstage": { diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index cd6ea6dba8..2363deb597 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-cicd-statistics +## 0.1.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + ## 0.1.21-next.0 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 31027c84e7..4a2788e4f2 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.21-next.0", + "version": "0.1.21-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index f1ede4c911..4cfbf3860c 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-circleci +## 0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.3.19-next.0 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index dda06965c1..1851c1ca9e 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.19-next.0", + "version": "0.3.19-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index 9ce48f5525..4f9150dd33 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-cloudbuild +## 0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.3.19-next.0 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index 5a2877a9a5..f1d921a6ed 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.19-next.0", + "version": "0.3.19-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index 2f4b706935..fa739da3bb 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-code-climate +## 0.1.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.19-next.0 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index c531a6bff4..6c45218c74 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.19-next.0", + "version": "0.1.19-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index d9dd489217..fce9da3e5c 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-code-coverage-backend +## 0.2.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + ## 0.2.12-next.0 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 24cdbc2f60..b965e2914f 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.12-next.0", + "version": "0.2.12-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,7 +44,7 @@ "@types/supertest": "^2.0.8", "msw": "^1.0.0", "supertest": "^6.1.6", - "xml2js": "^0.5.0" + "xml2js": "^0.6.0" }, "files": [ "dist", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index 064f1bc791..8a4d90e912 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-code-coverage +## 0.2.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + ## 0.2.12-next.0 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index 9f4b310d04..4ea3ea8454 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.12-next.0", + "version": "0.2.12-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index 0dc5111af3..e0cf1b136c 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-codescene +## 0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + ## 0.1.14-next.0 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 9cd8baa955..d977d66c48 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.14-next.0", + "version": "0.1.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 4e1ed10101..8b76c4e0f6 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-config-schema +## 0.1.42-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + ## 0.1.42-next.0 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 4e1349974f..4d70b97116 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.42-next.0", + "version": "0.1.42-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index 59670358ad..b2ea3e4036 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-cost-insights +## 0.12.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-cost-insights-common@0.1.1 + ## 0.12.8-next.0 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index b1ab7f444c..50dcba5a96 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.8-next.0", + "version": "0.12.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index d4b5c74d9c..cd864d638a 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-devtools-backend +## 0.1.1-next.1 + +### Patch Changes + +- c312192e61dd: Expose permissions through the metadata endpoint. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-devtools-common@0.1.1-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index d59cf963db..96f4867cc9 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.1.1-next.0", + "version": "0.1.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools-backend/src/service/router.ts b/plugins/devtools-backend/src/service/router.ts index a346ad3183..fbeeb5af84 100644 --- a/plugins/devtools-backend/src/service/router.ts +++ b/plugins/devtools-backend/src/service/router.ts @@ -21,6 +21,7 @@ import { devToolsConfigReadPermission, devToolsExternalDependenciesReadPermission, devToolsInfoReadPermission, + devToolsPermissions, } from '@backstage/plugin-devtools-common'; import { Config } from '@backstage/config'; @@ -31,6 +32,7 @@ import Router from 'express-promise-router'; import { errorHandler } from '@backstage/backend-common'; import express from 'express'; import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; +import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; /** @public */ export interface RouterOptions { @@ -51,6 +53,11 @@ export async function createRouter( const router = Router(); router.use(express.json()); + router.use( + createPermissionIntegrationRouter({ + permissions: devToolsPermissions, + }), + ); router.get('/health', (_req, res) => { res.status(200).json({ status: 'ok' }); diff --git a/plugins/devtools-common/CHANGELOG.md b/plugins/devtools-common/CHANGELOG.md index 6a566d0a67..71d8d86821 100644 --- a/plugins/devtools-common/CHANGELOG.md +++ b/plugins/devtools-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-devtools-common +## 0.1.1-next.0 + +### Patch Changes + +- 459331f657ec: Export the list of permissions +- Updated dependencies + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/types@1.0.2 + ## 0.1.0 ### Minor Changes diff --git a/plugins/devtools-common/api-report.md b/plugins/devtools-common/api-report.md index 7e38ff05b0..6594b0d8a4 100644 --- a/plugins/devtools-common/api-report.md +++ b/plugins/devtools-common/api-report.md @@ -40,6 +40,9 @@ export type DevToolsInfo = { // @public (undocumented) export const devToolsInfoReadPermission: BasicPermission; +// @public +export const devToolsPermissions: BasicPermission[]; + // @public (undocumented) export type Endpoint = { name: string; diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index 0e114e39b9..eef4731bbb 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-devtools-common", "description": "Common functionalities for the devtools plugin", - "version": "0.1.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools-common/src/permissions.ts b/plugins/devtools-common/src/permissions.ts index ae62cfdc19..ba464f7d80 100644 --- a/plugins/devtools-common/src/permissions.ts +++ b/plugins/devtools-common/src/permissions.ts @@ -47,3 +47,15 @@ export const devToolsExternalDependenciesReadPermission = createPermission({ name: 'devtools.external-dependencies', attributes: { action: 'read' }, }); + +/** + * List of all Devtools permissions + * + * @public + */ +export const devToolsPermissions = [ + devToolsAdministerPermission, + devToolsInfoReadPermission, + devToolsConfigReadPermission, + devToolsExternalDependenciesReadPermission, +]; diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index c9db73ff44..3c7f156a03 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-devtools +## 0.1.1-next.1 + +### Patch Changes + +- bbe15f70c5cc: Added note to README about how secrets are displayed in the Config tab of the DevTools plugin +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-devtools-common@0.1.1-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.13-next.0 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/devtools/README.md b/plugins/devtools/README.md index fc9f1f7312..fb58c1378a 100644 --- a/plugins/devtools/README.md +++ b/plugins/devtools/README.md @@ -16,6 +16,8 @@ Lists helpful information about your current running Backstage instance such as: Lists the configuration being used by your current running Backstage instance. +**Note:** The Config tab uses the configuration schema [defined by each plugin](https://backstage.io/docs/conf/defining) to be able to mask secrets. It does this by checking that the [visibility](https://backstage.io/docs/conf/defining#visibility) has been marked as `secret`. If this is not set then the secret will appear in clear text. To mitigate this it is highly recommended that you enable the [permission framework](https://backstage.io/docs/permissions/overview) and [apply the proper permissions](#permissions)). If you do see secrets in clear text please contact the plugin's author to get the visibility set to secret for the applicable property. + ![Example of Config tab](./docs/devtools-config-tab.png) ## Optional Features @@ -147,7 +149,7 @@ To use the permission framework to secure the DevTools sidebar option you'll wan ```sh # From your Backstage root directory - yarn add --cwd packages/app @backstage/plugin-devtools + yarn add --cwd packages/app @backstage/plugin-devtools-common ``` 2. Then open the `packages/app/src/components/Root/Root.tsx` file diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 3023c83d71..7bb6028604 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.1-next.0", + "version": "0.1.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index ab21d254ac..b260ec4cc7 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-dynatrace +## 6.0.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 6.0.0-next.0 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index 551830fd31..d578645b87 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "6.0.0-next.0", + "version": "6.0.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-backend/CHANGELOG.md b/plugins/entity-feedback-backend/CHANGELOG.md index 70ea3b224e..e0cde75e21 100644 --- a/plugins/entity-feedback-backend/CHANGELOG.md +++ b/plugins/entity-feedback-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-entity-feedback-backend +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-entity-feedback-common@0.1.1 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index c47d574acf..4f6c7e1601 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.4-next.0", + "version": "0.1.4-next.1", "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 1d562e4c47..d49fd212eb 100644 --- a/plugins/entity-feedback/CHANGELOG.md +++ b/plugins/entity-feedback/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-entity-feedback +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-entity-feedback-common@0.1.1 + ## 0.2.2-next.0 ### Patch Changes diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json index fd9afe389b..665a48e315 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.2-next.0", + "version": "0.2.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-validation/CHANGELOG.md b/plugins/entity-validation/CHANGELOG.md index 2e0da12a3c..4215ebef4d 100644 --- a/plugins/entity-validation/CHANGELOG.md +++ b/plugins/entity-validation/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-entity-validation +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index 2e366e6534..e1d6bafd4a 100644 --- a/plugins/entity-validation/package.json +++ b/plugins/entity-validation/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-validation", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index 6ed5764e5a..afe9ed8d8d 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index efe222baeb..e4857d952c 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 4e65353911..bd88fb7d59 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 3c9aa9a1ed..c513fdef75 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.1.8-next.0", + "version": "0.1.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index ebf3e3a3f6..c6c9f0e0d3 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index 47dc1d4428..4436959b64 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.1.8-next.0", + "version": "0.1.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index b9f27bdaf2..c3dae60082 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index d9bf28fa7b..a084988358 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.1.8-next.0", + "version": "0.1.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index ccca2e505a..08e06c45fa 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-github +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 625af1abf2..b8964aec2f 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.1.8-next.0", + "version": "0.1.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index 5ea11ebf9f..febe50d70e 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 04422bf7cf..55dbfa1297 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.1.8-next.0", + "version": "0.1.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index b3e92112a8..929a7e12a4 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.7-next.1 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 3e37dc5cde..3d98fefd8c 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.8-next.0", + "version": "0.1.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 0b3793bd0f..111309b65f 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + ## 0.2.7-next.0 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 1cb8201b1b..864fe935f3 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.7-next.0", + "version": "0.2.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index 17182dc4f5..7ddb5c1a0e 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-node +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + ## 0.2.7-next.0 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 6652b40f10..fbcd7dc90d 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.7-next.0", + "version": "0.2.7-next.1", "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 21205240e3..adf4f4486a 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @internal/plugin-todo-list-backend +## 1.0.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/config@1.0.7 + ## 1.0.14-next.0 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index c00d019fec..5f892c324d 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.14-next.0", + "version": "1.0.14-next.1", "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 acf7ad926d..8218aae8e7 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.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.6-next.0 + ## 1.0.10 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 25dcf673e2..2fb7961e8e 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.10", + "version": "1.0.11-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 2d722069fa..9621681755 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/plugin-todo-list +## 1.0.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 1.0.14-next.0 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index efb84fbe3b..d90148fa23 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.14-next.0", + "version": "1.0.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index 24b7553ff5..e880365776 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-explore-backend +## 0.0.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.2-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.0.8-next.0 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index ef1deae7f9..7cedc12a09 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.8-next.0", + "version": "0.0.8-next.1", "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 1ac14d2f06..d3f8578c3f 100644 --- a/plugins/explore-react/CHANGELOG.md +++ b/plugins/explore-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-explore-react +## 0.0.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-explore-common@0.0.1 + ## 0.0.28 ### Patch Changes diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index 104fd10642..53f47f9dd5 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.28", + "version": "0.0.29-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index a7b5b1a3a0..ebc70aba27 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-explore +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.29-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.4.4-next.0 ### Patch Changes diff --git a/plugins/explore/package.json b/plugins/explore/package.json index ec7c928de6..436755a2a5 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.4-next.0", + "version": "0.4.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index 734ef1742f..95570a88cd 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-firehydrant +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 5c011fdd4b..691f284d2e 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.3-next.0", + "version": "0.2.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index 4d370b8116..ab6d2aacd5 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-fossa +## 0.2.51-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.2.51-next.0 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index d49ff6f36c..d12271a710 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.51-next.0", + "version": "0.2.51-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/fossa/src/components/FossaCard/FossaCard.test.tsx b/plugins/fossa/src/components/FossaCard/FossaCard.test.tsx index 046e3e9860..52ddaa0f4e 100644 --- a/plugins/fossa/src/components/FossaCard/FossaCard.test.tsx +++ b/plugins/fossa/src/components/FossaCard/FossaCard.test.tsx @@ -26,7 +26,7 @@ describe('', () => { getFindingSummary: jest.fn(), getFindingSummaries: jest.fn(), }; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( diff --git a/plugins/fossa/src/components/FossaPage/FossaPage.test.tsx b/plugins/fossa/src/components/FossaPage/FossaPage.test.tsx index be07b4707f..ec78ac906b 100644 --- a/plugins/fossa/src/components/FossaPage/FossaPage.test.tsx +++ b/plugins/fossa/src/components/FossaPage/FossaPage.test.tsx @@ -38,7 +38,7 @@ describe('', () => { getFindingSummary: jest.fn(), getFindingSummaries: jest.fn(), }; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { Wrapper = ({ children }: { children?: React.ReactNode }) => ( diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index d6062af499..e0ec33fb34 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-gcalendar +## 0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.3.15-next.0 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index 381f7d2ff8..e19eeaffe7 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.15-next.0", + "version": "0.3.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md index 24890793d3..00d34e2116 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-gcp-projects +## 0.3.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.3.38-next.0 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index b70f0015a7..67d986bbb2 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.38-next.0", + "version": "0.3.38-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index 236e85cdf0..a2ad4aa5ca 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-git-release-manager +## 0.3.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.3.32-next.0 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index fb733dc46b..40366322e1 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.32-next.0", + "version": "0.3.32-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index 0290b62cc0..2cfcaccc0b 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-github-actions +## 0.6.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/theme@0.4.0-next.0 + ## 0.6.0-next.0 ### Minor Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index 8e41f7ff3e..2526d6f7f9 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.6.0-next.0", + "version": "0.6.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index bfa7655804..064bf6f4e4 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-github-deployments +## 0.1.50-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/theme@0.4.0-next.0 + ## 0.1.50-next.0 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 29de2e5115..86f187690f 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.50-next.0", + "version": "0.1.50-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index 0e5534e28b..ea2e271e11 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-github-issues +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.2.8-next.0 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index 4c1c099160..97f630f546 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.8-next.0", + "version": "0.2.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md index ba1d162916..c48e039224 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index ce0332cc51..9cfc642de2 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.13-next.0", + "version": "0.1.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md index 0b130eed42..eff4c8727e 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-gitops-profiles +## 0.3.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + ## 0.3.37-next.0 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index e64eb4f3db..1fd049e1c1 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.37-next.0", + "version": "0.3.37-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index 61efa3401d..0be3f8388a 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-gocd +## 0.1.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.25-next.0 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index a2114d66dc..a33b05139a 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.25-next.0", + "version": "0.1.25-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index 7e12506960..23e5a6630c 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphiql +## 0.2.51-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.2.51-next.0 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index e0b7b94b82..872f007f42 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.51-next.0", + "version": "0.2.51-next.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index 3b915f994d..6c4a991a78 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphql-backend +## 0.1.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-catalog-graphql@0.3.21-next.0 + - @backstage/config@1.0.7 + ## 0.1.36-next.0 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index ccda2805de..32697bc1b0 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.36-next.0", + "version": "0.1.36-next.1", "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 e8d42388ef..23faf1e279 100644 --- a/plugins/graphql-voyager/CHANGELOG.md +++ b/plugins/graphql-voyager/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphql-voyager +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index 8b632ad94f..2616709229 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.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index 32213cb62f..58063ce07b 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-home-react +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + ## 0.1.0-next.0 ### Minor Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index f38e07617b..75cc90f554 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home-react", "description": "A Backstage plugin that contains react components helps you build a home page", - "version": "0.1.0-next.0", + "version": "0.1.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,7 +37,7 @@ "@backstage/core-plugin-api": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "@rjsf/utils": "5.6.0" + "@rjsf/utils": "5.7.3" }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 3b589b2c5a..3fe31de70b 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-home +## 0.5.3-next.1 + +### Patch Changes + +- d1cfb4e4c4cd: Update set up documentation to export homepage as element instead of React component. +- 2e4940e1a8f8: Allow more customization for the CustomHomepageGrid +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-home-react@0.1.0-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + ## 0.5.3-next.0 ### Patch Changes diff --git a/plugins/home/README.md b/plugins/home/README.md index 20b91289b1..8bb474aa4b 100644 --- a/plugins/home/README.md +++ b/plugins/home/README.md @@ -22,11 +22,9 @@ yarn add --cwd packages/app @backstage/plugin-home ```tsx import React from 'react'; -export const HomePage = () => { - return { - /* TODO: Compose a Home Page here */ - }; -}; +export const homePage = ( + /* TODO: Compose a Home Page here */ +); ``` 2. Add a route where the homepage will live, presumably `/`. @@ -35,11 +33,11 @@ export const HomePage = () => { ```tsx import { HomepageCompositionRoot } from '@backstage/plugin-home'; -import { HomePage } from './components/home/HomePage'; +import { homePage } from './components/home/HomePage'; // ... }> - + {homePage} ; // ... ``` @@ -72,15 +70,13 @@ import React from 'react'; import Grid from '@material-ui/core/Grid'; import { RandomJokeHomePageComponent } from '@backstage/plugin-home'; -export const HomePage = () => { - return ( - - - - +export const homePage = ( + + + - ); -}; + +); ``` Additionally, the App Integrator is provided an escape hatch in case the way the card is rendered does not fit their requirements. They may optionally pass the `Renderer`-prop, which will receive the `title`, `content` and optionally `actions`, `settings` and `contextProvider`, if they exist for the component. This allows the App Integrator to render the content in any way they want. @@ -102,18 +98,16 @@ import { HomePageSearchBar } from '@backstage/plugin-search'; import { HomePageCalendar } from '@backstage/plugin-gcalendar'; import { MicrosoftCalendarCard } from '@backstage/plugin-microsoft-calendar'; -export const HomePage = () => { - return ( - - // Insert the allowed widgets inside the grid - - - - - - - ); -}; +export const homePage = ( + + // Insert the allowed widgets inside the grid + + + + + + +); ``` ### Creating Customizable Components @@ -247,4 +241,5 @@ Additionally, the API is at a very early state, so contributing with additional ### Homepage Templates -We are hoping that we together can build up a collection of Homepage templates. We therefore put together a place where we can collect all the templates for the Home Plugin in the [storybook](https://backstage.io/storybook/?path=/story/plugins-home-templates). If you would like to contribute with a template, start by taking a look at the [DefaultTemplate storybook example to create your own](/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx), and then open a PR with your suggestion. +We are hoping that we together can build up a collection of Homepage templates. We therefore put together a place where we can collect all the templates for the Home Plugin in the [storybook](https://backstage.io/storybook/?path=/story/plugins-home-templates). +If you would like to contribute with a template, start by taking a look at the [DefaultTemplate storybook example](/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx) or [CustomizableTemplate storybook example](/packages/app/src/components/home/templates/CustomizableTemplate.stories.tsx) to create your own, and then open a PR with your suggestion. diff --git a/plugins/home/api-report.md b/plugins/home/api-report.md index 56b1f54331..e4ff522062 100644 --- a/plugins/home/api-report.md +++ b/plugins/home/api-report.md @@ -19,6 +19,9 @@ import { ReactNode } from 'react'; import { RendererProps as RendererProps_2 } from '@backstage/plugin-home-react'; import { RouteRef } from '@backstage/core-plugin-api'; +// @public +export type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; + // @public @deprecated (undocumented) export type CardConfig = CardConfig_2; @@ -77,11 +80,20 @@ export const CustomHomepageGrid: ( props: CustomHomepageGridProps, ) => JSX.Element; -// @public (undocumented) +// @public export type CustomHomepageGridProps = { children?: ReactNode; config?: LayoutConfiguration[]; rowHeight?: number; + breakpoints?: Record; + cols?: Record; + containerPadding?: [number, number] | Record; + containerMargin?: [number, number] | Record; + maxRows?: number; + style?: React_2.CSSProperties; + compactType?: 'vertical' | 'horizontal' | null; + allowOverlap?: boolean; + preventCollision?: boolean; }; // @public diff --git a/plugins/home/package.json b/plugins/home/package.json index 5c5bbb26d2..c445295f34 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.5.3-next.0", + "version": "0.5.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,10 +43,10 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", - "@rjsf/core-v5": "npm:@rjsf/core@5.6.0", - "@rjsf/material-ui": "5.6.0", - "@rjsf/utils": "5.6.0", - "@rjsf/validator-ajv8": "5.6.0", + "@rjsf/core-v5": "npm:@rjsf/core@5.7.3", + "@rjsf/material-ui": "5.7.3", + "@rjsf/utils": "5.7.3", + "@rjsf/validator-ajv8": "5.7.3", "@types/react": "^16.13.1 || ^17.0.0", "lodash": "^4.17.21", "react-grid-layout": "^1.3.4", diff --git a/plugins/home/src/components/CustomHomepage/CustomHomepageButtons.tsx b/plugins/home/src/components/CustomHomepage/CustomHomepageButtons.tsx index c2fdf5b979..22c88a30c7 100644 --- a/plugins/home/src/components/CustomHomepage/CustomHomepageButtons.tsx +++ b/plugins/home/src/components/CustomHomepage/CustomHomepageButtons.tsx @@ -20,6 +20,7 @@ import SaveIcon from '@material-ui/icons/Save'; import DeleteIcon from '@material-ui/icons/Delete'; import AddIcon from '@material-ui/icons/Add'; import EditIcon from '@material-ui/icons/Edit'; +import CancelIcon from '@material-ui/icons/Cancel'; const useStyles = makeStyles((theme: Theme) => createStyles({ @@ -41,6 +42,8 @@ interface CustomHomepageButtonsProps { clearLayout: () => void; setAddWidgetDialogOpen: (open: boolean) => void; changeEditMode: (mode: boolean) => void; + defaultConfigAvailable: boolean; + restoreDefault: () => void; } export const CustomHomepageButtons = (props: CustomHomepageButtonsProps) => { const { @@ -49,6 +52,8 @@ export const CustomHomepageButtons = (props: CustomHomepageButtonsProps) => { clearLayout, setAddWidgetDialogOpen, changeEditMode, + defaultConfigAvailable, + restoreDefault, } = props; const styles = useStyles(); @@ -59,27 +64,41 @@ export const CustomHomepageButtons = (props: CustomHomepageButtonsProps) => { variant="contained" color="primary" onClick={() => changeEditMode(true)} + size="small" startIcon={} > Edit ) : ( <> + {defaultConfigAvailable && ( + + )} {numWidgets > 0 && ( )} + + + {pod.metadata?.name} - {error.type} + + + + + {dialogContent()} + + {pf && pf.type === 'docs' && ( + } + target="_blank" + rel="noopener" + > + Open docs + + )} + + + + ); +}; diff --git a/plugins/kubernetes/src/components/Pods/FixDialog/index.ts b/plugins/kubernetes/src/components/Pods/FixDialog/index.ts new file mode 100644 index 0000000000..35601f9bd6 --- /dev/null +++ b/plugins/kubernetes/src/components/Pods/FixDialog/index.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 * from './FixDialog'; diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/ContainerCard.tsx b/plugins/kubernetes/src/components/Pods/PodDrawer/ContainerCard.tsx index eac64ae741..970982d7a3 100644 --- a/plugins/kubernetes/src/components/Pods/PodDrawer/ContainerCard.tsx +++ b/plugins/kubernetes/src/components/Pods/PodDrawer/ContainerCard.tsx @@ -83,12 +83,22 @@ const ContainerDatetime = ({ prefix, dateTime }: ContainerDatetimeProps) => { ); }; +/** + * Props for ContainerCard + * + * @public + */ export interface ContainerCardProps { podScope: PodScope; containerSpec?: IContainer; containerStatus: IContainerStatus; } +/** + * Shows details about a container within a pod + * + * @public + */ export const ContainerCard: React.FC = ({ podScope, containerSpec, @@ -162,7 +172,7 @@ export const ContainerCard: React.FC = ({ { +const PodCondition = ({ condition }: PodConditionProps) => { return ( <> {condition.status === 'False' && ( @@ -64,10 +64,20 @@ export const PodCondition = ({ condition }: PodConditionProps) => { ); }; -interface PendingPodContentProps { +/** + * Props for PendingPodContent + * + * @public + */ +export interface PendingPodContentProps { pod: Pod; } +/** + * Shows details about pod's conditions as it starts + * + * @public + */ export const PendingPodContent = ({ pod }: PendingPodContentProps) => { // TODO add PodHasNetwork when it's out of alpha // https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.test.tsx b/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.test.tsx index 64fd38c8d7..2b71976d8a 100644 --- a/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.test.tsx +++ b/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.test.tsx @@ -69,7 +69,7 @@ describe('PodDrawer', () => { container: 'some-container', errorType: 'some error type', rootCauseExplanation: 'some root cause', - possibleFixes: ['fix1', 'fix2'], + actions: ['fix1', 'fix2'], }, ], }, diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.tsx b/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.tsx index 5e49410dd4..8e616df14e 100644 --- a/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.tsx +++ b/plugins/kubernetes/src/components/Pods/PodDrawer/PodDrawer.tsx @@ -58,11 +58,22 @@ const useDrawerContentStyles = makeStyles((_theme: Theme) => function getContainerSpecByName(pod: Pod, containerName: string) { return pod.spec?.containers.find(c => c.name === containerName); } + +/** + * Props for PodDrawer + * + * @public + */ interface PodDrawerProps { open?: boolean; podAndErrors: PodAndErrors; } +/** + * A Drawer for Kubernetes Pods + * + * @public + */ export const PodDrawer = ({ podAndErrors, open }: PodDrawerProps) => { const classes = useDrawerContentStyles(); diff --git a/plugins/kubernetes/src/components/Pods/PodDrawer/index.ts b/plugins/kubernetes/src/components/Pods/PodDrawer/index.ts index 17d50ddfcd..92bb254c48 100644 --- a/plugins/kubernetes/src/components/Pods/PodDrawer/index.ts +++ b/plugins/kubernetes/src/components/Pods/PodDrawer/index.ts @@ -13,4 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { PodDrawer } from './PodDrawer'; +export * from './PodDrawer'; +export * from './ContainerCard'; +export * from './PendingPodContent'; diff --git a/plugins/kubernetes/src/components/Pods/PodLogs/PodLogs.tsx b/plugins/kubernetes/src/components/Pods/PodLogs/PodLogs.tsx index 5cff023772..de9341508e 100644 --- a/plugins/kubernetes/src/components/Pods/PodLogs/PodLogs.tsx +++ b/plugins/kubernetes/src/components/Pods/PodLogs/PodLogs.tsx @@ -15,20 +15,39 @@ */ import React from 'react'; -import { DismissableBanner, LogViewer } from '@backstage/core-components'; +import { + DismissableBanner, + EmptyState, + LogViewer, +} from '@backstage/core-components'; import { Paper } from '@material-ui/core'; import { Skeleton } from '@material-ui/lab'; import { ContainerScope } from './types'; import { usePodLogs } from './usePodLogs'; -interface PodLogsProps { - podScope: ContainerScope; +/** + * Props for PodLogs + * + * @public + */ +export interface PodLogsProps { + containerScope: ContainerScope; + previous?: boolean; } -export const PodLogs: React.FC = ({ podScope }: PodLogsProps) => { +/** + * Shows the logs for the given pod + * + * @public + */ +export const PodLogs: React.FC = ({ + containerScope, + previous, +}: PodLogsProps) => { const { value, error, loading } = usePodLogs({ - podScope: podScope, + containerScope, + previous, }); return ( @@ -45,10 +64,20 @@ export const PodLogs: React.FC = ({ podScope }: PodLogsProps) => { )} {loading && } - {!loading && value !== undefined && } + {!loading && + value !== undefined && + (value.text === '' ? ( + + ) : ( + + ))} ); diff --git a/plugins/kubernetes/src/components/Pods/PodLogs/PodLogsDialog.tsx b/plugins/kubernetes/src/components/Pods/PodLogs/PodLogsDialog.tsx index 05d980b26a..48fda2de2a 100644 --- a/plugins/kubernetes/src/components/Pods/PodLogs/PodLogsDialog.tsx +++ b/plugins/kubernetes/src/components/Pods/PodLogs/PodLogsDialog.tsx @@ -43,11 +43,21 @@ const useStyles = makeStyles((theme: Theme) => }), ); -interface PodLogsDialogProps { - podScope: ContainerScope; +/** + * Props for PodLogsDialog + * + * @public + */ +export interface PodLogsDialogProps { + containerScope: ContainerScope; } -export const PodLogsDialog = ({ podScope }: PodLogsDialogProps) => { +/** + * Shows the logs for the given pod in a Dialog + * + * @public + */ +export const PodLogsDialog = ({ containerScope }: PodLogsDialogProps) => { const classes = useStyles(); const [open, setOpen] = useState(false); @@ -62,8 +72,8 @@ export const PodLogsDialog = ({ podScope }: PodLogsDialogProps) => { <> - {podScope.podName} - {podScope.containerName} logs on cluster{' '} - {podScope.clusterName} + {containerScope.podName} - {containerScope.containerName} logs on + cluster {containerScope.clusterName} { - + {integrationKey && ( - + )} ); diff --git a/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.test.tsx b/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.test.tsx index c6874cc7f3..74cd5100fa 100644 --- a/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.test.tsx +++ b/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.test.tsx @@ -17,8 +17,6 @@ import React from 'react'; import { fireEvent, act } from '@testing-library/react'; import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils'; import { pagerDutyApiRef } from '../../api'; -import { Entity } from '@backstage/catalog-model'; -import { EntityProvider } from '@backstage/plugin-catalog-react'; import { TriggerDialog } from './TriggerDialog'; import { ApiProvider } from '@backstage/core-app-api'; @@ -49,26 +47,15 @@ describe('TriggerDialog', () => { ); it('open the dialog and trigger an alarm', async () => { - const entity: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'pagerduty-test', - annotations: { - 'pagerduty.com/integration-key': 'abc123', - }, - }, - }; - const { getByText, getByRole, getByTestId } = await renderInTestApp( - - {}} - onIncidentCreated={() => {}} - /> - + {}} + onIncidentCreated={() => {}} + /> , ); @@ -89,8 +76,7 @@ describe('TriggerDialog', () => { }); expect(mockTriggerAlarmFn).toHaveBeenCalled(); expect(mockTriggerAlarmFn).toHaveBeenCalledWith({ - integrationKey: - entity!.metadata!.annotations!['pagerduty.com/integration-key'], + integrationKey: 'abc123', source: window.location.toString(), description, userName: 'guest', diff --git a/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.tsx b/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.tsx index 4dc4f04699..a1e88b8fa6 100644 --- a/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.tsx +++ b/plugins/pagerduty/src/components/TriggerDialog/TriggerDialog.tsx @@ -28,7 +28,6 @@ import { import useAsyncFn from 'react-use/lib/useAsyncFn'; import { pagerDutyApiRef } from '../../api'; import { Alert } from '@material-ui/lab'; -import { usePagerdutyEntity } from '../../hooks'; import { useApi, alertApiRef, @@ -40,14 +39,17 @@ type Props = { showDialog: boolean; handleDialog: () => void; onIncidentCreated?: () => void; + name: string; + integrationKey: string; }; export const TriggerDialog = ({ showDialog, handleDialog, onIncidentCreated: onIncidentCreated, + name, + integrationKey, }: Props) => { - const { name, integrationKey } = usePagerdutyEntity(); const alertApi = useApi(alertApiRef); const identityApi = useApi(identityApiRef); const api = useApi(pagerDutyApiRef); diff --git a/plugins/pagerduty/src/components/index.ts b/plugins/pagerduty/src/components/index.ts index e7c1ff4e72..264d7195e9 100644 --- a/plugins/pagerduty/src/components/index.ts +++ b/plugins/pagerduty/src/components/index.ts @@ -23,12 +23,13 @@ export type { PagerDutyUser, } from './types'; -export type { PagerDutyCardProps } from './PagerDutyCard'; +export type { EntityPagerDutyCardProps } from './EntityPagerDutyCard'; +export type { HomePagePagerDutyCardProps } from './HomePagePagerDutyCard'; export { isPluginApplicableToEntity, isPluginApplicableToEntity as isPagerDutyAvailable, - PagerDutyCard, -} from './PagerDutyCard'; + EntityPagerDutyCard, +} from './EntityPagerDutyCard'; export { TriggerButton } from './TriggerButton'; diff --git a/plugins/pagerduty/src/deprecated.ts b/plugins/pagerduty/src/deprecated.ts new file mode 100644 index 0000000000..e9f60f6894 --- /dev/null +++ b/plugins/pagerduty/src/deprecated.ts @@ -0,0 +1,29 @@ +/* + * 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 { EntityPagerDutyCardProps, EntityPagerDutyCard } from './components'; + +/** + * @public + * @deprecated Please use EntityPagerDutyCard + */ +export const PagerDutyCard = EntityPagerDutyCard; + +/** + * @public + * @deprecated Please use EntityPagerDutyCardProps + */ +export type PagerDutyCardProps = EntityPagerDutyCardProps; diff --git a/plugins/pagerduty/src/index.ts b/plugins/pagerduty/src/index.ts index 2e0eddc9a8..c6f7aef89a 100644 --- a/plugins/pagerduty/src/index.ts +++ b/plugins/pagerduty/src/index.ts @@ -24,9 +24,12 @@ export { pagerDutyPlugin, pagerDutyPlugin as plugin, EntityPagerDutyCard, + HomePagePagerDutyCard, } from './plugin'; export * from './components'; + export * from './api'; +export * from './deprecated'; export type { PagerDutyEntity } from './types'; diff --git a/plugins/pagerduty/src/plugin.ts b/plugins/pagerduty/src/plugin.ts index 73e7e0b397..59cc5cd8cc 100644 --- a/plugins/pagerduty/src/plugin.ts +++ b/plugins/pagerduty/src/plugin.ts @@ -23,6 +23,8 @@ import { configApiRef, createComponentExtension, } from '@backstage/core-plugin-api'; +import { createCardExtension } from '@backstage/plugin-home-react'; +import { HomePagePagerDutyCardProps } from './components/HomePagePagerDutyCard/Content'; export const rootRouteRef = createRouteRef({ id: 'pagerduty', @@ -51,7 +53,38 @@ export const EntityPagerDutyCard = pagerDutyPlugin.provide( name: 'EntityPagerDutyCard', component: { lazy: () => - import('./components/PagerDutyCard').then(m => m.PagerDutyCard), + import('./components/EntityPagerDutyCard').then( + m => m.EntityPagerDutyCard, + ), + }, + }), +); + +/** @public */ +export const HomePagePagerDutyCard = pagerDutyPlugin.provide( + createCardExtension({ + name: 'HomePagePagerDutyCard', + title: 'PagerDuty Homepage Card', + components: () => import('./components/HomePagePagerDutyCard'), + settings: { + schema: { + title: 'PagerDuty', + type: 'object', + properties: { + integrationKey: { + title: 'PagerDuty integration key', + type: 'string', + }, + serviceId: { + title: 'PagerDuty service id', + type: 'string', + }, + name: { + title: 'PagerDuty service name', + type: 'string', + }, + }, + }, }, }), ); diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index 13b512abbc..5f1083ec82 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-periskop-backend +## 0.1.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/config@1.0.7 + ## 0.1.17-next.0 ### Patch Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index 56a27feff3..772eafdb84 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.17-next.0", + "version": "0.1.17-next.1", "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 b9d21cf576..9b68370f4b 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-periskop +## 0.1.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.17-next.0 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 52701c8ebb..421d9f9e33 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.17-next.0", + "version": "0.1.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 3087c6eb19..adda02bc2d 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-permission-backend +## 0.5.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + ## 0.5.21-next.0 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 196c9eac55..ef5cee7cd3 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.21-next.0", + "version": "0.5.21-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md index 016d0edb74..aa19745cb6 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-permission-common +## 0.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.7.5 ### Patch Changes diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index 87fcf4d0fd..c2d0a54942 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.5", + "version": "0.7.6-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 b44f41c96a..a9b6b80694 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-permission-node +## 0.7.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + ## 0.7.9-next.0 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 4614afb60f..0b42cf21d2 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.9-next.0", + "version": "0.7.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index b9aa3c94ed..f958e7c492 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-permission-react +## 0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + ## 0.4.12 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index 0b6efa1dc5..6cec30fad8 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.12", + "version": "0.4.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index 0b33f0c2d7..b2d0e1035e 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-playlist-backend +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-playlist-common@0.1.7-next.0 + ## 0.3.2-next.0 ### Patch Changes diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 316e74cb23..fa2dba4133 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.3.2-next.0", + "version": "0.3.2-next.1", "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 9b9be193f8..a50ff9dbe8 100644 --- a/plugins/playlist-common/CHANGELOG.md +++ b/plugins/playlist-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-playlist-common +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.6-next.0 + ## 0.1.6 ### Patch Changes diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json index 04105c59a0..42e6b1a2dc 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.6", + "version": "0.1.7-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 58e5d008f5..6229fbb7a7 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-playlist +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-permission-react@0.4.13-next.0 + - @backstage/plugin-playlist-common@0.1.7-next.0 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index b84ad18e83..651c34bb0c 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index bf1caa40d6..77995395b3 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-proxy-backend +## 0.2.40-next.1 + +### Patch Changes + +- 95987388f26b: Marked headers `Authorization` and `X-Api-Key` as secret in order to not show up in frontend configuration. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/config@1.0.7 + ## 0.2.40-next.0 ### Patch Changes diff --git a/plugins/proxy-backend/config.d.ts b/plugins/proxy-backend/config.d.ts index 59fc0dc5a6..410ff86a2e 100644 --- a/plugins/proxy-backend/config.d.ts +++ b/plugins/proxy-backend/config.d.ts @@ -31,7 +31,17 @@ export interface Config { /** * Object with extra headers to be added to target requests. */ - headers?: { [key: string]: string }; + headers?: Partial<{ + /** @visibility secret */ + Authorization: string; + /** @visibility secret */ + authorization: string; + /** @visibility secret */ + 'X-Api-Key': string; + /** @visibility secret */ + 'x-api-key': string; + [key: string]: string; + }>; /** * Changes the origin of the host header to the target URL. Default: true. */ diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 4be05976a9..25b1b3d147 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.40-next.0", + "version": "0.2.40-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/puppetdb/CHANGELOG.md b/plugins/puppetdb/CHANGELOG.md index 28b605932d..fc63f1e70c 100644 --- a/plugins/puppetdb/CHANGELOG.md +++ b/plugins/puppetdb/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-puppetdb +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/puppetdb/package.json b/plugins/puppetdb/package.json index 209a58f1e1..7797dd1178 100644 --- a/plugins/puppetdb/package.json +++ b/plugins/puppetdb/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-puppetdb", "description": "Backstage plugin to visualize resource information and Puppet facts from PuppetDB.", - "version": "0.1.2-next.0", + "version": "0.1.2-next.1", "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 77470eab1d..30240f7126 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-rollbar-backend +## 0.1.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/config@1.0.7 + ## 0.1.43-next.0 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index a7e7a7ffb4..c01dbc2d6d 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.43-next.0", + "version": "0.1.43-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md index bdf0d9c76a..5ad282842f 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-rollbar +## 0.4.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.4.19-next.0 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index 6caac9b670..ae129c7509 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.19-next.0", + "version": "0.4.19-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index 8c7aca74d9..6d2eaf69c1 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.1.3-next.1 + +### Patch Changes + +- c59a4b2b9e0a: Added support for Confluence Cloud to the `confluence:transform:markdown` action in addition to the existing Confluence Server support, view the [README](https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend-module-confluence-to-markdown) for more details +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.3-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/README.md b/plugins/scaffolder-backend-module-confluence-to-markdown/README.md index d9b235d6c1..7dd9bd96b1 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/README.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/README.md @@ -4,16 +4,18 @@ Welcome to the `confluence:transform:markdown` action for the `scaffolder-backen ## Getting started -You need to configure the action in your backend: +The following sections will help you getting started -## From your Backstage root directory +### Configure Action in Backend + +From your Backstage root directory run: ```bash # From your Backstage root directory yarn add --cwd packages/backend @backstage/plugin-scaffolder-backend-module-confluence-to-markdown ``` -Configure the action: +Then configure the action: (you can check the [docs](https://backstage.io/docs/features/software-templates/writing-custom-actions#registering-custom-actions) to see all options): ```typescript @@ -56,15 +58,62 @@ export default async function createPlugin( } ``` -You will also need an access token for authorization with `Read` permissions. You can create a Personal Access Token (PAT) in confluence and add the PAT to your `app-config.yaml` +### Configuration + +There is some configuration that needs to be setup to use this action, these are the base parameters: ```yaml confluence: - baseUrl: ${CONFLUENCE_BASE_URL} - token: ${CONFLUENCE_TOKEN} + baseUrl: 'https://confluence.example.com' + token: '${CONFLUENCE_TOKEN}' ``` -After that you can use the action in your template: +The sections below will go into more details about the Base URL and Auth Methods. + +#### Base URL + +The `baseUrl` for Confluence Cloud should include the product name which is `wiki` by default but can be something else if your Org has changed it. An example `baseUrl` for Confluence Cloud would look like this: `https://example.atlassian.net/wiki` + +If you are using a self-hosted Confluence instance this does not apply to you. Your `baseUrl` would look something like this: `https://confluence.example.com` + +#### Auth Methods + +The default authorization method is `bearer` but `basic` and `userpass` are also supported. Here's how you would configure each of these: + +For `bearer`: + +```yaml +confluence: + baseUrl: 'https://confluence.example.com' + auth: 'bearer' + token: '${CONFLUENCE_TOKEN}' +``` + +For `basic`: + +```yaml +confluence: + baseUrl: 'https://confluence.example.com' + auth: 'basic' + token: '${CONFLUENCE_TOKEN}' + email: 'example@company.org' +``` + +For `userpass` + +```yaml +confluence: + baseUrl: 'https://confluence.example.com' + auth: 'userpass' + username: 'your-username' + password: 'your-password' +``` + +**Note:** For `basic` and `bearer` authorization methods you will need an access token for authorization with `Read` permissions. You can create a Personal Access Token (PAT) in Confluence. The value used should be the raw token as it will be encoded for you by the action. + +### Template Usage + +Here's an example of how you can use the action in your template: ```yaml apiVersion: scaffolder.backstage.io/v1beta3 @@ -72,7 +121,7 @@ kind: Template metadata: name: confluence-to-markdown title: Confluence to Markdown - description: This template converts a single confluence document to Markdown for Techdocs and adds it to a given GitHub repo. + description: This template converts a single Confluence document to Markdown for Techdocs and adds it to a given GitHub repo. tags: - do-not-use - poc @@ -84,10 +133,9 @@ spec: properties: confluenceUrls: type: array - description: Urls for confluence doc to be converted to markdown. In format /display// + description: Urls for Confluence doc to be converted to markdown. In format /display// or /spaces//pages// for Confluence cloud items: type: string - default: confluence url ui:options: addable: true minItems: 1 @@ -110,9 +158,9 @@ spec: repoUrl: ?repo=${{ steps['create-docs'].output.repo }}&owner=${{ steps['create-docs'].output.owner }} branchName: confluence-to-markdown title: Confluence to Markdown - description: PR for converting confluence page to mkdocs + description: PR for converting Confluence page to mkdocs ``` Replace `` with your GitHub URL without `https://`. -You can find a list of all registered actions including their parameters at the /create/actions route in your Backstage application. +You can find a list of all registered actions including their parameters at the `/create/actions` route in your Backstage application. diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/config.d.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/config.d.ts new file mode 100644 index 0000000000..259d34cbf6 --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/config.d.ts @@ -0,0 +1,49 @@ +/* + * 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 { + /** Configuration options for the Confluence to Markdown action */ + confluence?: { + /** + * The base URL for accessing the Confluence API + */ + baseUrl: string; + /** + * Authentication method - basic, bearer, username/password + */ + auth: 'basic' | 'bearer' | 'userpass'; + /** + * Token used for the basic and bearer auth methods + * @visibility secret + */ + token?: string; + /** + * Email used with the token for the basic auth method + * @visibility secret + */ + email?: string; + /** + * Username used with the Username/Password auth method + * @visibility secret + */ + username?: string; + /** + * Password used with the Username/Password auth method + * @visibility secret + */ + password?: string; + }; +} diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/docs/sample-template.yaml b/plugins/scaffolder-backend-module-confluence-to-markdown/docs/sample-template.yaml new file mode 100644 index 0000000000..bd708b915c --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/docs/sample-template.yaml @@ -0,0 +1,43 @@ +apiVersion: scaffolder.backstage.io/v1beta3 +kind: Template +metadata: + name: confluence-to-markdown + title: Confluence to Markdown + description: This template converts a single Confluence document to Markdown for Techdocs and adds it to a given GitHub repo. + tags: + - do-not-use + - poc +spec: + owner: team-d + type: service + parameters: + - title: Confluence and Github Repo Information + properties: + confluenceUrls: + type: array + description: URLs for Confluence doc to be converted to markdown. In format /display// or /spaces//pages// for Confluence cloud + items: + type: string + ui:options: + addable: true + minItems: 1 + maxItems: 5 + repoUrl: + type: string + title: GitHub URL mkdocs.yaml link + description: The GitHub repo URL to your mkdocs.yaml file. Example + steps: + - id: create-docs + name: Get markdown file created and update markdown.yaml file + action: confluence:transform:markdown + input: + confluenceUrls: ${{ parameters.confluenceUrls }} + repoUrl: ${{ parameters.repoUrl }} + - id: publish + name: Publish PR to GitHub + action: publish:github:pull-request + input: + repoUrl: ?repo=${{ steps['create-docs'].output.repo }}&owner=${{ steps['create-docs'].output.owner }} + branchName: confluence-to-markdown + title: Confluence to Markdown + description: PR for converting Confluence page to mkdocs diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index aa8d0741c9..aedf663711 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.1.3-next.0", + "version": "0.1.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -44,6 +44,8 @@ "msw": "^1.0.0" }, "files": [ - "dist" - ] + "dist", + "config.d.ts" + ], + "configSchema": "config.d.ts" } 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 136bfc521e..6d6a3ac757 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 @@ -155,7 +155,7 @@ describe('confluence:transform:markdown', () => { expect(logger.info).toHaveBeenCalledWith( `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`, ); - expect(logger.info).toHaveBeenCalledTimes(5); + expect(logger.info).toHaveBeenCalledTimes(6); expect(createWriteStream).toHaveBeenCalledTimes(1); expect(readFile).toHaveBeenCalledTimes(1); expect(writeFile).toHaveBeenCalledTimes(1); @@ -202,7 +202,7 @@ describe('confluence:transform:markdown', () => { expect(logger.info).toHaveBeenCalledWith( `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`, ); - expect(logger.info).toHaveBeenCalledTimes(5); + expect(logger.info).toHaveBeenCalledTimes(6); expect(createWriteStream).not.toHaveBeenCalled(); expect(readFile).toHaveBeenCalledTimes(1); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts index 801f8abb28..9b666fd99e 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts @@ -28,6 +28,7 @@ import { fetchConfluence, getAndWriteAttachments, createConfluenceVariables, + getConfluenceConfig, } from './helpers'; /** @@ -57,7 +58,7 @@ export const createConfluenceToMarkdownAction = (options: { type: 'array', title: 'Confluence URL', description: - 'Paste your confluence url. Ensure it follows this format: https://{confluence+base+url}/display/{spacekey}/{page+title}', + 'Paste your Confluence url. Ensure it follows this format: https://{confluence+base+url}/display/{spacekey}/{page+title} or https://{confluence+base+url}/spaces/{spacekey}/pages/1234567/{page+title} for Confluence Cloud', items: { type: 'string', default: 'Confluence URL', @@ -73,6 +74,7 @@ export const createConfluenceToMarkdownAction = (options: { }, }, async handler(ctx) { + const confluenceConfig = getConfluenceConfig(config); const { confluenceUrls, repoUrl } = ctx.input; const parsedRepoUrl = parseGitUrl(repoUrl); const filePathToMkdocs = parsedRepoUrl.filepath.substring( @@ -96,11 +98,12 @@ export const createConfluenceToMarkdownAction = (options: { for (const url of confluenceUrls) { const { spacekey, title, titleWithSpaces } = - await createConfluenceVariables(url); + createConfluenceVariables(url); // This calls confluence to get the page html and page id + ctx.logger.info(`Fetching the Confluence content for ${url}`); const getConfluenceDoc = await fetchConfluence( `/rest/api/content?title=${title}&spaceKey=${spacekey}&expand=body.export_view`, - config, + confluenceConfig, ); if (getConfluenceDoc.results.length === 0) { throw new InputError( @@ -110,7 +113,7 @@ export const createConfluenceToMarkdownAction = (options: { // This gets attachments for the confluence page if they exist const getDocAttachments = await fetchConfluence( `/rest/api/content/${getConfluenceDoc.results[0].id}/child/attachment`, - config, + confluenceConfig, ); if (getDocAttachments.results.length) { @@ -120,7 +123,7 @@ export const createConfluenceToMarkdownAction = (options: { productArray = await getAndWriteAttachments( getDocAttachments, dirPath, - config, + confluenceConfig, filePathToMkdocs, ); } diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.test.ts new file mode 100644 index 0000000000..43d3b4b7dc --- /dev/null +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.test.ts @@ -0,0 +1,164 @@ +/* + * 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 { ConfigReader } from '@backstage/config'; +import { + createConfluenceVariables, + getAuthorizationHeaderValue, + getConfluenceConfig, +} from './helpers'; + +describe('createConfluenceVariables', () => { + it('should return values for Confluence Url', () => { + const url = 'https://confluence.example.com/display/SPACEKEY/Page+Title'; + const { spacekey, title, titleWithSpaces } = createConfluenceVariables(url); + + expect(spacekey).toEqual('SPACEKEY'); + expect(title).toEqual('Page+Title'); + expect(titleWithSpaces).toEqual('Page Title'); + }); + + it('should return values for Confluence Url with prefix', () => { + const url = + 'https://confluence.example.com/prefix/display/PREFIXSPACEKEY/Prefix+Page+Title'; + const { spacekey, title, titleWithSpaces } = createConfluenceVariables(url); + + expect(spacekey).toEqual('PREFIXSPACEKEY'); + expect(title).toEqual('Prefix+Page+Title'); + expect(titleWithSpaces).toEqual('Prefix Page Title'); + }); + + it('should return values for Confluence Cloud Url', () => { + const url = + 'https://example.atlassian.net/wiki/spaces/CLOUDSPACEKEY/pages/1234567/Cloud+Page+Title'; + + const { spacekey, title, titleWithSpaces } = createConfluenceVariables(url); + + expect(spacekey).toEqual('CLOUDSPACEKEY'); + expect(title).toEqual('Cloud+Page+Title'); + expect(titleWithSpaces).toEqual('Cloud Page Title'); + }); +}); + +describe('getConfluenceConfig', () => { + it('should return validate bearer Confluence config', async () => { + const config = new ConfigReader({ + confluence: { + baseUrl: 'https://example.atlassian.net', + auth: 'bearer', + token: 'fake_token', + }, + }); + + const validated = getConfluenceConfig(config); + + expect(validated).toEqual({ + baseUrl: 'https://example.atlassian.net', + auth: 'bearer', + token: 'fake_token', + email: undefined, + username: undefined, + password: undefined, + }); + }); + + it('should return validate basic Confluence config', async () => { + const config = new ConfigReader({ + confluence: { + baseUrl: 'https://example.atlassian.net', + auth: 'basic', + token: 'fake_token', + email: 'example@example.atlassian.net', + }, + }); + + const validated = getConfluenceConfig(config); + + expect(validated).toEqual({ + baseUrl: 'https://example.atlassian.net', + auth: 'basic', + token: 'fake_token', + email: 'example@example.atlassian.net', + username: undefined, + password: undefined, + }); + }); + + it('should return validate userpass Confluence config', async () => { + const config = new ConfigReader({ + confluence: { + baseUrl: 'https://example.atlassian.net', + auth: 'userpass', + username: 'fake_user', + password: 'fake_password', + }, + }); + + const validated = getConfluenceConfig(config); + + expect(validated).toEqual({ + baseUrl: 'https://example.atlassian.net', + auth: 'userpass', + token: undefined, + email: undefined, + username: 'fake_user', + password: 'fake_password', + }); + }); +}); + +describe('getAuthorizationHeaderValue', () => { + it('should return bearer auth header value', async () => { + const config = { + baseUrl: 'https://example.atlassian.net', + auth: 'bearer', + token: 'fake_token', + }; + + const authHeaderValue = getAuthorizationHeaderValue(config); + + expect(authHeaderValue).toEqual('Bearer fake_token'); + }); + + it('should return basic auth header value', async () => { + const config = { + baseUrl: 'https://example.atlassian.net', + auth: 'basic', + token: 'fake_token', + email: 'example@example.atlassian.net', + }; + + const authHeaderValue = getAuthorizationHeaderValue(config); + + // Note: this is fake and just the encoded result + expect(authHeaderValue).toEqual( + 'Basic ZXhhbXBsZUBleGFtcGxlLmF0bGFzc2lhbi5uZXQ6ZmFrZV90b2tlbg==', + ); + }); + + it('should return userpass auth header value', async () => { + const config = { + baseUrl: 'https://example.atlassian.net', + auth: 'userpass', + username: 'fake_user', + password: 'fake_password', + }; + + const authHeaderValue = getAuthorizationHeaderValue(config); + + // Note: this is fake and just the encoded result + expect(authHeaderValue).toEqual('Basic ZmFrZV91c2VyOmZha2VfcGFzc3dvcmQ='); + }); +}); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts index c741f6f6c0..b2156a1103 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/helpers.ts @@ -43,18 +43,88 @@ export interface Results { results: Result[]; } +export type ConfluenceConfig = { + baseUrl: string; + auth: string; + token?: string; + email?: string; + username?: string; + password?: string; +}; + +export const getConfluenceConfig = (config: Config) => { + const confluenceConfig: ConfluenceConfig = { + baseUrl: config.getString('confluence.baseUrl'), + auth: config.getOptionalString('confluence.auth') ?? 'bearer', + token: config.getOptionalString('confluence.token'), + email: config.getOptionalString('confluence.email'), + username: config.getOptionalString('confluence.username'), + password: config.getOptionalString('confluence.password'), + }; + + if ( + (confluenceConfig.auth === 'basic' || confluenceConfig.auth === 'bearer') && + !confluenceConfig.token + ) { + throw new Error( + `No token provided for the configured '${confluenceConfig.auth}' auth method`, + ); + } + + if (confluenceConfig.auth === 'basic' && !confluenceConfig.email) { + throw new Error( + `No email provided for the configured '${confluenceConfig.auth}' auth method`, + ); + } + + if ( + confluenceConfig.auth === 'userpass' && + (!confluenceConfig.username || !confluenceConfig.password) + ) { + throw new Error( + `No username/password provided for the configured '${confluenceConfig.auth}' auth method`, + ); + } + + return confluenceConfig; +}; + +export const getAuthorizationHeaderValue = (config: ConfluenceConfig) => { + switch (config.auth) { + case 'bearer': + return `Bearer ${config.token}`; + case 'basic': { + const buffer = Buffer.from(`${config.email}:${config.token}`, 'utf8'); + return `Basic ${buffer.toString('base64')}`; + } + case 'userpass': { + const buffer = Buffer.from( + `${config.username}:${config.password}`, + 'utf8', + ); + return `Basic ${buffer.toString('base64')}`; + } + default: + throw new Error(`Unknown auth method '${config.auth}' provided`); + } +}; + export const readFileAsString = async (fileDir: string) => { const content = await fs.readFile(fileDir, 'utf-8'); return content.toString(); }; -export const fetchConfluence = async (relativeUrl: string, config: Config) => { - const baseUrl = config.getString('confluence.baseUrl'); - const token = config.getString('confluence.token'); - const response: Response = await fetch(`${baseUrl}${relativeUrl}`, { +export const fetchConfluence = async ( + relativeUrl: string, + config: ConfluenceConfig, +) => { + const baseUrl = config.baseUrl; + const authHeaderValue = getAuthorizationHeaderValue(config); + const url = `${baseUrl}${relativeUrl}`; + const response: Response = await fetch(url, { method: 'GET', headers: { - Authorization: `Bearer ${token}`, + Authorization: authHeaderValue, }, }); if (!response.ok) { @@ -67,12 +137,12 @@ export const fetchConfluence = async (relativeUrl: string, config: Config) => { export const getAndWriteAttachments = async ( arr: Results, workspace: string, - config: Config, + config: ConfluenceConfig, mkdocsDir: string, ) => { const productArr: string[][] = []; - const baseUrl = config.getString('confluence.baseUrl'); - const token = config.getString('confluence.token'); + const baseUrl = config.baseUrl; + const authHeaderValue = getAuthorizationHeaderValue(config); await Promise.all( await arr.results.map(async (result: Result) => { const downloadLink = result._links.download; @@ -80,11 +150,11 @@ export const getAndWriteAttachments = async ( if (result.metadata.mediaType !== 'application/gliffy+json') { productArr.push([result.title.replace(/ /g, '%20'), downloadTitle]); } - - const res = await fetch(`${baseUrl}${downloadLink}`, { + const url = `${baseUrl}${downloadLink}`; + const res = await fetch(url, { method: 'GET', headers: { - Authorization: `Bearer ${token}`, + Authorization: authHeaderValue, }, }); if (!res.ok) { @@ -111,18 +181,31 @@ export const getAndWriteAttachments = async ( return productArr; }; -export const createConfluenceVariables = async (url: string) => { +export const createConfluenceVariables = (url: string) => { let spacekey: string | undefined = undefined; let title: string | undefined = undefined; let titleWithSpaces: string | undefined = ''; const params = new URL(url); if (params.pathname.split('/')[1] === 'display') { + // https://confluence.example.com/display/SPACEKEY/Page+Title spacekey = params.pathname.split('/')[2]; title = params.pathname.split('/')[3]; titleWithSpaces = title?.replace(/\+/g, ' '); return { spacekey, title, titleWithSpaces }; + } else if (params.pathname.split('/')[2] === 'display') { + // https://confluence.example.com/prefix/display/SPACEKEY/Page+Title + spacekey = params.pathname.split('/')[3]; + title = params.pathname.split('/')[4]; + titleWithSpaces = title?.replace(/\+/g, ' '); + return { spacekey, title, titleWithSpaces }; + } else if (params.pathname.split('/')[2] === 'spaces') { + // https://example.atlassian.net/wiki/spaces/SPACEKEY/pages/1234567/Page+Title + spacekey = params.pathname.split('/')[3]; + title = params.pathname.split('/')[6]; + titleWithSpaces = title?.replace(/\+/g, ' '); + return { spacekey, title, titleWithSpaces }; } throw new InputError( - 'The Url format for Confluence is incorrect. Acceptable format is `/display//`', + 'The Url format for Confluence is incorrect. Acceptable format is `/display//` or `/spaces//pages//` for Confluence cloud', ); }; diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 3fe37b59a8..d618b61a8f 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.22-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index ead732125d..9c80d03469 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.22-next.0", + "version": "0.2.22-next.1", "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 1176ab9e98..7bd07cbf2a 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.2.1-next.1 + +### Patch Changes + +- 50c4457119ec: Fixed publish configuration. +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/api-report.md b/plugins/scaffolder-backend-module-gitlab/api-report.md index f7cf6024ec..eccada5d51 100644 --- a/plugins/scaffolder-backend-module-gitlab/api-report.md +++ b/plugins/scaffolder-backend-module-gitlab/api-report.md @@ -26,8 +26,8 @@ export const createGitlabProjectAccessTokenAction: (options: { integrations: ScmIntegrationRegistry; }) => TemplateAction< { - projectId: string | number; repoUrl: string; + projectId: string | number; token?: string | undefined; name?: string | undefined; accessLevel?: number | undefined; @@ -44,8 +44,8 @@ export const createGitlabProjectDeployTokenAction: (options: { }) => TemplateAction< { name: string; - projectId: string | number; repoUrl: string; + projectId: string | number; token?: string | undefined; username?: string | undefined; scopes?: string[] | undefined; @@ -63,8 +63,8 @@ export const createGitlabProjectVariableAction: (options: { { key: string; value: string; - projectId: string | number; repoUrl: string; + projectId: string | number; variableType: string; token?: string | undefined; variableProtected?: boolean | undefined; diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index 2f5146601f..8481f09685 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,12 +1,12 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "publishConfig": { "access": "public", - "main": "dist/index.esm.js", + "main": "dist/index.cjs.js", "types": "dist/index.d.ts" }, "backstage": { diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabGroupEnsureExistsAction.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabGroupEnsureExistsAction.test.ts index 6fb119413f..3c67477ed5 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabGroupEnsureExistsAction.test.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabGroupEnsureExistsAction.test.ts @@ -137,4 +137,35 @@ describe('gitlab:group:ensureExists', () => { expect(mockContext.output).toHaveBeenCalledWith('groupId', 42); }); + + it('should not call API on dryRun', async () => { + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'gitlab.com', + token: 'tokenlols', + apiBaseUrl: 'https://api.gitlab.com', + }, + ], + }, + }); + const integrations = ScmIntegrations.fromConfig(config); + + const action = createGitlabGroupEnsureExistsAction({ integrations }); + + await action.handler({ + ...mockContext, + isDryRun: true, + input: { + repoUrl: 'gitlab.com', + path: ['foo', 'bar'], + }, + }); + + expect(mockGitlabClient.Groups.search).not.toHaveBeenCalled(); + expect(mockGitlabClient.Groups.create).not.toHaveBeenCalled(); + + expect(mockContext.output).toHaveBeenCalledWith('groupId', 42); + }); }); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabGroupEnsureExistsAction.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabGroupEnsureExistsAction.ts index f96d57e356..169cdb5b25 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabGroupEnsureExistsAction.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabGroupEnsureExistsAction.ts @@ -35,6 +35,7 @@ export const createGitlabGroupEnsureExistsAction = (options: { return createTemplateAction({ id: 'gitlab:group:ensureExists', description: 'Ensures a Gitlab group exists', + supportsDryRun: true, schema: { input: commonGitlabConfig.merge( z.object({ @@ -52,6 +53,11 @@ export const createGitlabGroupEnsureExistsAction = (options: { }), }, async handler(ctx) { + if (ctx.isDryRun) { + ctx.output('groupId', 42); + return; + } + const { path } = ctx.input; const { token, integrationConfig } = getToken(ctx.input, integrations); @@ -66,7 +72,7 @@ export const createGitlabGroupEnsureExistsAction = (options: { const fullPath = `${currentPath}/${pathElement}`; const result = (await api.Groups.search( fullPath, - )) as any as Array; // recast since the return type for search is wrong in the gitbeaker typings + )) as unknown as Array; // recast since the return type for search is wrong in the gitbeaker typings const subGroup = result.find( searchPathElem => searchPathElem.full_path === fullPath, ); diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index bb5f44b8fa..dd72cfcc0e 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.4.15-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/Rails.dockerfile b/plugins/scaffolder-backend-module-rails/Rails.dockerfile index 0774fdc975..921faa601d 100644 --- a/plugins/scaffolder-backend-module-rails/Rails.dockerfile +++ b/plugins/scaffolder-backend-module-rails/Rails.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.0 +FROM ruby:3.2 RUN apt-get update -qq && \ apt-get install -y nodejs postgresql-client git && \ diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index bb6df659cc..2a7222b548 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.15-next.0", + "version": "0.4.15-next.1", "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 65023baa20..0039e6756b 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index cd73436baf..ff6cdcd3cc 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.6-next.0", + "version": "0.1.6-next.1", "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 ad01501993..e7b43e864f 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.19-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index ddfc695dfc..736fc9c8da 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.19-next.0", + "version": "0.2.19-next.1", "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 557a424976..66723b1e7f 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-scaffolder-backend +## 1.15.0-next.1 + +### Minor Changes + +- df8411779da1: Add support for Repository Variables and Secrets to the `publish:github` and `github:repo:create` scaffolder actions. You will need to add `read/write` permissions to your GITHUB_TOKEN and/or Github Backstage App for Repository `Secrets` and `Variables` + + Upgrade octokit introduces some breaking changes. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-scaffolder-node@0.1.4-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 1.14.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 07dd5eaf1d..5e18ad15bf 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -308,6 +308,16 @@ export function createGithubRepoCreateAction(options: { hasIssues?: boolean | undefined; token?: string | undefined; topics?: string[] | undefined; + repoVariables?: + | { + [key: string]: string; + } + | undefined; + secrets?: + | { + [key: string]: string; + } + | undefined; requireCommitSigning?: boolean | undefined; }, JsonObject @@ -552,6 +562,16 @@ export function createPublishGithubAction(options: { hasIssues?: boolean | undefined; token?: string | undefined; topics?: string[] | undefined; + repoVariables?: + | { + [key: string]: string; + } + | undefined; + secrets?: + | { + [key: string]: string; + } + | undefined; requiredCommitSigning?: boolean | undefined; }, JsonObject diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index a5c3eaf937..d817afb7ad 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.14.1-next.0", + "version": "1.15.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -81,6 +81,7 @@ "isomorphic-git": "^1.23.0", "jsonschema": "^1.2.6", "knex": "^2.0.0", + "libsodium-wrappers": "^0.7.11", "lodash": "^4.17.21", "luxon": "^3.0.0", "morgan": "^1.10.0", @@ -104,6 +105,7 @@ "@types/command-exists": "^1.2.0", "@types/fs-extra": "^9.0.1", "@types/git-url-parse": "^9.0.0", + "@types/libsodium-wrappers": "^0.7.10", "@types/mock-fs": "^4.13.0", "@types/nunjucks": "^3.1.4", "@types/supertest": "^2.0.8", diff --git a/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile b/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile index b33c7cbe64..a16248239c 100644 --- a/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile +++ b/plugins/scaffolder-backend/scripts/Cookiecutter.dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.7 +FROM alpine:3.18 RUN apk add --update \ git \ diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts index 4f23839fca..b5b31d0773 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts @@ -30,6 +30,8 @@ import { PassThrough } from 'stream'; import { createGithubRepoCreateAction } from './githubRepoCreate'; import { entityRefToName } from '../helpers'; +const publicKey = '2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvvcCU='; + const mockOctokit = { rest: { users: { @@ -45,6 +47,11 @@ const mockOctokit = { addOrUpdateRepoPermissionsInOrg: jest.fn(), getByName: jest.fn(), }, + actions: { + createRepoVariable: jest.fn(), + createOrUpdateRepoSecret: jest.fn(), + getRepoPublicKey: jest.fn(), + }, }, }; jest.mock('octokit', () => ({ @@ -91,6 +98,12 @@ describe('github:repo:create', () => { githubCredentialsProvider, }); (entityRefToName as jest.Mock).mockImplementation((s: string) => s); + mockOctokit.rest.actions.getRepoPublicKey.mockResolvedValue({ + data: { + key: publicKey, + key_id: 'keyid', + }, + }); }); afterEach(jest.resetAllMocks); @@ -571,6 +584,69 @@ describe('github:repo:create', () => { }); }); + it('should add variables when provided', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoVariables: { + foo: 'bar', + }, + }, + }); + + expect(mockOctokit.rest.actions.createRepoVariable).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + name: 'foo', + value: 'bar', + }); + }); + + it('should add secrets when provided', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + secrets: { + foo: 'bar', + }, + }, + }); + + expect( + mockOctokit.rest.actions.createOrUpdateRepoSecret, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + secret_name: 'foo', + key_id: 'keyid', + encrypted_value: expect.any(String), + }); + }); + it('should call output with the remoteUrl', async () => { mockOctokit.rest.users.getByUsername.mockResolvedValue({ data: { type: 'User' }, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts index b5f779b8a7..0ec1c83910 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts @@ -90,6 +90,8 @@ export function createGithubRepoCreateAction(options: { hasIssues?: boolean; token?: string; topics?: string[]; + repoVariables?: { [key: string]: string }; + secrets?: { [key: string]: string }; requireCommitSigning?: boolean; }>({ id: 'github:repo:create', @@ -125,6 +127,8 @@ export function createGithubRepoCreateAction(options: { hasIssues: inputProps.hasIssues, token: inputProps.token, topics: inputProps.topics, + repoVariables: inputProps.repoVariables, + secrets: inputProps.secrets, requiredCommitSigning: inputProps.requiredCommitSigning, }, }, @@ -155,6 +159,8 @@ export function createGithubRepoCreateAction(options: { hasWiki = undefined, hasIssues = undefined, topics, + repoVariables, + secrets, token: providedToken, } = ctx.input; @@ -192,6 +198,8 @@ export function createGithubRepoCreateAction(options: { hasWiki, hasIssues, topics, + repoVariables, + secrets, ctx.logger, ); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts index b41beaede8..dc1b4eb91c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts @@ -30,6 +30,7 @@ import { } from '../helpers'; import { getRepoSourceDirectory, parseRepoUrl } from '../publish/util'; import { entityRefToName } from '../../builtin/helpers'; +import Sodium from 'libsodium-wrappers'; const DEFAULT_TIMEOUT_MS = 60_000; @@ -129,6 +130,8 @@ export async function createGithubRepoWithCollaboratorsAndTopics( hasWiki: boolean | undefined, hasIssues: boolean | undefined, topics: string[] | undefined, + repoVariables: { [key: string]: string } | undefined, + secrets: { [key: string]: string } | undefined, logger: Logger, ) { // eslint-disable-next-line testing-library/no-await-sync-query @@ -146,6 +149,7 @@ export async function createGithubRepoWithCollaboratorsAndTopics( name: repo, org: owner, private: repoVisibility === 'private', + // @ts-ignore visibility: repoVisibility, description: description, delete_branch_on_merge: deleteBranchOnMerge, @@ -254,6 +258,47 @@ export async function createGithubRepoWithCollaboratorsAndTopics( } } + for (const [key, value] of Object.entries(repoVariables ?? {})) { + await client.rest.actions.createRepoVariable({ + owner, + repo, + name: key, + value: value, + }); + } + + if (secrets) { + const publicKeyResponse = await client.rest.actions.getRepoPublicKey({ + owner, + repo, + }); + + await Sodium.ready; + const binaryKey = Sodium.from_base64( + publicKeyResponse.data.key, + Sodium.base64_variants.ORIGINAL, + ); + for (const [key, value] of Object.entries(secrets)) { + const binarySecret = Sodium.from_string(value); + const encryptedBinarySecret = Sodium.crypto_box_seal( + binarySecret, + binaryKey, + ); + const encryptedBase64Secret = Sodium.to_base64( + encryptedBinarySecret, + Sodium.base64_variants.ORIGINAL, + ); + + await client.rest.actions.createOrUpdateRepoSecret({ + owner, + repo, + secret_name: key, + encrypted_value: encryptedBase64Secret, + key_id: publicKeyResponse.data.key_id, + }); + } + } + return newRepo; } diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts index b1286953a6..96e1f3b6e1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts @@ -265,6 +265,18 @@ const requiredCommitSigning = { description: `Require commit signing so that you must sign commits on this branch.`, }; +const repoVariables = { + title: 'Repository Variables', + description: `Variables attached to the repository`, + type: 'object', +}; + +const secrets = { + title: 'Repository Secrets', + description: `Secrets attached to the repository`, + type: 'object', +}; + export { access }; export { allowMergeCommit }; export { allowRebaseMerge }; @@ -299,3 +311,5 @@ export { sourcePath }; export { token }; export { topics }; export { requiredCommitSigning }; +export { repoVariables }; +export { secrets }; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts index 50d40f1bd5..e15d085cbf 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts @@ -32,6 +32,8 @@ import { } from '../helpers'; import { createPublishGithubAction } from './github'; +const publicKey = '2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvvcCU='; + const initRepoAndPushMocked = initRepoAndPush as jest.Mock< Promise<{ commitHash: string }> >; @@ -51,6 +53,11 @@ const mockOctokit = { getByName: jest.fn(), addOrUpdateRepoPermissionsInOrg: jest.fn(), }, + actions: { + createRepoVariable: jest.fn(), + createOrUpdateRepoSecret: jest.fn(), + getRepoPublicKey: jest.fn(), + }, }, }; jest.mock('octokit', () => ({ @@ -107,6 +114,12 @@ describe('publish:github', () => { (entityRefToName as jest.Mock).mockImplementation( realFamiliarizeEntityName, ); + mockOctokit.rest.actions.getRepoPublicKey.mockResolvedValue({ + data: { + key: publicKey, + key_id: 'keyid', + }, + }); }); afterEach(jest.resetAllMocks); @@ -836,6 +849,69 @@ describe('publish:github', () => { }); }); + it('should add variables when provided', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoVariables: { + foo: 'bar', + }, + }, + }); + + expect(mockOctokit.rest.actions.createRepoVariable).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + name: 'foo', + value: 'bar', + }); + }); + + it('should add secrets when provided', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + secrets: { + foo: 'bar', + }, + }, + }); + + expect( + mockOctokit.rest.actions.createOrUpdateRepoSecret, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + secret_name: 'foo', + key_id: 'keyid', + encrypted_value: expect.any(String), + }); + }); + it('should call output with the remoteUrl and the repoContentsUrl', async () => { mockOctokit.rest.users.getByUsername.mockResolvedValue({ data: { type: 'User' }, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts index ef74c62083..9336c38b63 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts @@ -104,6 +104,8 @@ export function createPublishGithubAction(options: { hasIssues?: boolean | undefined; token?: string; topics?: string[]; + repoVariables?: { [key: string]: string }; + secrets?: { [key: string]: string }; requiredCommitSigning?: boolean; }>({ id: 'publish:github', @@ -148,6 +150,8 @@ export function createPublishGithubAction(options: { hasIssues: inputProps.hasIssues, token: inputProps.token, topics: inputProps.topics, + repoVariables: inputProps.repoVariables, + secrets: inputProps.secrets, requiredCommitSigning: inputProps.requiredCommitSigning, }, }, @@ -193,6 +197,8 @@ export function createPublishGithubAction(options: { hasWiki = undefined, hasIssues = undefined, topics, + repoVariables, + secrets, token: providedToken, requiredCommitSigning = false, } = ctx.input; @@ -231,6 +237,8 @@ export function createPublishGithubAction(options: { hasWiki, hasIssues, topics, + repoVariables, + secrets, ctx.logger, ); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts index a621d27d55..4045fd6958 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts @@ -57,6 +57,7 @@ export function createPublishGitlabAction(options: { repoUrl: { title: 'Repository Location', type: 'string', + description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`, }, repoVisibility: { title: 'Repository Visibility', diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts index 84a17024d1..3dfe0cff5c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts @@ -57,7 +57,7 @@ export const createPublishGitlabMergeRequestAction = (options: { repoUrl: { type: 'string', title: 'Repository Location', - description: `Accepts the format 'gitlab.com/group_name/project_name' where 'project_name' is the repository name and 'group_name' is a group or username`, + description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`, }, /** @deprecated projectID is passed as query parameters in the repoUrl */ projectid: { diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index b5bcabb64f..b694395956 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-common +## 1.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/types@1.0.2 + ## 1.3.0 ### Minor Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index 45b4986155..c3a4017253 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.3.0", + "version": "1.3.1-next.0", "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 5dafb204a0..3602a78714 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-node +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/types@1.0.2 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index bf8cd06b88..cdf1a52b40 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.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 4d94c23692..e59cbc29ae 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-scaffolder-react +## 1.5.0-next.1 + +### Minor Changes + +- 6b571405f806: `scaffolder/next`: Provide some default template components to `rjsf` to allow for standardization and markdown descriptions +- 4505dc3b4598: `scaffolder/next`: Don't render `TemplateGroups` when there's no results in with search query +- 6b571405f806: `scaffolder/next`: provide a `ScaffolderField` component which is meant to replace some of the `FormControl` components from MUI, making it easier to write `FieldExtensions`. + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + ## 1.4.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-react/alpha-api-report.md b/plugins/scaffolder-react/alpha-api-report.md index 319e3963f0..f988eb0831 100644 --- a/plugins/scaffolder-react/alpha-api-report.md +++ b/plugins/scaffolder-react/alpha-api-report.md @@ -6,7 +6,6 @@ /// import { ApiHolder } from '@backstage/core-plugin-api'; -import { ComponentType } from 'react'; import { CustomFieldExtensionSchema } from '@backstage/plugin-scaffolder-react'; import { Dispatch } from 'react'; import { Extension } from '@backstage/core-plugin-api'; @@ -20,8 +19,8 @@ import { JsonValue } from '@backstage/types'; import { LayoutOptions } from '@backstage/plugin-scaffolder-react'; import { PropsWithChildren } from 'react'; import { default as React_2 } from 'react'; +import { ReactElement } from 'react'; import { ReactNode } from 'react'; -import { RJSFSchema } from '@rjsf/utils'; import { ScaffolderStep } from '@backstage/plugin-scaffolder-react'; import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; import { SetStateAction } from 'react'; @@ -56,8 +55,8 @@ export const extractSchemaFromStep: (inputStep: JsonObject) => { schema: JsonObject; }; -// @alpha (undocumented) -export const Form: ComponentType>; +// @alpha +export const Form: (props: PropsWithChildren) => JSX.Element; // @alpha export type FormProps = Pick< @@ -132,6 +131,31 @@ export type ReviewStateProps = { formState: JsonObject; }; +// @alpha +export const ScaffolderField: ( + props: PropsWithChildren, +) => JSX.Element; + +// @alpha +export interface ScaffolderFieldProps { + // (undocumented) + disabled?: boolean; + // (undocumented) + displayLabel?: boolean; + // (undocumented) + errors?: ReactElement; + // (undocumented) + help?: ReactElement; + // (undocumented) + rawDescription?: string; + // (undocumented) + rawErrors?: string[]; + // (undocumented) + rawHelp?: string; + // (undocumented) + required?: boolean; +} + // @alpha (undocumented) export function ScaffolderPageContextMenu( props: ScaffolderPageContextMenuProps, @@ -206,7 +230,7 @@ export interface TemplateCardProps { export const TemplateCategoryPicker: () => JSX.Element | null; // @alpha -export const TemplateGroup: (props: TemplateGroupProps) => JSX.Element; +export const TemplateGroup: (props: TemplateGroupProps) => JSX.Element | null; // @alpha (undocumented) export type TemplateGroupFilter = { diff --git a/plugins/scaffolder-react/api-report.md b/plugins/scaffolder-react/api-report.md index 1761c88edf..82610a2fc3 100644 --- a/plugins/scaffolder-react/api-report.md +++ b/plugins/scaffolder-react/api-report.md @@ -207,7 +207,9 @@ export interface ScaffolderGetIntegrationsListResponse { } // @public -export const ScaffolderLayouts: React.ComponentType; +export const ScaffolderLayouts: React_2.ComponentType< + React_2.PropsWithChildren<{}> +>; // @public (undocumented) export type ScaffolderOutputLink = { diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 14c82170d7..d6c5432ee1 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.4.1-next.0", + "version": "1.5.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -60,11 +60,11 @@ "@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.6.0", + "@rjsf/core-v5": "npm:@rjsf/core@5.7.3", "@rjsf/material-ui": "^3.2.1", - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.6.0", - "@rjsf/utils": "5.6.0", - "@rjsf/validator-ajv8": "5.6.0", + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.7.3", + "@rjsf/utils": "5.7.3", + "@rjsf/validator-ajv8": "5.7.3", "@types/json-schema": "^7.0.9", "@types/react": "^16.13.1 || ^17.0.0", "classnames": "^2.2.6", diff --git a/plugins/scaffolder-react/src/layouts/createScaffolderLayout.ts b/plugins/scaffolder-react/src/layouts/createScaffolderLayout.ts index 328f366007..6b2ae1b33b 100644 --- a/plugins/scaffolder-react/src/layouts/createScaffolderLayout.ts +++ b/plugins/scaffolder-react/src/layouts/createScaffolderLayout.ts @@ -17,6 +17,7 @@ import { LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from './keys'; import { attachComponentData, Extension } from '@backstage/core-plugin-api'; import type { FormProps as SchemaFormProps } from '@rjsf/core-v5'; +import React from 'react'; /** * The field template from `@rjsf/core` which is a react component that gets passed `@rjsf/core` field related props. @@ -67,7 +68,8 @@ export function createScaffolderLayout( * * @public */ -export const ScaffolderLayouts: React.ComponentType = (): JSX.Element | null => - null; +export const ScaffolderLayouts: React.ComponentType< + React.PropsWithChildren<{}> +> = (): JSX.Element | null => null; attachComponentData(ScaffolderLayouts, LAYOUTS_WRAPPER_KEY, true); diff --git a/plugins/scaffolder-react/src/next/components/Form/DescriptionFieldTemplate.tsx b/plugins/scaffolder-react/src/next/components/Form/DescriptionFieldTemplate.tsx new file mode 100644 index 0000000000..8debfb3e08 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/Form/DescriptionFieldTemplate.tsx @@ -0,0 +1,71 @@ +/* + * 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 { MarkdownContent } from '@backstage/core-components'; +import { makeStyles, Typography } from '@material-ui/core'; +import { + DescriptionFieldProps, + FormContextType, + RJSFSchema, + StrictRJSFSchema, +} from '@rjsf/utils'; + +const useStyles = makeStyles({ + markdownDescription: { + fontSize: '0.75rem', + margin: 0, + marginTop: '5px', + color: 'rgba(0, 0, 0, 0.54)', + '& p:first-child': { + margin: 0, + }, + }, +}); + +/** The `DescriptionField` is the template to use to render the description of a field + * @alpha + * @param props - The `DescriptionFieldProps` for this component + */ +export const DescriptionFieldTemplate = < + T = any, + S extends StrictRJSFSchema = RJSFSchema, + F extends FormContextType = any, +>( + props: DescriptionFieldProps, +) => { + const { id, description } = props; + const classes = useStyles(); + + if (description) { + if (typeof description === 'string') { + return ( + + ); + } + + return ( + + {description} + + ); + } + + return null; +}; diff --git a/plugins/scaffolder-react/src/next/components/Form/FieldTemplate.tsx b/plugins/scaffolder-react/src/next/components/Form/FieldTemplate.tsx new file mode 100644 index 0000000000..79cac33054 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/Form/FieldTemplate.tsx @@ -0,0 +1,102 @@ +/* + * 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 { + FieldTemplateProps, + FormContextType, + RJSFSchema, + StrictRJSFSchema, + getTemplate, + getUiOptions, +} from '@rjsf/utils'; + +import { ScaffolderField } from '../ScaffolderField'; + +/** The `FieldTemplate` component is the template used by `SchemaField` to render any field. It renders the field + * content, (label, description, children, errors and help) inside of a `WrapIfAdditional` component. + * @alpha + * @param props - The `FieldTemplateProps` for this component + */ +export const FieldTemplate = < + T = any, + S extends StrictRJSFSchema = RJSFSchema, + F extends FormContextType = any, +>( + props: FieldTemplateProps, +) => { + const { + id, + children, + classNames, + style, + disabled, + displayLabel, + hidden, + label, + onDropPropertyClick, + onKeyChange, + readonly, + required, + rawErrors = [], + errors, + help, + rawDescription, + schema, + uiSchema, + registry, + } = props; + + const uiOptions = getUiOptions(uiSchema); + const WrapIfAdditionalTemplate = getTemplate< + 'WrapIfAdditionalTemplate', + T, + S, + F + >('WrapIfAdditionalTemplate', registry, uiOptions); + + if (hidden) { + return
{children}
; + } + return ( + + + {children} + + + ); +}; diff --git a/plugins/scaffolder-react/src/next/components/Form/Form.tsx b/plugins/scaffolder-react/src/next/components/Form/Form.tsx index 79bcaa8475..790c9027fe 100644 --- a/plugins/scaffolder-react/src/next/components/Form/Form.tsx +++ b/plugins/scaffolder-react/src/next/components/Form/Form.tsx @@ -14,10 +14,26 @@ * limitations under the License. */ -import { withTheme } from '@rjsf/core-v5'; +import { FormProps, withTheme } from '@rjsf/core-v5'; +import React from 'react'; +import { PropsWithChildren } from 'react'; +import { FieldTemplate } from './FieldTemplate'; +import { DescriptionFieldTemplate } from './DescriptionFieldTemplate'; // TODO(blam): We require here, as the types in this package depend on @rjsf/core explicitly // which is what we're using here as the default types, it needs to depend on @rjsf/core-v5 because // of the re-writing we're doing. Once we've migrated, we can import this the exact same as before. -/** @alpha */ -export const Form = withTheme(require('@rjsf/material-ui-v5').Theme); +const WrappedForm = withTheme(require('@rjsf/material-ui-v5').Theme); + +/** + * The Form component + * @alpha + */ +export const Form = (props: PropsWithChildren) => { + const templates = { + FieldTemplate, + DescriptionFieldTemplate, + ...props.templates, + }; + return ; +}; diff --git a/plugins/scaffolder-react/src/next/components/ScaffolderField/ScaffolderField.tsx b/plugins/scaffolder-react/src/next/components/ScaffolderField/ScaffolderField.tsx new file mode 100644 index 0000000000..da233eeba0 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/ScaffolderField/ScaffolderField.tsx @@ -0,0 +1,85 @@ +/* + * 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, { PropsWithChildren, ReactElement } from 'react'; + +import { MarkdownContent } from '@backstage/core-components'; +import { FormControl, makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles(theme => ({ + markdownDescription: { + fontSize: theme.typography.caption.fontSize, + margin: 0, + color: theme.palette.text.secondary, + '& :first-child': { + margin: 0, + marginTop: '3px', // to keep the standard browser padding + }, + }, +})); + +/** + * Props for the {@link ScaffolderField} component + * @alpha + */ +export interface ScaffolderFieldProps { + rawDescription?: string; + errors?: ReactElement; + rawErrors?: string[]; + help?: ReactElement; + rawHelp?: string; + required?: boolean; + disabled?: boolean; + displayLabel?: boolean; +} + +/** + * A component to wrap up a input field which helps with formatting and supporting markdown + * on the field types + * @alpha + */ +export const ScaffolderField = ( + props: PropsWithChildren, +) => { + const { + children, + displayLabel = true, + rawErrors = [], + errors, + help, + rawDescription, + required, + disabled, + } = props; + const classes = useStyles(); + return ( + + {children} + {displayLabel && rawDescription ? ( + + ) : null} + {errors} + {help} + + ); +}; diff --git a/plugins/scaffolder-react/src/next/components/ScaffolderField/index.ts b/plugins/scaffolder-react/src/next/components/ScaffolderField/index.ts new file mode 100644 index 0000000000..d3c2b4a25d --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/ScaffolderField/index.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 { ScaffolderField, type ScaffolderFieldProps } from './ScaffolderField'; diff --git a/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.test.tsx index 02756839c9..8d8ae718dc 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.test.tsx @@ -22,16 +22,6 @@ import { TemplateCard } from '../TemplateCard'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; describe('TemplateGroup', () => { - it('should return a message when no templates are passed in', async () => { - const { getByText } = render( - , - ); - - expect( - getByText(/No templates found that match your filter/), - ).toBeInTheDocument(); - }); - it('should render a card for each template with the template being passed as a prop', () => { const mockOnSelected = jest.fn(); const mockTemplates: { template: TemplateEntityV1beta3 }[] = [ @@ -130,14 +120,6 @@ describe('TemplateGroup', () => { ); } }); - - it('should render the title when no templates passed', () => { - const { getByText } = render( - , - ); - expect(getByText('Test')).toBeInTheDocument(); - }); - it('should render the title when there are templates in the list', () => { const mockTemplates: { template: TemplateEntityV1beta3 }[] = [ { @@ -163,10 +145,20 @@ describe('TemplateGroup', () => { it('should allow for passing through a user given title component', () => { const TitleComponent =

Im a custom header

; + const mockTemplates: { template: TemplateEntityV1beta3 }[] = [ + { + template: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + kind: 'Template', + metadata: { name: 'test' }, + spec: { parameters: [], steps: [], type: 'website' }, + }, + }, + ]; const { getByText } = render( , ); diff --git a/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.tsx index 8134ea256d..215ec2827e 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroup/TemplateGroup.tsx @@ -19,9 +19,7 @@ import { Content, ContentHeader, ItemCardGrid, - Link, } from '@backstage/core-components'; -import { Typography } from '@material-ui/core'; import { stringifyEntityRef } from '@backstage/catalog-model'; import { TemplateCardProps, TemplateCard } from '../TemplateCard'; import { IconComponent } from '@backstage/core-plugin-api'; @@ -61,18 +59,7 @@ export const TemplateGroup = (props: TemplateGroupProps) => { typeof title === 'string' ? : title; if (templates.length === 0) { - return ( - - {titleComponent} - - No templates found that match your filter. Learn more about{' '} - - adding templates - - . - - - ); + return null; } const Card = CardComponent || TemplateCard; diff --git a/plugins/scaffolder-react/src/next/components/index.ts b/plugins/scaffolder-react/src/next/components/index.ts index 5bfa5ccdc8..119f983a9f 100644 --- a/plugins/scaffolder-react/src/next/components/index.ts +++ b/plugins/scaffolder-react/src/next/components/index.ts @@ -25,3 +25,4 @@ export * from './TaskSteps'; export * from './TaskLogStream'; export * from './TemplateCategoryPicker'; export * from './ScaffolderPageContextMenu'; +export * from './ScaffolderField'; diff --git a/plugins/scaffolder-react/src/next/lib/schema.test.ts b/plugins/scaffolder-react/src/next/lib/schema.test.ts index 01e6cea3cc..4dc6cda603 100644 --- a/plugins/scaffolder-react/src/next/lib/schema.test.ts +++ b/plugins/scaffolder-react/src/next/lib/schema.test.ts @@ -411,4 +411,84 @@ describe('extractSchemaFromStep', () => { uiSchema: expectedUiSchema, }); }); + + it('transforms conditional schema', () => { + const inputSchema: JsonObject = { + type: 'object', + properties: { + flag: { + type: 'boolean', + }, + }, + if: { + properties: { + flag: { + const: true, + }, + }, + }, + then: { + properties: { + user: { + type: 'string', + 'ui:field': 'EntityPicker', + 'ui:options': { + catalogFilter: [{ kind: 'User' }], + }, + }, + }, + }, + else: { + properties: { + email: { + type: 'string', + }, + }, + }, + }; + const expectedSchema = { + type: 'object', + properties: { + flag: { + type: 'boolean', + }, + }, + if: { + properties: { + flag: { + const: true, + }, + }, + }, + then: { + properties: { + user: { + type: 'string', + }, + }, + }, + else: { + properties: { + email: { + type: 'string', + }, + }, + }, + }; + const expectedUiSchema = { + flag: {}, + user: { + 'ui:field': 'EntityPicker', + 'ui:options': { + catalogFilter: [{ kind: 'User' }], + }, + }, + email: {}, + }; + + expect(extractSchemaFromStep(inputSchema)).toEqual({ + schema: expectedSchema, + uiSchema: expectedUiSchema, + }); + }); }); diff --git a/plugins/scaffolder-react/src/next/lib/schema.ts b/plugins/scaffolder-react/src/next/lib/schema.ts index e8b819be4b..c606d715e7 100644 --- a/plugins/scaffolder-react/src/next/lib/schema.ts +++ b/plugins/scaffolder-react/src/next/lib/schema.ts @@ -25,7 +25,16 @@ function extractUiSchema(schema: JsonObject, uiSchema: JsonObject) { return; } - const { properties, items, anyOf, oneOf, allOf, dependencies } = schema; + const { + properties, + items, + anyOf, + oneOf, + allOf, + dependencies, + then, + else: _else, + } = schema; for (const propName in schema) { if (!schema.hasOwnProperty(propName)) { @@ -96,6 +105,14 @@ function extractUiSchema(schema: JsonObject, uiSchema: JsonObject) { extractUiSchema(schemaNode, uiSchema); } } + + if (isObject(then)) { + extractUiSchema(then, uiSchema); + } + + if (isObject(_else)) { + extractUiSchema(_else, uiSchema); + } } /** diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 05607eb83c..baac89b108 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-scaffolder +## 1.13.2-next.1 + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.5.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/plugin-scaffolder-common@1.3.1-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.13-next.0 + ## 1.13.2-next.0 ### Patch Changes diff --git a/plugins/scaffolder/alpha-api-report.md b/plugins/scaffolder/alpha-api-report.md index 6ceacdc008..de657c2138 100644 --- a/plugins/scaffolder/alpha-api-report.md +++ b/plugins/scaffolder/alpha-api-report.md @@ -27,7 +27,7 @@ export type NextRouterProps = { TemplateCardComponent?: React_2.ComponentType<{ template: TemplateEntityV1beta3; }>; - TaskPageComponent?: React_2.ComponentType<{}>; + TaskPageComponent?: React_2.ComponentType>; TemplateOutputsComponent?: React_2.ComponentType<{ output?: ScaffolderTaskOutput; }>; diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 3495522310..e50395be05 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -29,6 +29,7 @@ import { ListActionsResponse as ListActionsResponse_2 } from '@backstage/plugin- import { LogEvent as LogEvent_2 } from '@backstage/plugin-scaffolder-react'; import { Observable } from '@backstage/types'; import { PathParams } from '@backstage/core-plugin-api'; +import { PropsWithChildren } from 'react'; import { default as React_2 } from 'react'; import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; @@ -382,7 +383,7 @@ export type RouterProps = { template: TemplateEntityV1beta3; }> | undefined; - TaskPageComponent?: ComponentType<{}>; + TaskPageComponent?: ComponentType>; }; groups?: Array<{ title?: React_2.ReactNode; @@ -466,7 +467,9 @@ export type ScaffolderGetIntegrationsListResponse = ScaffolderGetIntegrationsListResponse_2; // @public @deprecated (undocumented) -export const ScaffolderLayouts: ComponentType<{}>; +export const ScaffolderLayouts: ComponentType<{ + children?: ReactNode; +}>; // @public @deprecated (undocumented) export type ScaffolderOutputlink = ScaffolderOutputLink; diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index ff1d2f104e..e32fac79cd 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.2-next.0", + "version": "1.13.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -69,8 +69,8 @@ "@react-hookz/web": "^20.0.0", "@rjsf/core": "^3.2.1", "@rjsf/material-ui": "^3.2.1", - "@rjsf/utils": "5.6.0", - "@rjsf/validator-ajv8": "5.6.0", + "@rjsf/utils": "5.7.3", + "@rjsf/validator-ajv8": "5.7.3", "@types/react": "^16.13.1 || ^17.0.0", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index 05d5cc9f0a..3ceda359cc 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { ComponentType, useEffect } from 'react'; +import React, { ComponentType, useEffect, PropsWithChildren } from 'react'; import { Navigate, Route, Routes, useOutlet } from 'react-router-dom'; import { Entity } from '@backstage/catalog-model'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; @@ -52,7 +52,7 @@ export type RouterProps = { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta3 }> | undefined; - TaskPageComponent?: ComponentType<{}>; + TaskPageComponent?: ComponentType>; }; groups?: Array<{ title?: React.ReactNode; diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx index 598616aaa3..cbc587a732 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx @@ -49,7 +49,7 @@ describe('', () => { getLocationByRef: jest.fn(), removeEntityByUid: jest.fn(), } as any; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { entities = [ diff --git a/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx b/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx index 00508593f5..1d843ea8a2 100644 --- a/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx @@ -55,7 +55,7 @@ describe('', () => { getLocationByRef: jest.fn(), removeEntityByUid: jest.fn(), } as any; - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; beforeEach(() => { entities = [ diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 9c50d0d979..2061cd1243 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -58,7 +58,7 @@ export type NextRouterProps = { TemplateCardComponent?: React.ComponentType<{ template: TemplateEntityV1beta3; }>; - TaskPageComponent?: React.ComponentType<{}>; + TaskPageComponent?: React.ComponentType>; TemplateOutputsComponent?: React.ComponentType<{ output?: ScaffolderTaskOutput; }>; diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index 6702760fb6..4b21a824f4 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend-module-catalog +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index ea6fe7ddba..6f2341e8a8 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.1.2-next.0", + "version": "0.1.2-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 bc0547ac6d..73c7b136e9 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/integration-aws-node@0.1.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.3.1-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index eb95891e3b..b533d6ed71 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.3.1-next.0", + "version": "1.3.1-next.1", "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 index 8011908809..4f31f7dcba 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-search-backend-module-explore +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index 34a03d26fc..50714230ac 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.1.2-next.0", + "version": "0.1.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -48,7 +48,8 @@ }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "msw": "^1.2.1" }, "files": [ "dist" diff --git a/plugins/search-backend-module-explore/src/collators/ToolDocumentCollatorFactory.test.ts b/plugins/search-backend-module-explore/src/collators/ToolDocumentCollatorFactory.test.ts new file mode 100644 index 0000000000..498a4d9fbf --- /dev/null +++ b/plugins/search-backend-module-explore/src/collators/ToolDocumentCollatorFactory.test.ts @@ -0,0 +1,121 @@ +/* + * 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 { + getVoidLogger, + PluginEndpointDiscovery, + TokenManager, +} from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { TestPipeline } from '@backstage/plugin-search-backend-node'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { Readable } from 'stream'; +import { ToolDocumentCollatorFactory } from './ToolDocumentCollatorFactory'; + +const logger = getVoidLogger(); + +const mockTools = { + tools: [ + { + title: 'tool1', + description: 'tool 1 description', + url: 'https://some-url.com', + image: 'https://some-url.com/image.png', + tags: ['one'], + }, + { + title: 'tool2', + description: 'tool 2 description', + url: 'https://some-url.com', + image: 'https://some-url.com/image.png', + tags: ['two'], + }, + { + title: 'tool3', + description: 'tool 3 description', + url: 'https://some-url.com', + image: 'https://some-url.com/image.png', + tags: ['three'], + }, + ], +}; + +describe('ToolDocumentCollatorFactory', () => { + const config = new ConfigReader({}); + const mockDiscoveryApi: jest.Mocked = { + getBaseUrl: jest.fn().mockResolvedValue('http://test-backend/api/explore'), + getExternalBaseUrl: jest.fn(), + }; + const mockTokenManager: jest.Mocked = { + getToken: jest.fn().mockResolvedValue({ token: '' }), + authenticate: jest.fn(), + }; + const options = { + discovery: mockDiscoveryApi, + logger, + tokenManager: mockTokenManager, + }; + + it('has expected type', () => { + const factory = ToolDocumentCollatorFactory.fromConfig(config, options); + expect(factory.type).toBe('tools'); + }); + + describe('getCollator', () => { + let factory: ToolDocumentCollatorFactory; + let collator: Readable; + + const worker = setupServer(); + setupRequestMockHandlers(worker); + + beforeEach(async () => { + factory = ToolDocumentCollatorFactory.fromConfig(config, options); + collator = await factory.getCollator(); + + worker.use( + rest.get('http://test-backend/api/explore/tools', (_, res, ctx) => + res(ctx.status(200), ctx.json(mockTools)), + ), + ); + }); + + it('returns a readable stream', async () => { + expect(collator).toBeInstanceOf(Readable); + }); + + it('runs against mock tools', async () => { + const pipeline = TestPipeline.fromCollator(collator); + const { documents } = await pipeline.execute(); + expect(mockDiscoveryApi.getBaseUrl).toHaveBeenCalledWith('explore'); + expect(documents).toHaveLength(mockTools.tools.length); + }); + + it('non-authenticated backend', async () => { + factory = ToolDocumentCollatorFactory.fromConfig(config, { + discovery: mockDiscoveryApi, + logger, + }); + collator = await factory.getCollator(); + + const pipeline = TestPipeline.fromCollator(collator); + const { documents } = await pipeline.execute(); + + expect(mockDiscoveryApi.getBaseUrl).toHaveBeenCalledWith('explore'); + expect(documents).toHaveLength(mockTools.tools.length); + }); + }); +}); diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 09f5c9a688..ebc714aa35 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.7-next.1 + +### Patch Changes + +- 3c09e8d3cb0c: Updated Postgres search query filter in DatabaseDocumentStore to support field value search in array. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.5.7-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 1f3d82f30c..c208376d46 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.7-next.0", + "version": "0.5.7-next.1", "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 2f99a02521..c5dbb74da1 100644 --- a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts +++ b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts @@ -453,6 +453,18 @@ describe('DatabaseDocumentStore', () => { text: 'Around the world', location: 'LOCATION-1', }, + { + title: 'Sed ut perspiciatis', + text: 'Hello World', + myField: ['that', 'not'], + location: 'LOCATION-1', + } as unknown as IndexableDocument, + { + title: 'Consectetur adipiscing', + text: 'Hello World', + myField: ['that', 'not', 'where'], + location: 'LOCATION-1', + } as unknown as IndexableDocument, ]); await store.completeInsert(tx, 'my-type'); }); @@ -488,6 +500,26 @@ describe('DatabaseDocumentStore', () => { rank: expect.any(Number), type: 'my-type', }, + { + document: { + location: 'LOCATION-1', + text: 'Hello World', + title: 'Sed ut perspiciatis', + myField: ['that', 'not'], + }, + rank: expect.any(Number), + type: 'my-type', + }, + { + document: { + location: 'LOCATION-1', + text: 'Hello World', + title: 'Consectetur adipiscing', + myField: ['that', 'not', 'where'], + }, + rank: expect.any(Number), + type: 'my-type', + }, ]); }, ); diff --git a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts index 023992a335..719cc1c755 100644 --- a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts +++ b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts @@ -171,9 +171,13 @@ export class DatabaseDocumentStore implements DatabaseStore { Object.keys(fields).forEach(key => { const value = fields[key]; const valueArray = Array.isArray(value) ? value : [value]; - const valueCompare = valueArray + const fieldValueCompare = valueArray .map(v => ({ [key]: v })) .map(v => JSON.stringify(v)); + const arrayValueCompare = valueArray + .map(v => ({ [key]: [v] })) + .map(v => JSON.stringify(v)); + const valueCompare = [...fieldValueCompare, ...arrayValueCompare]; query.whereRaw( `(${valueCompare.map(() => 'document @> ?').join(' OR ')})`, valueCompare, diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index 80b8580d04..f3cd4ee67a 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-techdocs-node@1.7.2-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index 274dfb601d..da3f28a2a5 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.1.2-next.0", + "version": "0.1.2-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 a58afbca32..855f3fd471 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-search-backend-node +## 1.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.2.2-next.0 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index b5ffe939c3..36b029edfb 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.2.2-next.0", + "version": "1.2.2-next.1", "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 08795a7eba..a6d6806159 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend +## 1.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.3.2-next.0 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index b927672b30..e416d22aa3 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.3.2-next.0", + "version": "1.3.2-next.1", "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 10d08f60ad..8233e22e40 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-common +## 1.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/types@1.0.2 + ## 1.2.3 ### Patch Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index bb1a61416f..3b35995edb 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.3", + "version": "1.2.4-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 88653b40e2..51693d8eab 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-search-react +## 1.6.1-next.1 + +### Patch Changes + +- 2f660eb573cc: Fix SearchBar styles & update StoryBook stories for custom styles for `notchedOutline` class. +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.6.1-next.0 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 510fe3c741..2d996f4819 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.6.1-next.0", + "version": "1.6.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-react/src/components/SearchAutocomplete/SearchAutocomplete.stories.tsx b/plugins/search-react/src/components/SearchAutocomplete/SearchAutocomplete.stories.tsx index a43b6b048e..0eaece87bb 100644 --- a/plugins/search-react/src/components/SearchAutocomplete/SearchAutocomplete.stories.tsx +++ b/plugins/search-react/src/components/SearchAutocomplete/SearchAutocomplete.stories.tsx @@ -14,9 +14,9 @@ * limitations under the License. */ -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; -import { Grid, makeStyles, Paper } from '@material-ui/core'; +import { Grid } from '@material-ui/core'; import LabelIcon from '@material-ui/icons/Label'; import { TestApiProvider } from '@backstage/test-utils'; @@ -31,7 +31,7 @@ export default { title: 'Plugins/Search/SearchAutocomplete', component: SearchAutocomplete, decorators: [ - (Story: ComponentType<{}>) => ( + (Story: ComponentType>) => ( @@ -45,51 +45,24 @@ export default { ], }; -const useStyles = makeStyles(theme => ({ - root: { - padding: theme.spacing(1), - }, -})); - export const Default = () => { - const classes = useStyles(); - return ( - - - - ); + return ; }; export const Outlined = () => { - const classes = useStyles(); - return ( - - - - ); + return ; }; export const Initialized = () => { - const classes = useStyles(); const options = ['hello-word', 'petstore', 'spotify']; - return ( - - - - ); + return ; }; export const LoadingOptions = () => { - const classes = useStyles(); - return ( - - - - ); + return ; }; export const RenderingCustomOptions = () => { - const classes = useStyles(); const options = [ { title: 'hello-world', @@ -106,17 +79,15 @@ export const RenderingCustomOptions = () => { ]; return ( - - ( - } - primaryText={option.title} - secondaryText={option.text} - /> - )} - /> - + ( + } + primaryText={option.title} + secondaryText={option.text} + /> + )} + /> ); }; diff --git a/plugins/search-react/src/components/SearchAutocomplete/SearchAutocomplete.tsx b/plugins/search-react/src/components/SearchAutocomplete/SearchAutocomplete.tsx index 8a5ae7a3ce..2a3cb6bee4 100644 --- a/plugins/search-react/src/components/SearchAutocomplete/SearchAutocomplete.tsx +++ b/plugins/search-react/src/components/SearchAutocomplete/SearchAutocomplete.tsx @@ -16,7 +16,7 @@ import React, { ChangeEvent, useCallback, useMemo } from 'react'; -import { CircularProgress } from '@material-ui/core'; +import { CircularProgress, makeStyles } from '@material-ui/core'; import { Autocomplete, AutocompleteProps, @@ -28,6 +28,13 @@ import { import { SearchContextProvider, useSearch } from '../../context'; import { SearchBar, SearchBarProps } from '../SearchBar'; +const useStyles = makeStyles(theme => ({ + loading: { + right: theme.spacing(1), + position: 'absolute', + }, +})); + /** * Props for {@link SearchAutocomplete}. * @@ -61,6 +68,18 @@ const withContext = ( ); }; +const SearchAutocompleteLoadingAdornment = () => { + const classes = useStyles(); + return ( + + ); +}; + /** * Recommended search autocomplete when you use the Search Provider or Search Context. * @@ -116,7 +135,7 @@ export const SearchAutocomplete = withContext( const renderInput = useCallback( ({ - InputProps: { ref, endAdornment }, + InputProps: { ref, className, endAdornment }, InputLabelProps, ...params }: AutocompleteRenderInputParams) => ( @@ -128,16 +147,9 @@ export const SearchAutocomplete = withContext( placeholder={inputPlaceholder} debounceTime={inputDebounceTime} endAdornment={ - loading ? ( - - ) : ( - endAdornment - ) + loading ? : endAdornment } + InputProps={{ className }} /> ), [loading, inputValue, inputPlaceholder, inputDebounceTime], diff --git a/plugins/search-react/src/components/SearchAutocomplete/SearchAutocompleteDefaultOption.stories.tsx b/plugins/search-react/src/components/SearchAutocomplete/SearchAutocompleteDefaultOption.stories.tsx index 40a3c5cdca..f671546efa 100644 --- a/plugins/search-react/src/components/SearchAutocomplete/SearchAutocompleteDefaultOption.stories.tsx +++ b/plugins/search-react/src/components/SearchAutocomplete/SearchAutocompleteDefaultOption.stories.tsx @@ -30,7 +30,7 @@ export default { title: 'Plugins/Search/SearchAutocompleteDefaultOption', component: SearchAutocompleteDefaultOption, decorators: [ - (Story: ComponentType<{}>) => ( + (Story: ComponentType>) => ( diff --git a/plugins/search-react/src/components/SearchBar/SearchBar.stories.tsx b/plugins/search-react/src/components/SearchBar/SearchBar.stories.tsx index 7e97d790a7..f342eed211 100644 --- a/plugins/search-react/src/components/SearchBar/SearchBar.stories.tsx +++ b/plugins/search-react/src/components/SearchBar/SearchBar.stories.tsx @@ -14,8 +14,8 @@ * limitations under the License. */ -import React, { ComponentType } from 'react'; -import { Grid, makeStyles, Paper } from '@material-ui/core'; +import React, { ComponentType, PropsWithChildren } from 'react'; +import { Grid, makeStyles } from '@material-ui/core'; import { TestApiProvider } from '@backstage/test-utils'; @@ -28,7 +28,7 @@ export default { title: 'Plugins/Search/SearchBar', component: SearchBar, decorators: [ - (Story: ComponentType<{}>) => ( + (Story: ComponentType>) => ( @@ -43,67 +43,51 @@ export default { }; export const Default = () => { - return ( - - - - ); + return ; }; export const CustomPlaceholder = () => { - return ( - - - - ); + return ; }; export const CustomLabel = () => { - return ( - - - - ); + return ; }; export const Focused = () => { return ( - - {/* decision up to adopter, read https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-autofocus.md#no-autofocus */} - {/* eslint-disable-next-line jsx-a11y/no-autofocus */} - - + // decision up to adopter, read https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-autofocus.md#no-autofocus + // eslint-disable-next-line jsx-a11y/no-autofocus + ); }; export const WithoutClearButton = () => { - return ( - - - - ); + return ; }; -const useStyles = makeStyles({ - search: { - display: 'flex', - justifyContent: 'space-between', +const useStyles = makeStyles(theme => ({ + searchBarRoot: { padding: '8px 16px', + background: theme.palette.background.paper, + boxShadow: theme.shadows[1], borderRadius: '50px', - margin: 'auto', }, - notchedOutline: { + searchBarOutline: { borderStyle: 'none', }, -}); +})); export const CustomStyles = () => { const classes = useStyles(); return ( - - - + ); }; diff --git a/plugins/search-react/src/components/SearchFilter/SearchFilter.stories.tsx b/plugins/search-react/src/components/SearchFilter/SearchFilter.stories.tsx index 2c8a629f01..505c1e13c3 100644 --- a/plugins/search-react/src/components/SearchFilter/SearchFilter.stories.tsx +++ b/plugins/search-react/src/components/SearchFilter/SearchFilter.stories.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { Grid, Paper } from '@material-ui/core'; import { TestApiProvider } from '@backstage/test-utils'; @@ -27,7 +27,7 @@ export default { title: 'Plugins/Search/SearchFilter', component: SearchFilter, decorators: [ - (Story: ComponentType<{}>) => ( + (Story: ComponentType>) => ( diff --git a/plugins/search-react/src/components/SearchPagination/SearchPagination.stories.tsx b/plugins/search-react/src/components/SearchPagination/SearchPagination.stories.tsx index 4e72c0fa25..dfb4e7ea91 100644 --- a/plugins/search-react/src/components/SearchPagination/SearchPagination.stories.tsx +++ b/plugins/search-react/src/components/SearchPagination/SearchPagination.stories.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { Grid } from '@material-ui/core'; import { TestApiProvider } from '@backstage/test-utils'; @@ -28,7 +28,7 @@ export default { title: 'Plugins/Search/SearchPagination', component: SearchPagination, decorators: [ - (Story: ComponentType<{}>) => ( + (Story: ComponentType>) => ( diff --git a/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx b/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx index f3086fc40a..a64d053dae 100644 --- a/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx +++ b/plugins/search-react/src/components/SearchResult/SearchResult.stories.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { List, ListItem } from '@material-ui/core'; import DefaultIcon from '@material-ui/icons/InsertDriveFile'; @@ -70,7 +70,7 @@ export default { title: 'Plugins/Search/SearchResult', component: SearchResult, decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp( diff --git a/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.stories.tsx b/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.stories.tsx index 40f7d30ff4..2f497d4568 100644 --- a/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.stories.tsx +++ b/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.stories.tsx @@ -14,7 +14,12 @@ * limitations under the License. */ -import React, { ComponentType, useCallback, useState } from 'react'; +import React, { + ComponentType, + useCallback, + useState, + PropsWithChildren, +} from 'react'; import { Grid, @@ -72,7 +77,7 @@ export default { title: 'Plugins/Search/SearchResultGroup', component: SearchResultGroup, decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp( diff --git a/plugins/search-react/src/components/SearchResultList/SearchResultList.stories.tsx b/plugins/search-react/src/components/SearchResultList/SearchResultList.stories.tsx index 4369b6636e..d822d0f52d 100644 --- a/plugins/search-react/src/components/SearchResultList/SearchResultList.stories.tsx +++ b/plugins/search-react/src/components/SearchResultList/SearchResultList.stories.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { ComponentType, useState } from 'react'; +import React, { ComponentType, useState, PropsWithChildren } from 'react'; import { Grid, ListItem, ListItemIcon, ListItemText } from '@material-ui/core'; @@ -59,7 +59,7 @@ export default { title: 'Plugins/Search/SearchResultList', component: SearchResultList, decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp( diff --git a/plugins/search-react/src/components/SearchResultPager/SearchResultPager.test.tsx b/plugins/search-react/src/components/SearchResultPager/SearchResultPager.test.tsx index 2508604ca9..2a22689285 100644 --- a/plugins/search-react/src/components/SearchResultPager/SearchResultPager.test.tsx +++ b/plugins/search-react/src/components/SearchResultPager/SearchResultPager.test.tsx @@ -34,7 +34,7 @@ describe('SearchResultPager', () => { it('renders pager buttons', async () => { const fetchNextPage = jest.fn(); const fetchPreviousPage = jest.fn(); - (useSearch as jest.Mock).mockReturnValueOnce({ + (useSearch as jest.Mock).mockReturnValue({ result: { loading: false, value: [] }, fetchNextPage, fetchPreviousPage, diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 5127ca04eb..a44ba5ad53 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-search +## 1.3.1-next.1 + +### Patch Changes + +- 2f660eb573cc: Fix SearchBar styles & update StoryBook stories for custom styles for `notchedOutline` class. +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.3.1-next.0 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 0a9b455ef9..0591593371 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.3.1-next.0", + "version": "1.3.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search/src/components/HomePageComponent/HomePageSearchBar.stories.tsx b/plugins/search/src/components/HomePageComponent/HomePageSearchBar.stories.tsx index 4c20ddec39..c1b1f0df87 100644 --- a/plugins/search/src/components/HomePageComponent/HomePageSearchBar.stories.tsx +++ b/plugins/search/src/components/HomePageComponent/HomePageSearchBar.stories.tsx @@ -18,12 +18,12 @@ import { rootRouteRef, HomePageSearchBar } from '../../plugin'; import { searchApiRef } from '@backstage/plugin-search-react'; import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { Grid, makeStyles } from '@material-ui/core'; -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; export default { title: 'Plugins/Home/Components/SearchBar', decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp( <> ({ borderRadius: '50px', margin: 'auto', }, + searchBarOutline: { + borderStyle: 'none', + }, })); export const CustomStyles = () => { @@ -71,6 +74,7 @@ export const CustomStyles = () => { diff --git a/plugins/search/src/components/HomePageComponent/HomePageSearchBar.tsx b/plugins/search/src/components/HomePageComponent/HomePageSearchBar.tsx index 4246f76ed0..b829bf8ac2 100644 --- a/plugins/search/src/components/HomePageComponent/HomePageSearchBar.tsx +++ b/plugins/search/src/components/HomePageComponent/HomePageSearchBar.tsx @@ -23,10 +23,12 @@ import { import { useNavigateToQuery } from '../util'; const useStyles = makeStyles({ - root: { + searchBarRoot: { + fontSize: '1.5em', + }, + searchBarOutline: { border: '1px solid #555', borderRadius: '6px', - fontSize: '1.5em', }, }); @@ -60,10 +62,17 @@ export const HomePageSearchBar = (props: HomePageSearchBarProps) => { return ( ); diff --git a/plugins/search/src/components/SearchModal/SearchModal.stories.tsx b/plugins/search/src/components/SearchModal/SearchModal.stories.tsx index eac01cceb8..525eadc9df 100644 --- a/plugins/search/src/components/SearchModal/SearchModal.stories.tsx +++ b/plugins/search/src/components/SearchModal/SearchModal.stories.tsx @@ -13,32 +13,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import { wrapInTestApp } from '@backstage/test-utils'; import { + DefaultResultListItem, + MockSearchApi, + searchApiRef, + SearchBar, + SearchContextProvider, + SearchResult, + SearchResultPager, +} from '@backstage/plugin-search-react'; +import { TestApiProvider, wrapInTestApp } from '@backstage/test-utils'; +import { + Box, Button, DialogActions, DialogContent, DialogTitle, Grid, + IconButton, List, - Paper, } from '@material-ui/core'; import { makeStyles } from '@material-ui/core/styles'; -import React, { ComponentType } from 'react'; +import CloseIcon from '@material-ui/icons/Close'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { rootRouteRef } from '../../plugin'; -import { - SearchBar, - DefaultResultListItem, - searchApiRef, - MockSearchApi, - SearchContextProvider, - SearchResult, - SearchResultPager, -} from '@backstage/plugin-search-react'; -import { TestApiProvider } from '@backstage/test-utils'; -import { SearchModal } from './SearchModal'; import { SearchType } from '../SearchType'; +import { SearchModal } from './SearchModal'; import { useSearchModal } from './useSearchModal'; const mockResults = { @@ -74,7 +74,7 @@ export default { title: 'Plugins/Search/SearchModal', component: SearchModal, decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp( { }; const useStyles = makeStyles(theme => ({ - container: { - borderRadius: 30, + titleContainer: { display: 'flex', - height: '2.4em', + alignItems: 'center', + gap: theme.spacing(1), }, input: { flex: 1, @@ -127,9 +127,13 @@ export const CustomModal = () => { {() => ( <> - + - + + + + + diff --git a/plugins/search/src/components/SearchType/SearchType.stories.tsx b/plugins/search/src/components/SearchType/SearchType.stories.tsx index 415eee19a6..250eab051d 100644 --- a/plugins/search/src/components/SearchType/SearchType.stories.tsx +++ b/plugins/search/src/components/SearchType/SearchType.stories.tsx @@ -18,7 +18,7 @@ import { Grid, Paper } from '@material-ui/core'; import CatalogIcon from '@material-ui/icons/MenuBook'; import DocsIcon from '@material-ui/icons/Description'; import UsersGroupsIcon from '@material-ui/icons/Person'; -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { SearchType } from './SearchType'; import { TestApiProvider } from '@backstage/test-utils'; import { @@ -31,7 +31,7 @@ export default { title: 'Plugins/Search/SearchType', component: SearchType, decorators: [ - (Story: ComponentType<{}>) => ( + (Story: ComponentType>) => ( diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index af5bbbefe5..811c21bd90 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-sentry +## 0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.5.4-next.0 ### Patch Changes diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index 878464bd28..e4645f4694 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.4-next.0", + "version": "0.5.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index abc1db6df4..dc9950d9fb 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-shortcuts +## 0.3.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + ## 0.3.11-next.0 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index 57b4e87510..857e92c13f 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.11-next.0", + "version": "0.3.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index 11741621a3..0945ae9231 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-sonarqube-backend +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + ## 0.1.11-next.0 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index 3b9c20c507..c9d7311f8c 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.11-next.0", + "version": "0.1.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md index 48d2d257d4..4694a42540 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-sonarqube-react +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + ## 0.1.5 ### Patch Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index 7ce194b778..897a24d628 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.5", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index 50ec3d3292..5069a4709f 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-sonarqube +## 0.6.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-sonarqube-react@0.1.6-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.6.8-next.0 ### Patch Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 9240ccdb79..ad050d6336 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.6.8-next.0", + "version": "0.6.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index ebba1db039..f98e3718a6 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-splunk-on-call +## 0.4.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.4.8-next.0 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 6d52ed6b04..f728472552 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.8-next.0", + "version": "0.4.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index 08c9ad9f27..9372e57d38 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-stack-overflow-backend +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.2.2-next.0 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index 12a70b9451..66ee75bb6f 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.2.2-next.0", + "version": "0.2.2-next.1", "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 4cb87f8d32..0fcee39cc3 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-stack-overflow +## 0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-home-react@0.1.0-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 0.1.16-next.0 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 06391f42f6..ffb5573b39 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.16-next.0", + "version": "0.1.16-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx index aed1ed25aa..9f0fd75341 100644 --- a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx +++ b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx @@ -19,7 +19,7 @@ import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { configApiRef } from '@backstage/core-plugin-api'; import { ConfigReader } from '@backstage/config'; import { Grid } from '@material-ui/core'; -import React, { ComponentType } from 'react'; +import React, { ComponentType, PropsWithChildren } from 'react'; import { StackOverflowIcon } from '../../icons'; import { stackOverflowApiRef } from '../../api'; @@ -46,7 +46,7 @@ export default { title: 'Plugins/Home/Components/StackOverflow', component: HomePageStackOverflowQuestions, decorators: [ - (Story: ComponentType<{}>) => + (Story: ComponentType>) => wrapInTestApp( <> ) => wrapInTestApp()], + decorators: [ + (Story: ComponentType>) => wrapInTestApp(), + ], }; export const Default = () => { diff --git a/plugins/stackstorm/CHANGELOG.md b/plugins/stackstorm/CHANGELOG.md index 1ecb359ca3..1c587b108b 100644 --- a/plugins/stackstorm/CHANGELOG.md +++ b/plugins/stackstorm/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-stackstorm +## 0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.3-next.0 ### Patch Changes diff --git a/plugins/stackstorm/package.json b/plugins/stackstorm/package.json index 12fb705557..4bdd3d000d 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.3-next.0", + "version": "0.1.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 96a029386c..9050ebe828 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-tech-insights-node@0.4.4-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-tech-insights-common@0.2.10 + ## 0.1.30-next.0 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index 77a86fe4b9..af02a77c79 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.30-next.0", + "version": "0.1.30-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index 801bc4b03c..6f3d58c198 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-tech-insights-backend +## 0.5.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-tech-insights-node@0.4.4-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + ## 0.5.12-next.0 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 247fa55853..f054a415fc 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.12-next.0", + "version": "0.5.12-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index 5c9c24d5c7..947ca421f1 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-tech-insights-node +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + ## 0.4.4-next.0 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index e514fc3449..599f83adb8 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.4-next.0", + "version": "0.4.4-next.1", "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 3e15025359..6f9a0de8b1 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-tech-insights +## 0.3.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + ## 0.3.11-next.0 ### Patch Changes diff --git a/plugins/tech-insights/dev/index.tsx b/plugins/tech-insights/dev/index.tsx index 46337cf5fe..c5deda2ea5 100644 --- a/plugins/tech-insights/dev/index.tsx +++ b/plugins/tech-insights/dev/index.tsx @@ -18,12 +18,45 @@ import { createDevApp } from '@backstage/dev-utils'; import { techInsightsPlugin, EntityTechInsightsScorecardContent, -} from '../src/plugin'; + techInsightsApiRef, + TechInsightsApi, + Check, +} from '../src'; +import { CompoundEntityRef, Entity } from '@backstage/catalog-model'; +import { EntityProvider } from '@backstage/plugin-catalog-react'; +import { checkResultRenderers, runChecksResponse } from './mocks'; + +const entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'random-name', + }, +} as Entity; createDevApp() .registerPlugin(techInsightsPlugin) + .registerApi({ + api: techInsightsApiRef, + deps: {}, + factory: () => + ({ + getCheckResultRenderers: (_: string[]) => checkResultRenderers, + getAllChecks: async () => [], + runChecks: async (_: CompoundEntityRef, __?: string[]) => + runChecksResponse, + runBulkChecks: async (_: CompoundEntityRef[], __?: Check[]) => + '' as any, + getFacts: async (_: CompoundEntityRef, __: string[]) => '' as any, + getFactSchemas: async () => [], + } as TechInsightsApi), + }) .addPage({ - element: , + element: ( + + + + ), title: 'Root Page', path: '/tech-insight-scorecard', }) diff --git a/plugins/tech-insights/dev/mocks.tsx b/plugins/tech-insights/dev/mocks.tsx new file mode 100644 index 0000000000..eec9b66054 --- /dev/null +++ b/plugins/tech-insights/dev/mocks.tsx @@ -0,0 +1,46 @@ +/* + * 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 { CheckResult } from '@backstage/plugin-tech-insights-common'; +import { BooleanCheck, CheckResultRenderer } from '../src'; + +export const runChecksResponse = [ + { + facts: { + 'fact-id': { + id: '1', + type: 'boolean', + description: 'fact description', + value: true, + }, + }, + check: { + id: 'fact-id', + type: 'boolean', + name: 'The check name', + description: `The check description \nusing markdown **bold** and a [link](https://backstage.io)`, + factIds: ['1'], + }, + result: true, + } as CheckResult, +]; + +export const checkResultRenderers = [ + { + type: 'boolean', + component: (check: CheckResult) => , + } as CheckResultRenderer, +]; diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 8c0bb9ed5f..eff16118d5 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.11-next.0", + "version": "0.3.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/src/components/ScorecardsList/ScorecardsList.tsx b/plugins/tech-insights/src/components/ScorecardsList/ScorecardsList.tsx index 9973abef71..e8e57b0afe 100644 --- a/plugins/tech-insights/src/components/ScorecardsList/ScorecardsList.tsx +++ b/plugins/tech-insights/src/components/ScorecardsList/ScorecardsList.tsx @@ -17,10 +17,11 @@ import React from 'react'; import { useApi } from '@backstage/core-plugin-api'; import { makeStyles, List, ListItem, ListItemText } from '@material-ui/core'; -import { techInsightsApiRef } from '../../api/TechInsightsApi'; +import { techInsightsApiRef } from '../../api'; import { CheckResult } from '@backstage/plugin-tech-insights-common'; import { BackstageTheme } from '@backstage/theme'; import { Alert } from '@material-ui/lab'; +import { MarkdownContent } from '@backstage/core-components'; const useStyles = makeStyles((theme: BackstageTheme) => ({ listItemText: { @@ -49,7 +50,11 @@ export const ScorecardsList = (props: { checkResults: CheckResult[] }) => { key={index} primary={result.check.name} secondary={ - description ? description(result) : result.check.description + description ? ( + description(result) + ) : ( + + ) } className={classes.listItemText} /> diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index c191a05718..dd8108d71f 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-tech-radar +## 0.6.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.6.5-next.0 ### Patch Changes diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index eed47f142f..3cfeb5d989 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.5-next.0", + "version": "0.6.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 74b1c18695..e96d0fcc86 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.11.1-next.1 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/plugin-techdocs@1.6.3-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/test-utils@1.4.0-next.1 + - @backstage/theme@0.4.0-next.0 + ## 1.0.14-next.0 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 7788757639..9692fc81b0 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.14-next.0", + "version": "1.0.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 45f9acfc5c..2101098aeb 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-techdocs-backend +## 1.6.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-techdocs-node@1.7.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.6.3-next.0 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 9b866e6577..e4e1e7f9be 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.3-next.0", + "version": "1.6.3-next.1", "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 d0079c44a7..7e7e602e97 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/theme@0.4.0-next.0 + ## 1.0.14-next.0 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 1f3a08f65d..0f31147e07 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.14-next.0", + "version": "1.0.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 387789bdd7..0626b7f8cd 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-techdocs-node +## 1.7.2-next.1 + +### Patch Changes + +- 7d4a09304f67: Use latest techdocs docker image by default. The latest image contains security updates. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/integration-aws-node@0.1.4-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.7.2-next.0 ### Patch Changes diff --git a/plugins/techdocs-node/api-report.md b/plugins/techdocs-node/api-report.md index 2a2fe12946..b7941ac89a 100644 --- a/plugins/techdocs-node/api-report.md +++ b/plugins/techdocs-node/api-report.md @@ -243,7 +243,7 @@ export class TechdocsGenerator implements GeneratorBase { config: Config; scmIntegrations: ScmIntegrationRegistry; }); - static readonly defaultDockerImage = 'spotify/techdocs:v1.2.0'; + static readonly defaultDockerImage = 'spotify/techdocs:v1.2.1'; static fromConfig( config: Config, options: GeneratorOptions, diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 0732727a96..faaff43fd5 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.7.2-next.0", + "version": "1.7.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index d2ad0021be..06160b85c9 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -53,7 +53,7 @@ export class TechdocsGenerator implements GeneratorBase { * The default docker image (and version) used to generate content. Public * and static so that techdocs-node consumers can use the same version. */ - public static readonly defaultDockerImage = 'spotify/techdocs:v1.2.0'; + public static readonly defaultDockerImage = 'spotify/techdocs:v1.2.1'; private readonly logger: Logger; private readonly containerRunner?: ContainerRunner; private readonly options: GeneratorConfig; diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index b40c348806..b8973658b5 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-react +## 1.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/version-bridge@1.0.4 + ## 1.1.7-next.0 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 9e8d10c960..bf47156a74 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.7-next.0", + "version": "1.1.7-next.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 7cb6fb67c2..cabeae74b5 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-techdocs +## 1.6.3-next.1 + +### Patch Changes + +- 2f660eb573cc: Fix SearchBar styles & update StoryBook stories for custom styles for `notchedOutline` class. +- Updated dependencies + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + ## 1.6.3-next.0 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 7e49ca02ac..57f42e3ed1 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.3-next.0", + "version": "1.6.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs/src/reader/components/useReaderState.test.tsx b/plugins/techdocs/src/reader/components/useReaderState.test.tsx index 08bfa8f9ad..5f3e2d9662 100644 --- a/plugins/techdocs/src/reader/components/useReaderState.test.tsx +++ b/plugins/techdocs/src/reader/components/useReaderState.test.tsx @@ -26,7 +26,7 @@ import { } from './useReaderState'; describe('useReaderState', () => { - let Wrapper: React.ComponentType; + let Wrapper: React.ComponentType>; const techdocsStorageApi: jest.Mocked = { getApiOrigin: jest.fn(), diff --git a/plugins/techdocs/src/reader/transformers/html/transformer.test.tsx b/plugins/techdocs/src/reader/transformers/html/transformer.test.tsx index dc4eeb85be..2b1f427be3 100644 --- a/plugins/techdocs/src/reader/transformers/html/transformer.test.tsx +++ b/plugins/techdocs/src/reader/transformers/html/transformer.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { FC } from 'react'; +import React, { FC, PropsWithChildren } from 'react'; import { renderHook } from '@testing-library/react-hooks'; import { ConfigReader } from '@backstage/core-app-api'; @@ -31,7 +31,7 @@ const configApiMock: ConfigApi = new ConfigReader({ }, }); -const wrapper: FC = ({ children }) => ( +const wrapper: FC> = ({ children }) => ( {children} diff --git a/plugins/techdocs/src/search/components/TechDocsSearch.tsx b/plugins/techdocs/src/search/components/TechDocsSearch.tsx index 56b51af795..665f99c1bb 100644 --- a/plugins/techdocs/src/search/components/TechDocsSearch.tsx +++ b/plugins/techdocs/src/search/components/TechDocsSearch.tsx @@ -21,20 +21,10 @@ import { SearchContextProvider, useSearch, } from '@backstage/plugin-search-react'; -import { makeStyles, Paper } from '@material-ui/core'; import React, { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { TechDocsSearchResultListItem } from './TechDocsSearchResultListItem'; -const useStyles = makeStyles(theme => ({ - root: { - width: '100%', - }, - bar: { - padding: theme.spacing(1), - }, -})); - /** * Props for {@link TechDocsSearch} * @@ -75,7 +65,6 @@ const TechDocsSearchBar = (props: TechDocsSearchProps) => { setFilters, result: { loading, value: searchVal }, } = useSearch(); - const classes = useStyles(); const [options, setOptions] = useState([]); useEffect(() => { let mounted = true; @@ -117,43 +106,40 @@ const TechDocsSearchBar = (props: TechDocsSearchProps) => { }; return ( - - ''} - filterOptions={x => { - return x; // This is needed to get renderOption to be called after options change. Bug in material-ui? - }} - onClose={() => { - setOpen(false); - }} - onFocus={() => { - setOpen(true); - }} - onChange={handleSelection} - blurOnSelect - noOptionsText="No results found" - value={null} - options={options} - renderOption={({ document, highlight }) => ( - - )} - loading={loading} - inputDebounceTime={debounceTime} - inputPlaceholder={`Search ${entityTitle || entityId.name} docs`} - freeSolo={false} - /> - + ''} + filterOptions={x => { + return x; // This is needed to get renderOption to be called after options change. Bug in material-ui? + }} + onClose={() => { + setOpen(false); + }} + onFocus={() => { + setOpen(true); + }} + onChange={handleSelection} + blurOnSelect + noOptionsText="No results found" + value={null} + options={options} + renderOption={({ document, highlight }) => ( + + )} + loading={loading} + inputDebounceTime={debounceTime} + inputPlaceholder={`Search ${entityTitle || entityId.name} docs`} + freeSolo={false} + /> ); }; diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index ad26eea023..a800dd1065 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-todo-backend +## 0.1.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/config@1.0.7 + ## 0.1.43-next.0 ### Patch Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index e513e4b910..6612d38300 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.43-next.0", + "version": "0.1.43-next.1", "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 ebe0a8aec0..c7bcfb3720 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-todo +## 0.2.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.2.21-next.0 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index 01373e0ace..10ce65f1dd 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.21-next.0", + "version": "0.2.21-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 94de523b73..b28d4360c4 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-user-settings-backend +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/types@1.0.2 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 362c8d0c19..cfbdf935a3 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.10-next.0", + "version": "0.1.10-next.1", "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 44ff953ff8..581f53ace7 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-user-settings +## 0.7.4-next.1 + +### Patch Changes + +- 5362a7c58eaa: Improved the user experience of the feature flags list. It now sorts the enabled flags to the top of the list to increase the visibilities of the toggled flags. +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/types@1.0.2 + ## 0.7.4-next.0 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 209d3fb6f8..b66edde392 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.4-next.0", + "version": "0.7.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index ab1d346877..f7367ce2d9 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-vault-backend +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/config@1.0.7 + ## 0.3.2-next.0 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 34e6d53b5e..47ade317b2 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.2-next.0", + "version": "0.3.2-next.1", "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 87c415c1ca..78261a5647 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-vault +## 0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index f1d0837758..3132308f36 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.13-next.0", + "version": "0.1.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index 38ed4003d5..284dc066b7 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-xcmetrics +## 0.2.39-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + ## 0.2.39-next.0 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index 33c20f3f5a..38d0e2bcf0 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.39-next.0", + "version": "0.2.39-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/storybook/yarn.lock b/storybook/yarn.lock index 8be840ef57..4143a2fa67 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -2943,90 +2943,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-darwin-arm64@npm:1.3.59" +"@swc/core-darwin-arm64@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-darwin-arm64@npm:1.3.62" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-darwin-x64@npm:1.3.59" +"@swc/core-darwin-x64@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-darwin-x64@npm:1.3.62" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.59" +"@swc/core-linux-arm-gnueabihf@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.62" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.59" +"@swc/core-linux-arm64-gnu@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.62" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.59" +"@swc/core-linux-arm64-musl@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.62" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.59" +"@swc/core-linux-x64-gnu@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.62" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-x64-musl@npm:1.3.59" +"@swc/core-linux-x64-musl@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-x64-musl@npm:1.3.62" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.59" +"@swc/core-win32-arm64-msvc@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.62" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.59" +"@swc/core-win32-ia32-msvc@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.62" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.59" +"@swc/core-win32-x64-msvc@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.62" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.3.59 - resolution: "@swc/core@npm:1.3.59" + version: 1.3.62 + resolution: "@swc/core@npm:1.3.62" dependencies: - "@swc/core-darwin-arm64": 1.3.59 - "@swc/core-darwin-x64": 1.3.59 - "@swc/core-linux-arm-gnueabihf": 1.3.59 - "@swc/core-linux-arm64-gnu": 1.3.59 - "@swc/core-linux-arm64-musl": 1.3.59 - "@swc/core-linux-x64-gnu": 1.3.59 - "@swc/core-linux-x64-musl": 1.3.59 - "@swc/core-win32-arm64-msvc": 1.3.59 - "@swc/core-win32-ia32-msvc": 1.3.59 - "@swc/core-win32-x64-msvc": 1.3.59 + "@swc/core-darwin-arm64": 1.3.62 + "@swc/core-darwin-x64": 1.3.62 + "@swc/core-linux-arm-gnueabihf": 1.3.62 + "@swc/core-linux-arm64-gnu": 1.3.62 + "@swc/core-linux-arm64-musl": 1.3.62 + "@swc/core-linux-x64-gnu": 1.3.62 + "@swc/core-linux-x64-musl": 1.3.62 + "@swc/core-win32-arm64-msvc": 1.3.62 + "@swc/core-win32-ia32-msvc": 1.3.62 + "@swc/core-win32-x64-msvc": 1.3.62 peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -3053,7 +3053,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 0283f39cf49cd12a6dc7062ef9ea4fa93e1a4f622ce46903a09605219f4f47ed5ad03925c6146d09ffe6ee02a89bb14e3c82eb86b4c60ecce4985ea6e078ffcf + checksum: a7a0d9ffdb8a2b0050e0ff89fdb86fe189d9bcb7f91cb6847f1bfe3e2b520a87ea2e83692dfd80b6d541fb5addb2194769484516b8ca6d3c62ad80f1c79a9368 languageName: node linkType: hard @@ -3444,154 +3444,154 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ast@npm:1.11.1" +"@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/ast@npm:1.11.6" dependencies: - "@webassemblyjs/helper-numbers": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - checksum: 1eee1534adebeece635362f8e834ae03e389281972611408d64be7895fc49f48f98fddbbb5339bf8a72cb101bcb066e8bca3ca1bf1ef47dadf89def0395a8d87 + "@webassemblyjs/helper-numbers": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + checksum: 38ef1b526ca47c210f30975b06df2faf1a8170b1636ce239fc5738fc231ce28389dd61ecedd1bacfc03cbe95b16d1af848c805652080cb60982836eb4ed2c6cf languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.1" - checksum: b8efc6fa08e4787b7f8e682182d84dfdf8da9d9c77cae5d293818bc4a55c1f419a87fa265ab85252b3e6c1fd323d799efea68d825d341a7c365c64bc14750e97 +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.1" - checksum: 0792813f0ed4a0e5ee0750e8b5d0c631f08e927f4bdfdd9fe9105dc410c786850b8c61bff7f9f515fdfb149903bec3c976a1310573a4c6866a94d49bc7271959 +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.11.1" - checksum: a337ee44b45590c3a30db5a8b7b68a717526cf967ada9f10253995294dbd70a58b2da2165222e0b9830cd4fc6e4c833bf441a721128d1fe2e9a7ab26b36003ce +"@webassemblyjs/helper-buffer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-buffer@npm:1.11.6" + checksum: b14d0573bf680d22b2522e8a341ec451fddd645d1f9c6bd9012ccb7e587a2973b86ab7b89fe91e1c79939ba96095f503af04369a3b356c8023c13a5893221644 languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.1" +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" dependencies: - "@webassemblyjs/floating-point-hex-parser": 1.11.1 - "@webassemblyjs/helper-api-error": 1.11.1 + "@webassemblyjs/floating-point-hex-parser": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 "@xtuc/long": 4.2.2 - checksum: 44d2905dac2f14d1e9b5765cf1063a0fa3d57295c6d8930f6c59a36462afecc6e763e8a110b97b342a0f13376166c5d41aa928e6ced92e2f06b071fd0db59d3a + checksum: f4b562fa219f84368528339e0f8d273ad44e047a07641ffcaaec6f93e5b76fd86490a009aa91a294584e1436d74b0a01fa9fde45e333a4c657b58168b04da424 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.1" - checksum: eac400113127832c88f5826bcc3ad1c0db9b3dbd4c51a723cfdb16af6bfcbceb608170fdaac0ab7731a7e18b291be7af68a47fcdb41cfe0260c10857e7413d97 +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 3535ef4f1fba38de3475e383b3980f4bbf3de72bbb631c2b6584c7df45be4eccd62c6ff48b5edd3f1bcff275cfd605a37679ec199fc91fd0a7705d7f1e3972dc languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.1" +"@webassemblyjs/helper-wasm-section@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - checksum: 617696cfe8ecaf0532763162aaf748eb69096fb27950219bb87686c6b2e66e11cd0614d95d319d0ab1904bc14ebe4e29068b12c3e7c5e020281379741fe4bedf + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + checksum: b2cf751bf4552b5b9999d27bbb7692d0aca75260140195cb58ea6374d7b9c2dc69b61e10b211a0e773f66209c3ddd612137ed66097e3684d7816f854997682e9 languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ieee754@npm:1.11.1" +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" dependencies: "@xtuc/ieee754": ^1.2.0 - checksum: 23a0ac02a50f244471631802798a816524df17e56b1ef929f0c73e3cde70eaf105a24130105c60aff9d64a24ce3b640dad443d6f86e5967f922943a7115022ec + checksum: 13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/leb128@npm:1.11.1" +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" dependencies: "@xtuc/long": 4.2.2 - checksum: 33ccc4ade2f24de07bf31690844d0b1ad224304ee2062b0e464a610b0209c79e0b3009ac190efe0e6bd568b0d1578d7c3047fc1f9d0197c92fc061f56224ff4a + checksum: 7ea942dc9777d4b18a5ebfa3a937b30ae9e1d2ce1fee637583ed7f376334dd1d4274f813d2e250056cca803e0952def4b954913f1a3c9068bcd4ab4ee5143bf0 languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/utf8@npm:1.11.1" - checksum: 972c5cfc769d7af79313a6bfb96517253a270a4bf0c33ba486aa43cac43917184fb35e51dfc9e6b5601548cd5931479a42e42c89a13bb591ffabebf30c8a6a0b +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 807fe5b5ce10c390cfdd93e0fb92abda8aebabb5199980681e7c3743ee3306a75729bcd1e56a3903980e96c885ee53ef901fcbaac8efdfa480f9c0dae1d08713 languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.11.1" +"@webassemblyjs/wasm-edit@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-edit@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/helper-wasm-section": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - "@webassemblyjs/wasm-opt": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - "@webassemblyjs/wast-printer": 1.11.1 - checksum: 6d7d9efaec1227e7ef7585a5d7ff0be5f329f7c1c6b6c0e906b18ed2e9a28792a5635e450aca2d136770d0207225f204eff70a4b8fd879d3ac79e1dcc26dbeb9 + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/helper-wasm-section": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-opt": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + "@webassemblyjs/wast-printer": 1.11.6 + checksum: 29ce75870496d6fad864d815ebb072395a8a3a04dc9c3f4e1ffdc63fc5fa58b1f34304a1117296d8240054cfdbc38aca88e71fb51483cf29ffab0a61ef27b481 languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.11.1" +"@webassemblyjs/wasm-gen@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/ieee754": 1.11.1 - "@webassemblyjs/leb128": 1.11.1 - "@webassemblyjs/utf8": 1.11.1 - checksum: 1f6921e640293bf99fb16b21e09acb59b340a79f986c8f979853a0ae9f0b58557534b81e02ea2b4ef11e929d946708533fd0693c7f3712924128fdafd6465f5b + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: a645a2eecbea24833c3260a249704a7f554ef4a94c6000984728e94bb2bc9140a68dfd6fd21d5e0bbb09f6dfc98e083a45760a83ae0417b41a0196ff6d45a23a languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.11.1" +"@webassemblyjs/wasm-opt@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - checksum: 21586883a20009e2b20feb67bdc451bbc6942252e038aae4c3a08e6f67b6bae0f5f88f20bfc7bd0452db5000bacaf5ab42b98cf9aa034a6c70e9fc616142e1db + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + checksum: b4557f195487f8e97336ddf79f7bef40d788239169aac707f6eaa2fa5fe243557c2d74e550a8e57f2788e70c7ae4e7d32f7be16101afe183d597b747a3bdd528 languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.11.1" +"@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-api-error": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/ieee754": 1.11.1 - "@webassemblyjs/leb128": 1.11.1 - "@webassemblyjs/utf8": 1.11.1 - checksum: 1521644065c360e7b27fad9f4bb2df1802d134dd62937fa1f601a1975cde56bc31a57b6e26408b9ee0228626ff3ba1131ae6f74ffb7d718415b6528c5a6dbfc2 + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: 8200a8d77c15621724a23fdabe58d5571415cda98a7058f542e670ea965dd75499f5e34a48675184947c66f3df23adf55df060312e6d72d57908e3f049620d8a languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wast-printer@npm:1.11.1" +"@webassemblyjs/wast-printer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wast-printer@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/ast": 1.11.6 "@xtuc/long": 4.2.2 - checksum: f15ae4c2441b979a3b4fce78f3d83472fb22350c6dc3fd34bfe7c3da108e0b2360718734d961bba20e7716cb8578e964b870da55b035e209e50ec9db0378a3f7 + checksum: d2fa6a4c427325ec81463e9c809aa6572af6d47f619f3091bf4c4a6fc34f1da3df7caddaac50b8e7a457f8784c62cd58c6311b6cb69b0162ccd8d4c072f79cf8 languageName: node linkType: hard @@ -3626,12 +3626,12 @@ __metadata: languageName: node linkType: hard -"acorn-import-assertions@npm:^1.7.6": - version: 1.8.0 - resolution: "acorn-import-assertions@npm:1.8.0" +"acorn-import-assertions@npm:^1.9.0": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" peerDependencies: acorn: ^8 - checksum: 5c4cf7c850102ba7ae0eeae0deb40fb3158c8ca5ff15c0bca43b5c47e307a1de3d8ef761788f881343680ea374631ae9e9615ba8876fee5268dbe068c98bcba6 + checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c languageName: node linkType: hard @@ -5513,13 +5513,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.10.0": - version: 5.10.0 - resolution: "enhanced-resolve@npm:5.10.0" +"enhanced-resolve@npm:^5.14.1": + version: 5.14.1 + resolution: "enhanced-resolve@npm:5.14.1" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: 0bb9830704db271610f900e8d79d70a740ea16f251263362b0c91af545576d09fe50103496606c1300a05e588372d6f9780a9bc2e30ce8ef9b827ec8f44687ff + checksum: ad2a31928b6649eed40d364838449587f731baa63863e83d2629bebaa8be1eabac18b90f89c1784bc805b0818363e99b22547159edd485d7e5ccf18cdc640642 languageName: node linkType: hard @@ -10282,14 +10282,14 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.0, schema-utils@npm:^3.1.1": - version: 3.1.1 - resolution: "schema-utils@npm:3.1.1" +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.1.2": + version: 3.1.2 + resolution: "schema-utils@npm:3.1.2" dependencies: "@types/json-schema": ^7.0.8 ajv: ^6.12.5 ajv-keywords: ^3.5.2 - checksum: fb73f3d759d43ba033c877628fe9751620a26879f6301d3dbeeb48cf2a65baec5cdf99da65d1bf3b4ff5444b2e59cbe4f81c2456b5e0d2ba7d7fd4aed5da29ce + checksum: 39683edfe3beff018cdb1ae4fa296fc55cea13a080aa2b4d9351895cd64b22ba4d87e2e548c2a2ac1bc76e60980670adb0f413a58104479f1a0c12e5663cb8ca languageName: node linkType: hard @@ -11863,19 +11863,19 @@ __metadata: linkType: hard "webpack@npm:^5.73.0": - version: 5.79.0 - resolution: "webpack@npm:5.79.0" + version: 5.85.0 + resolution: "webpack@npm:5.85.0" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^1.0.0 - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/wasm-edit": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 + "@webassemblyjs/ast": ^1.11.5 + "@webassemblyjs/wasm-edit": ^1.11.5 + "@webassemblyjs/wasm-parser": ^1.11.5 acorn: ^8.7.1 - acorn-import-assertions: ^1.7.6 + acorn-import-assertions: ^1.9.0 browserslist: ^4.14.5 chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.10.0 + enhanced-resolve: ^5.14.1 es-module-lexer: ^1.2.1 eslint-scope: 5.1.1 events: ^3.2.0 @@ -11885,7 +11885,7 @@ __metadata: loader-runner: ^4.2.0 mime-types: ^2.1.27 neo-async: ^2.6.2 - schema-utils: ^3.1.0 + schema-utils: ^3.1.2 tapable: ^2.1.1 terser-webpack-plugin: ^5.3.7 watchpack: ^2.4.0 @@ -11895,7 +11895,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 3fbd82dadc75c8f823c900c5d50263830b77e6be6a8abb26eec12f93dec94c2f07fa44c1ef1f28319682404e532d9707ed04ed6cb89af87ca7d544e435d8ef95 + checksum: b013be9fbc7f6810d1f229f570c70710ddbc7290f817411acffe4214b2b6c783a041ab1f2005d9e1109f4ab21c136f0f8d8c067a5fb64f20a82dcbc1ee0d3f42 languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 1621c01a2f..7f430b63bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -85,13 +85,13 @@ __metadata: linkType: hard "@apollo/client@npm:^3.0.0": - version: 3.7.14 - resolution: "@apollo/client@npm:3.7.14" + version: 3.7.15 + resolution: "@apollo/client@npm:3.7.15" dependencies: "@graphql-typed-document-node/core": ^3.1.1 "@wry/context": ^0.7.0 "@wry/equality": ^0.5.0 - "@wry/trie": ^0.3.0 + "@wry/trie": ^0.4.0 graphql-tag: ^2.12.6 hoist-non-react-statics: ^3.3.2 optimism: ^0.16.2 @@ -116,7 +116,7 @@ __metadata: optional: true subscriptions-transport-ws: optional: true - checksum: eaa8af74450fee4d4761d25fb8fe752788517b27ebb46a51b6496950c5b73f48b6ba3e4f3474b6e4a4f310916dc3fcf079306c35f16d4284b96c7fdbb8539fde + checksum: a33e56847dfb7d6176ffb3cd4d3ff2c548826ce51280a6c8f70e3d75daf9d3a287e79bf3d86ea0b16e39218c90d8a7b4f528eb340055387cf9137705970c0f59 languageName: node linkType: hard @@ -531,13 +531,13 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/abort-controller@npm:3.329.0, @aws-sdk/abort-controller@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/abort-controller@npm:3.329.0" +"@aws-sdk/abort-controller@npm:3.342.0, @aws-sdk/abort-controller@npm:^3.310.0": + version: 3.342.0 + resolution: "@aws-sdk/abort-controller@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 37f65402b2599d19793a2fc9de18d61eed4663fd8b565f2782bc5ab5b9bcf0adc4600275dca3860d66dbcf1f347e5c506ca2cb41842e9f64d625cad9b4676fef + checksum: 5681ba5f943c1843b841a16290f9a093d01a75f16fc2348ae140a1b83ecdae983696f5f59936cd91f33eb8f76701b9f4dae11ad68f6d29c785327767a6564057 languageName: node linkType: hard @@ -550,620 +550,628 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-cognito-identity@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.329.0" +"@aws-sdk/client-cognito-identity@npm:3.345.0": + version: 3.345.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.345.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.329.0 - "@aws-sdk/config-resolver": 3.329.0 - "@aws-sdk/credential-provider-node": 3.329.0 - "@aws-sdk/fetch-http-handler": 3.329.0 - "@aws-sdk/hash-node": 3.329.0 - "@aws-sdk/invalid-dependency": 3.329.0 - "@aws-sdk/middleware-content-length": 3.329.0 - "@aws-sdk/middleware-endpoint": 3.329.0 - "@aws-sdk/middleware-host-header": 3.329.0 - "@aws-sdk/middleware-logger": 3.329.0 - "@aws-sdk/middleware-recursion-detection": 3.329.0 - "@aws-sdk/middleware-retry": 3.329.0 - "@aws-sdk/middleware-serde": 3.329.0 - "@aws-sdk/middleware-signing": 3.329.0 - "@aws-sdk/middleware-stack": 3.329.0 - "@aws-sdk/middleware-user-agent": 3.329.0 - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/node-http-handler": 3.329.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/smithy-client": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/url-parser": 3.329.0 + "@aws-sdk/client-sts": 3.345.0 + "@aws-sdk/config-resolver": 3.342.0 + "@aws-sdk/credential-provider-node": 3.345.0 + "@aws-sdk/fetch-http-handler": 3.342.0 + "@aws-sdk/hash-node": 3.344.0 + "@aws-sdk/invalid-dependency": 3.342.0 + "@aws-sdk/middleware-content-length": 3.342.0 + "@aws-sdk/middleware-endpoint": 3.344.0 + "@aws-sdk/middleware-host-header": 3.342.0 + "@aws-sdk/middleware-logger": 3.342.0 + "@aws-sdk/middleware-recursion-detection": 3.342.0 + "@aws-sdk/middleware-retry": 3.342.0 + "@aws-sdk/middleware-serde": 3.342.0 + "@aws-sdk/middleware-signing": 3.342.0 + "@aws-sdk/middleware-stack": 3.342.0 + "@aws-sdk/middleware-user-agent": 3.345.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/node-http-handler": 3.344.0 + "@aws-sdk/smithy-client": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/url-parser": 3.342.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.329.0 - "@aws-sdk/util-defaults-mode-node": 3.329.0 - "@aws-sdk/util-endpoints": 3.329.0 - "@aws-sdk/util-retry": 3.329.0 - "@aws-sdk/util-user-agent-browser": 3.329.0 - "@aws-sdk/util-user-agent-node": 3.329.0 + "@aws-sdk/util-defaults-mode-browser": 3.342.0 + "@aws-sdk/util-defaults-mode-node": 3.342.0 + "@aws-sdk/util-endpoints": 3.342.0 + "@aws-sdk/util-retry": 3.342.0 + "@aws-sdk/util-user-agent-browser": 3.345.0 + "@aws-sdk/util-user-agent-node": 3.345.0 "@aws-sdk/util-utf8": 3.310.0 + "@smithy/protocol-http": ^1.0.1 + "@smithy/types": ^1.0.0 tslib: ^2.5.0 - checksum: bb60cbad68375fda44f7a4cd538feb55ed744a8cf510c56f8fe71c7611fef75b6b7d4bf6ff2190283b5bedf184f4cb13d6867ccebbf8588e6176de09133c9e52 + checksum: 7dead889b689a3e4bd0c911008cafc8f362bf09377b0590f1d467a47819ca8f3185b4fe786f6b81cd0df68a5010a4ca092e4e8edc18491f71460745d0b9604d7 languageName: node linkType: hard "@aws-sdk/client-eks@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/client-eks@npm:3.329.0" + version: 3.345.0 + resolution: "@aws-sdk/client-eks@npm:3.345.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.329.0 - "@aws-sdk/config-resolver": 3.329.0 - "@aws-sdk/credential-provider-node": 3.329.0 - "@aws-sdk/fetch-http-handler": 3.329.0 - "@aws-sdk/hash-node": 3.329.0 - "@aws-sdk/invalid-dependency": 3.329.0 - "@aws-sdk/middleware-content-length": 3.329.0 - "@aws-sdk/middleware-endpoint": 3.329.0 - "@aws-sdk/middleware-host-header": 3.329.0 - "@aws-sdk/middleware-logger": 3.329.0 - "@aws-sdk/middleware-recursion-detection": 3.329.0 - "@aws-sdk/middleware-retry": 3.329.0 - "@aws-sdk/middleware-serde": 3.329.0 - "@aws-sdk/middleware-signing": 3.329.0 - "@aws-sdk/middleware-stack": 3.329.0 - "@aws-sdk/middleware-user-agent": 3.329.0 - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/node-http-handler": 3.329.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/smithy-client": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/url-parser": 3.329.0 + "@aws-sdk/client-sts": 3.345.0 + "@aws-sdk/config-resolver": 3.342.0 + "@aws-sdk/credential-provider-node": 3.345.0 + "@aws-sdk/fetch-http-handler": 3.342.0 + "@aws-sdk/hash-node": 3.344.0 + "@aws-sdk/invalid-dependency": 3.342.0 + "@aws-sdk/middleware-content-length": 3.342.0 + "@aws-sdk/middleware-endpoint": 3.344.0 + "@aws-sdk/middleware-host-header": 3.342.0 + "@aws-sdk/middleware-logger": 3.342.0 + "@aws-sdk/middleware-recursion-detection": 3.342.0 + "@aws-sdk/middleware-retry": 3.342.0 + "@aws-sdk/middleware-serde": 3.342.0 + "@aws-sdk/middleware-signing": 3.342.0 + "@aws-sdk/middleware-stack": 3.342.0 + "@aws-sdk/middleware-user-agent": 3.345.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/node-http-handler": 3.344.0 + "@aws-sdk/smithy-client": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/url-parser": 3.342.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.329.0 - "@aws-sdk/util-defaults-mode-node": 3.329.0 - "@aws-sdk/util-endpoints": 3.329.0 - "@aws-sdk/util-retry": 3.329.0 - "@aws-sdk/util-user-agent-browser": 3.329.0 - "@aws-sdk/util-user-agent-node": 3.329.0 + "@aws-sdk/util-defaults-mode-browser": 3.342.0 + "@aws-sdk/util-defaults-mode-node": 3.342.0 + "@aws-sdk/util-endpoints": 3.342.0 + "@aws-sdk/util-retry": 3.342.0 + "@aws-sdk/util-user-agent-browser": 3.345.0 + "@aws-sdk/util-user-agent-node": 3.345.0 "@aws-sdk/util-utf8": 3.310.0 - "@aws-sdk/util-waiter": 3.329.0 + "@aws-sdk/util-waiter": 3.342.0 + "@smithy/protocol-http": ^1.0.1 + "@smithy/types": ^1.0.0 tslib: ^2.5.0 uuid: ^8.3.2 - checksum: 373176c8cc23b3aef3f1b1088568b2ec1d635597119fe8d2633850a7edb214c14e8990665045c70658076b27413aa8915f04946ab13c0e15eb1041a1954e2f1e + checksum: 5d3488054155e05afe3cc700cd8156cfaa17098b869a240f596e12b64f0b3714f95ae41f4a8f19c91951eaa7ba1a5e7ab47d8eb7f69c982728f3cff594cc1417 languageName: node linkType: hard "@aws-sdk/client-organizations@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/client-organizations@npm:3.329.0" + version: 3.345.0 + resolution: "@aws-sdk/client-organizations@npm:3.345.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.329.0 - "@aws-sdk/config-resolver": 3.329.0 - "@aws-sdk/credential-provider-node": 3.329.0 - "@aws-sdk/fetch-http-handler": 3.329.0 - "@aws-sdk/hash-node": 3.329.0 - "@aws-sdk/invalid-dependency": 3.329.0 - "@aws-sdk/middleware-content-length": 3.329.0 - "@aws-sdk/middleware-endpoint": 3.329.0 - "@aws-sdk/middleware-host-header": 3.329.0 - "@aws-sdk/middleware-logger": 3.329.0 - "@aws-sdk/middleware-recursion-detection": 3.329.0 - "@aws-sdk/middleware-retry": 3.329.0 - "@aws-sdk/middleware-serde": 3.329.0 - "@aws-sdk/middleware-signing": 3.329.0 - "@aws-sdk/middleware-stack": 3.329.0 - "@aws-sdk/middleware-user-agent": 3.329.0 - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/node-http-handler": 3.329.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/smithy-client": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/url-parser": 3.329.0 + "@aws-sdk/client-sts": 3.345.0 + "@aws-sdk/config-resolver": 3.342.0 + "@aws-sdk/credential-provider-node": 3.345.0 + "@aws-sdk/fetch-http-handler": 3.342.0 + "@aws-sdk/hash-node": 3.344.0 + "@aws-sdk/invalid-dependency": 3.342.0 + "@aws-sdk/middleware-content-length": 3.342.0 + "@aws-sdk/middleware-endpoint": 3.344.0 + "@aws-sdk/middleware-host-header": 3.342.0 + "@aws-sdk/middleware-logger": 3.342.0 + "@aws-sdk/middleware-recursion-detection": 3.342.0 + "@aws-sdk/middleware-retry": 3.342.0 + "@aws-sdk/middleware-serde": 3.342.0 + "@aws-sdk/middleware-signing": 3.342.0 + "@aws-sdk/middleware-stack": 3.342.0 + "@aws-sdk/middleware-user-agent": 3.345.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/node-http-handler": 3.344.0 + "@aws-sdk/smithy-client": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/url-parser": 3.342.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.329.0 - "@aws-sdk/util-defaults-mode-node": 3.329.0 - "@aws-sdk/util-endpoints": 3.329.0 - "@aws-sdk/util-retry": 3.329.0 - "@aws-sdk/util-user-agent-browser": 3.329.0 - "@aws-sdk/util-user-agent-node": 3.329.0 + "@aws-sdk/util-defaults-mode-browser": 3.342.0 + "@aws-sdk/util-defaults-mode-node": 3.342.0 + "@aws-sdk/util-endpoints": 3.342.0 + "@aws-sdk/util-retry": 3.342.0 + "@aws-sdk/util-user-agent-browser": 3.345.0 + "@aws-sdk/util-user-agent-node": 3.345.0 "@aws-sdk/util-utf8": 3.310.0 + "@smithy/protocol-http": ^1.0.1 + "@smithy/types": ^1.0.0 tslib: ^2.5.0 - checksum: d36b5d05005a3603153c11f1b0fd4272fe5c5fb3af7209c9788d15731016e635c1ae45bfdcbd0efe69c4b3e197dc6ee31e1df708ecfafa13f04742eaf444a670 + checksum: 2a50e58cdcac75cd6b4bc5ca8b985feadc8de100db9a12e1820189a22098b983695dbba7927f7ab8dc48bbb1d6210d33006cf9712f275d1afa10b61a4923e7f7 languageName: node linkType: hard "@aws-sdk/client-s3@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/client-s3@npm:3.329.0" + version: 3.345.0 + resolution: "@aws-sdk/client-s3@npm:3.345.0" dependencies: "@aws-crypto/sha1-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.329.0 - "@aws-sdk/config-resolver": 3.329.0 - "@aws-sdk/credential-provider-node": 3.329.0 - "@aws-sdk/eventstream-serde-browser": 3.329.0 - "@aws-sdk/eventstream-serde-config-resolver": 3.329.0 - "@aws-sdk/eventstream-serde-node": 3.329.0 - "@aws-sdk/fetch-http-handler": 3.329.0 - "@aws-sdk/hash-blob-browser": 3.329.0 - "@aws-sdk/hash-node": 3.329.0 - "@aws-sdk/hash-stream-node": 3.329.0 - "@aws-sdk/invalid-dependency": 3.329.0 - "@aws-sdk/md5-js": 3.329.0 - "@aws-sdk/middleware-bucket-endpoint": 3.329.0 - "@aws-sdk/middleware-content-length": 3.329.0 - "@aws-sdk/middleware-endpoint": 3.329.0 - "@aws-sdk/middleware-expect-continue": 3.329.0 - "@aws-sdk/middleware-flexible-checksums": 3.329.0 - "@aws-sdk/middleware-host-header": 3.329.0 - "@aws-sdk/middleware-location-constraint": 3.329.0 - "@aws-sdk/middleware-logger": 3.329.0 - "@aws-sdk/middleware-recursion-detection": 3.329.0 - "@aws-sdk/middleware-retry": 3.329.0 - "@aws-sdk/middleware-sdk-s3": 3.329.0 - "@aws-sdk/middleware-serde": 3.329.0 - "@aws-sdk/middleware-signing": 3.329.0 - "@aws-sdk/middleware-ssec": 3.329.0 - "@aws-sdk/middleware-stack": 3.329.0 - "@aws-sdk/middleware-user-agent": 3.329.0 - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/node-http-handler": 3.329.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/signature-v4-multi-region": 3.329.0 - "@aws-sdk/smithy-client": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/url-parser": 3.329.0 + "@aws-sdk/client-sts": 3.345.0 + "@aws-sdk/config-resolver": 3.342.0 + "@aws-sdk/credential-provider-node": 3.345.0 + "@aws-sdk/eventstream-serde-browser": 3.342.0 + "@aws-sdk/eventstream-serde-config-resolver": 3.342.0 + "@aws-sdk/eventstream-serde-node": 3.342.0 + "@aws-sdk/fetch-http-handler": 3.342.0 + "@aws-sdk/hash-blob-browser": 3.342.0 + "@aws-sdk/hash-node": 3.344.0 + "@aws-sdk/hash-stream-node": 3.342.0 + "@aws-sdk/invalid-dependency": 3.342.0 + "@aws-sdk/md5-js": 3.342.0 + "@aws-sdk/middleware-bucket-endpoint": 3.342.0 + "@aws-sdk/middleware-content-length": 3.342.0 + "@aws-sdk/middleware-endpoint": 3.344.0 + "@aws-sdk/middleware-expect-continue": 3.342.0 + "@aws-sdk/middleware-flexible-checksums": 3.342.0 + "@aws-sdk/middleware-host-header": 3.342.0 + "@aws-sdk/middleware-location-constraint": 3.342.0 + "@aws-sdk/middleware-logger": 3.342.0 + "@aws-sdk/middleware-recursion-detection": 3.342.0 + "@aws-sdk/middleware-retry": 3.342.0 + "@aws-sdk/middleware-sdk-s3": 3.342.0 + "@aws-sdk/middleware-serde": 3.342.0 + "@aws-sdk/middleware-signing": 3.342.0 + "@aws-sdk/middleware-ssec": 3.342.0 + "@aws-sdk/middleware-stack": 3.342.0 + "@aws-sdk/middleware-user-agent": 3.345.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/node-http-handler": 3.344.0 + "@aws-sdk/signature-v4-multi-region": 3.344.0 + "@aws-sdk/smithy-client": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/url-parser": 3.342.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.329.0 - "@aws-sdk/util-defaults-mode-node": 3.329.0 - "@aws-sdk/util-endpoints": 3.329.0 - "@aws-sdk/util-retry": 3.329.0 - "@aws-sdk/util-stream-browser": 3.329.0 - "@aws-sdk/util-stream-node": 3.329.0 - "@aws-sdk/util-user-agent-browser": 3.329.0 - "@aws-sdk/util-user-agent-node": 3.329.0 + "@aws-sdk/util-defaults-mode-browser": 3.342.0 + "@aws-sdk/util-defaults-mode-node": 3.342.0 + "@aws-sdk/util-endpoints": 3.342.0 + "@aws-sdk/util-retry": 3.342.0 + "@aws-sdk/util-stream-browser": 3.342.0 + "@aws-sdk/util-stream-node": 3.344.0 + "@aws-sdk/util-user-agent-browser": 3.345.0 + "@aws-sdk/util-user-agent-node": 3.345.0 "@aws-sdk/util-utf8": 3.310.0 - "@aws-sdk/util-waiter": 3.329.0 + "@aws-sdk/util-waiter": 3.342.0 "@aws-sdk/xml-builder": 3.310.0 + "@smithy/protocol-http": ^1.0.1 + "@smithy/types": ^1.0.0 fast-xml-parser: 4.1.2 tslib: ^2.5.0 - checksum: dd413da8c16a0ed2246e60a65c18dad143535e72f234da35ba85561dc14ec06e669f155bf37039c9dc7a15547bc6ce792d9fec89d7b0a896b37aa54ebb2ae16c + checksum: 586a4067378e3e8a276608d247b7d0d2a74039ab1f7990750f8fb961689e1bb07a6faf1b4f7ae57e63195bf15a497f8dacd50a388367825de52cdbecefd420ca languageName: node linkType: hard "@aws-sdk/client-sqs@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/client-sqs@npm:3.329.0" + version: 3.345.0 + resolution: "@aws-sdk/client-sqs@npm:3.345.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.329.0 - "@aws-sdk/config-resolver": 3.329.0 - "@aws-sdk/credential-provider-node": 3.329.0 - "@aws-sdk/fetch-http-handler": 3.329.0 - "@aws-sdk/hash-node": 3.329.0 - "@aws-sdk/invalid-dependency": 3.329.0 - "@aws-sdk/md5-js": 3.329.0 - "@aws-sdk/middleware-content-length": 3.329.0 - "@aws-sdk/middleware-endpoint": 3.329.0 - "@aws-sdk/middleware-host-header": 3.329.0 - "@aws-sdk/middleware-logger": 3.329.0 - "@aws-sdk/middleware-recursion-detection": 3.329.0 - "@aws-sdk/middleware-retry": 3.329.0 - "@aws-sdk/middleware-sdk-sqs": 3.329.0 - "@aws-sdk/middleware-serde": 3.329.0 - "@aws-sdk/middleware-signing": 3.329.0 - "@aws-sdk/middleware-stack": 3.329.0 - "@aws-sdk/middleware-user-agent": 3.329.0 - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/node-http-handler": 3.329.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/smithy-client": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/url-parser": 3.329.0 + "@aws-sdk/client-sts": 3.345.0 + "@aws-sdk/config-resolver": 3.342.0 + "@aws-sdk/credential-provider-node": 3.345.0 + "@aws-sdk/fetch-http-handler": 3.342.0 + "@aws-sdk/hash-node": 3.344.0 + "@aws-sdk/invalid-dependency": 3.342.0 + "@aws-sdk/md5-js": 3.342.0 + "@aws-sdk/middleware-content-length": 3.342.0 + "@aws-sdk/middleware-endpoint": 3.344.0 + "@aws-sdk/middleware-host-header": 3.342.0 + "@aws-sdk/middleware-logger": 3.342.0 + "@aws-sdk/middleware-recursion-detection": 3.342.0 + "@aws-sdk/middleware-retry": 3.342.0 + "@aws-sdk/middleware-sdk-sqs": 3.342.0 + "@aws-sdk/middleware-serde": 3.342.0 + "@aws-sdk/middleware-signing": 3.342.0 + "@aws-sdk/middleware-stack": 3.342.0 + "@aws-sdk/middleware-user-agent": 3.345.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/node-http-handler": 3.344.0 + "@aws-sdk/smithy-client": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/url-parser": 3.342.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.329.0 - "@aws-sdk/util-defaults-mode-node": 3.329.0 - "@aws-sdk/util-endpoints": 3.329.0 - "@aws-sdk/util-retry": 3.329.0 - "@aws-sdk/util-user-agent-browser": 3.329.0 - "@aws-sdk/util-user-agent-node": 3.329.0 + "@aws-sdk/util-defaults-mode-browser": 3.342.0 + "@aws-sdk/util-defaults-mode-node": 3.342.0 + "@aws-sdk/util-endpoints": 3.342.0 + "@aws-sdk/util-retry": 3.342.0 + "@aws-sdk/util-user-agent-browser": 3.345.0 + "@aws-sdk/util-user-agent-node": 3.345.0 "@aws-sdk/util-utf8": 3.310.0 + "@smithy/protocol-http": ^1.0.1 + "@smithy/types": ^1.0.0 fast-xml-parser: 4.1.2 tslib: ^2.5.0 - checksum: 10559224f1d77ed6ddef93fd1b91518e5b24b0c75a71287cc5b3e9000424af1b253a17ad1bc852c48849cecd735b99aed916f04370d0f3755ba3b65bd45a478c + checksum: f6a8cd2a1437d43596c4b1a2e63bedb7215bdda96ccf1820f8ae18a42b9ceaade239b0a335a4fb34c65f635a6d65b827907085aebb1ae7f18702f944659840f8 languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.329.0" +"@aws-sdk/client-sso-oidc@npm:3.345.0": + version: 3.345.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.345.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.329.0 - "@aws-sdk/fetch-http-handler": 3.329.0 - "@aws-sdk/hash-node": 3.329.0 - "@aws-sdk/invalid-dependency": 3.329.0 - "@aws-sdk/middleware-content-length": 3.329.0 - "@aws-sdk/middleware-endpoint": 3.329.0 - "@aws-sdk/middleware-host-header": 3.329.0 - "@aws-sdk/middleware-logger": 3.329.0 - "@aws-sdk/middleware-recursion-detection": 3.329.0 - "@aws-sdk/middleware-retry": 3.329.0 - "@aws-sdk/middleware-serde": 3.329.0 - "@aws-sdk/middleware-stack": 3.329.0 - "@aws-sdk/middleware-user-agent": 3.329.0 - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/node-http-handler": 3.329.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/smithy-client": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/url-parser": 3.329.0 + "@aws-sdk/config-resolver": 3.342.0 + "@aws-sdk/fetch-http-handler": 3.342.0 + "@aws-sdk/hash-node": 3.344.0 + "@aws-sdk/invalid-dependency": 3.342.0 + "@aws-sdk/middleware-content-length": 3.342.0 + "@aws-sdk/middleware-endpoint": 3.344.0 + "@aws-sdk/middleware-host-header": 3.342.0 + "@aws-sdk/middleware-logger": 3.342.0 + "@aws-sdk/middleware-recursion-detection": 3.342.0 + "@aws-sdk/middleware-retry": 3.342.0 + "@aws-sdk/middleware-serde": 3.342.0 + "@aws-sdk/middleware-stack": 3.342.0 + "@aws-sdk/middleware-user-agent": 3.345.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/node-http-handler": 3.344.0 + "@aws-sdk/smithy-client": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/url-parser": 3.342.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.329.0 - "@aws-sdk/util-defaults-mode-node": 3.329.0 - "@aws-sdk/util-endpoints": 3.329.0 - "@aws-sdk/util-retry": 3.329.0 - "@aws-sdk/util-user-agent-browser": 3.329.0 - "@aws-sdk/util-user-agent-node": 3.329.0 + "@aws-sdk/util-defaults-mode-browser": 3.342.0 + "@aws-sdk/util-defaults-mode-node": 3.342.0 + "@aws-sdk/util-endpoints": 3.342.0 + "@aws-sdk/util-retry": 3.342.0 + "@aws-sdk/util-user-agent-browser": 3.345.0 + "@aws-sdk/util-user-agent-node": 3.345.0 "@aws-sdk/util-utf8": 3.310.0 + "@smithy/protocol-http": ^1.0.1 + "@smithy/types": ^1.0.0 tslib: ^2.5.0 - checksum: 6ddb767778548b4e6952a0efc867fa53c37b37149d3b762577db80c1d3b51a5c9a92e85fb34affd91c73e64b55a9e9184bf63b1301f3bd5034daa7effd645dc6 + checksum: 6241236088ad895f87cb1c0c5bcb176cfa20613097d99308dc513cea8f0b10efcab05b4a2d4f22819ca2c4ec8aee384c566e72e4177eb65cdd87136a650f1062 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/client-sso@npm:3.329.0" +"@aws-sdk/client-sso@npm:3.345.0": + version: 3.345.0 + resolution: "@aws-sdk/client-sso@npm:3.345.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.329.0 - "@aws-sdk/fetch-http-handler": 3.329.0 - "@aws-sdk/hash-node": 3.329.0 - "@aws-sdk/invalid-dependency": 3.329.0 - "@aws-sdk/middleware-content-length": 3.329.0 - "@aws-sdk/middleware-endpoint": 3.329.0 - "@aws-sdk/middleware-host-header": 3.329.0 - "@aws-sdk/middleware-logger": 3.329.0 - "@aws-sdk/middleware-recursion-detection": 3.329.0 - "@aws-sdk/middleware-retry": 3.329.0 - "@aws-sdk/middleware-serde": 3.329.0 - "@aws-sdk/middleware-stack": 3.329.0 - "@aws-sdk/middleware-user-agent": 3.329.0 - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/node-http-handler": 3.329.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/smithy-client": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/url-parser": 3.329.0 + "@aws-sdk/config-resolver": 3.342.0 + "@aws-sdk/fetch-http-handler": 3.342.0 + "@aws-sdk/hash-node": 3.344.0 + "@aws-sdk/invalid-dependency": 3.342.0 + "@aws-sdk/middleware-content-length": 3.342.0 + "@aws-sdk/middleware-endpoint": 3.344.0 + "@aws-sdk/middleware-host-header": 3.342.0 + "@aws-sdk/middleware-logger": 3.342.0 + "@aws-sdk/middleware-recursion-detection": 3.342.0 + "@aws-sdk/middleware-retry": 3.342.0 + "@aws-sdk/middleware-serde": 3.342.0 + "@aws-sdk/middleware-stack": 3.342.0 + "@aws-sdk/middleware-user-agent": 3.345.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/node-http-handler": 3.344.0 + "@aws-sdk/smithy-client": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/url-parser": 3.342.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.329.0 - "@aws-sdk/util-defaults-mode-node": 3.329.0 - "@aws-sdk/util-endpoints": 3.329.0 - "@aws-sdk/util-retry": 3.329.0 - "@aws-sdk/util-user-agent-browser": 3.329.0 - "@aws-sdk/util-user-agent-node": 3.329.0 + "@aws-sdk/util-defaults-mode-browser": 3.342.0 + "@aws-sdk/util-defaults-mode-node": 3.342.0 + "@aws-sdk/util-endpoints": 3.342.0 + "@aws-sdk/util-retry": 3.342.0 + "@aws-sdk/util-user-agent-browser": 3.345.0 + "@aws-sdk/util-user-agent-node": 3.345.0 "@aws-sdk/util-utf8": 3.310.0 + "@smithy/protocol-http": ^1.0.1 + "@smithy/types": ^1.0.0 tslib: ^2.5.0 - checksum: 27227bdefc73d6c5501418c752d4015217ac787c063bccf805aba2c213fb7abcc10862cb2faab5cfa7a36e29eeacb59aea61717cbb8aaf075cd69962bab3abc9 + checksum: 6ecbb35aeaa928ca1c4a57e72d677eeba40bdbd97131e9b860ef658886840f07335593841117287fa62551ad9d2c655bb5abdb05909a46ff81ed8a2c6441f421 languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.329.0, @aws-sdk/client-sts@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/client-sts@npm:3.329.0" +"@aws-sdk/client-sts@npm:3.345.0, @aws-sdk/client-sts@npm:^3.310.0": + version: 3.345.0 + resolution: "@aws-sdk/client-sts@npm:3.345.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.329.0 - "@aws-sdk/credential-provider-node": 3.329.0 - "@aws-sdk/fetch-http-handler": 3.329.0 - "@aws-sdk/hash-node": 3.329.0 - "@aws-sdk/invalid-dependency": 3.329.0 - "@aws-sdk/middleware-content-length": 3.329.0 - "@aws-sdk/middleware-endpoint": 3.329.0 - "@aws-sdk/middleware-host-header": 3.329.0 - "@aws-sdk/middleware-logger": 3.329.0 - "@aws-sdk/middleware-recursion-detection": 3.329.0 - "@aws-sdk/middleware-retry": 3.329.0 - "@aws-sdk/middleware-sdk-sts": 3.329.0 - "@aws-sdk/middleware-serde": 3.329.0 - "@aws-sdk/middleware-signing": 3.329.0 - "@aws-sdk/middleware-stack": 3.329.0 - "@aws-sdk/middleware-user-agent": 3.329.0 - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/node-http-handler": 3.329.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/smithy-client": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/url-parser": 3.329.0 + "@aws-sdk/config-resolver": 3.342.0 + "@aws-sdk/credential-provider-node": 3.345.0 + "@aws-sdk/fetch-http-handler": 3.342.0 + "@aws-sdk/hash-node": 3.344.0 + "@aws-sdk/invalid-dependency": 3.342.0 + "@aws-sdk/middleware-content-length": 3.342.0 + "@aws-sdk/middleware-endpoint": 3.344.0 + "@aws-sdk/middleware-host-header": 3.342.0 + "@aws-sdk/middleware-logger": 3.342.0 + "@aws-sdk/middleware-recursion-detection": 3.342.0 + "@aws-sdk/middleware-retry": 3.342.0 + "@aws-sdk/middleware-sdk-sts": 3.342.0 + "@aws-sdk/middleware-serde": 3.342.0 + "@aws-sdk/middleware-signing": 3.342.0 + "@aws-sdk/middleware-stack": 3.342.0 + "@aws-sdk/middleware-user-agent": 3.345.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/node-http-handler": 3.344.0 + "@aws-sdk/smithy-client": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/url-parser": 3.342.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.329.0 - "@aws-sdk/util-defaults-mode-node": 3.329.0 - "@aws-sdk/util-endpoints": 3.329.0 - "@aws-sdk/util-retry": 3.329.0 - "@aws-sdk/util-user-agent-browser": 3.329.0 - "@aws-sdk/util-user-agent-node": 3.329.0 + "@aws-sdk/util-defaults-mode-browser": 3.342.0 + "@aws-sdk/util-defaults-mode-node": 3.342.0 + "@aws-sdk/util-endpoints": 3.342.0 + "@aws-sdk/util-retry": 3.342.0 + "@aws-sdk/util-user-agent-browser": 3.345.0 + "@aws-sdk/util-user-agent-node": 3.345.0 "@aws-sdk/util-utf8": 3.310.0 + "@smithy/protocol-http": ^1.0.1 + "@smithy/types": ^1.0.0 fast-xml-parser: 4.1.2 tslib: ^2.5.0 - checksum: f9dc6bf6cf640bff23f5aed792921cbf7048df88c840092b4727f8e32c4a14abf420e939a319167ee6bbcf7a1f5f61774d980a6c03e88afe516f7b662361a46a + checksum: 46dd7929a56e6126f750cde095569375aa12fe321ce1d71ea9749e0de6878e45f983e6db141dc3d804745324b810ddc8a512ff1afa4d3c8cd6d00823bc9dd857 languageName: node linkType: hard -"@aws-sdk/config-resolver@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/config-resolver@npm:3.329.0" +"@aws-sdk/config-resolver@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/config-resolver@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-config-provider": 3.310.0 - "@aws-sdk/util-middleware": 3.329.0 + "@aws-sdk/util-middleware": 3.342.0 tslib: ^2.5.0 - checksum: c5838c0a60e955cda5fcd91361b168fe1bbedd997c9c4482383c98f2690149114f902d18a26ef3188b62734f2f3754cafed6283d4349d83eeb0d072b081f4ead + checksum: 61ac05c7e1999151b883280055655d59377675a1174c59c08d137f44d481facc0d7a2c612224f329b4fb97b8ff89636376ff03ab4d53b0cc44e0310134991e00 languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.329.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.345.0": + version: 3.345.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.345.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.329.0 - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/client-cognito-identity": 3.345.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: d0d82fbe2cd88862dad13628de417c16c983b8fadd319b3a459d16298a25f90d34d7f054b68a688a292d590b73384d937fac6a1fbb18b77d262c5c5edaf95f94 + checksum: 11ba057d43d1e36d0da8ca4281c381b5059e8c21a309ef4fb910ac44fa02cd8cdcde32a189b07aff7ddaaff1820be0c539010bd5a8644b339e3eda16e14f5a2f languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.329.0" +"@aws-sdk/credential-provider-env@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.342.0" dependencies: - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 12cf04f542c722296adc4e6fbfe63334a60e7b1763b5e1ebfbaafcdcb332555d1f8cf9c855c249b056fb560a008957df4b7fd1551c04a7dbbebc6e3baad89eaa + checksum: 086bde1f5388877e029ba381d44b342dccac2751e1de8a89db301d09f5e36c29bf7bffcb1e2cf66f3935077e22e061eeb35c0c62b587d1763cfdfebfe39e2392 languageName: node linkType: hard -"@aws-sdk/credential-provider-imds@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/credential-provider-imds@npm:3.329.0" +"@aws-sdk/credential-provider-imds@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/credential-provider-imds@npm:3.342.0" dependencies: - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/url-parser": 3.329.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/url-parser": 3.342.0 tslib: ^2.5.0 - checksum: 853b42758e271f85b290aef5d5a2d717b3231016f1541a657408572c4a8fe7f2a209450bc1133715007b895d3c74d065b90a229e31351493bacf368720676471 + checksum: ea6341c9c1c98d164d1cf5f1643c701ef76fa0353659079046045e808964f7f0dfe911c827932ec72182b57781c3cfaaa970a2759657444c0a877b609e93c047 languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.329.0" +"@aws-sdk/credential-provider-ini@npm:3.345.0": + version: 3.345.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.345.0" dependencies: - "@aws-sdk/credential-provider-env": 3.329.0 - "@aws-sdk/credential-provider-imds": 3.329.0 - "@aws-sdk/credential-provider-process": 3.329.0 - "@aws-sdk/credential-provider-sso": 3.329.0 - "@aws-sdk/credential-provider-web-identity": 3.329.0 - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/shared-ini-file-loader": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/credential-provider-env": 3.342.0 + "@aws-sdk/credential-provider-imds": 3.342.0 + "@aws-sdk/credential-provider-process": 3.342.0 + "@aws-sdk/credential-provider-sso": 3.345.0 + "@aws-sdk/credential-provider-web-identity": 3.342.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/shared-ini-file-loader": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 2fe427272d08e1baad780d9b7ce53badf2fa4f58f54f65f6b21ba6e54b32bc908dc18a1e934ba39148f7293f78e6b8009e0c22e503e6f3c2d25b0f2c54534ba7 + checksum: 126aa2ea79b3079802a5ce3b97b2ba24351c662fe0bf66c8f07f47463c88be27a63a76d79f95ab60e04eb74fab07fa11ecc7f3826085612ad663ef809bcbcfbf languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.329.0, @aws-sdk/credential-provider-node@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.329.0" +"@aws-sdk/credential-provider-node@npm:3.345.0, @aws-sdk/credential-provider-node@npm:^3.310.0": + version: 3.345.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.345.0" dependencies: - "@aws-sdk/credential-provider-env": 3.329.0 - "@aws-sdk/credential-provider-imds": 3.329.0 - "@aws-sdk/credential-provider-ini": 3.329.0 - "@aws-sdk/credential-provider-process": 3.329.0 - "@aws-sdk/credential-provider-sso": 3.329.0 - "@aws-sdk/credential-provider-web-identity": 3.329.0 - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/shared-ini-file-loader": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/credential-provider-env": 3.342.0 + "@aws-sdk/credential-provider-imds": 3.342.0 + "@aws-sdk/credential-provider-ini": 3.345.0 + "@aws-sdk/credential-provider-process": 3.342.0 + "@aws-sdk/credential-provider-sso": 3.345.0 + "@aws-sdk/credential-provider-web-identity": 3.342.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/shared-ini-file-loader": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 472bc96b16c589db5e2f938f9f5cc29236ca62186d988b2b06b1bd9378ed681a3e290c9ba4b4adbaabf803e0a1182060df0b5c071ba30a47c8e302f4f55b22a1 + checksum: b869e25f8559eb6476841aeb6d297fb6be360029bcbabc594edc2573b2afc1293dd1895d2f61a6995ee96fea5cd9770297d4bd40f7af252e7e277358116b431b languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.329.0" +"@aws-sdk/credential-provider-process@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.342.0" dependencies: - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/shared-ini-file-loader": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/shared-ini-file-loader": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 198fb80efab5a29ea0d72e96f0f45adbe3532b56deca045c7cc4089bf7a5388f73e340df135525f4392d942e3a1c516d3cd692d4de7f4d4e6ef9241d7470ee7a + checksum: 87936656e9a838971b610ed811fc658ba0b8359f9a87b2d8a4a1f1d8efb47f46c6a5d44f57f282473c6eea3db36f24ce28fb862c6680f96987dfb8792347f7a7 languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.329.0" +"@aws-sdk/credential-provider-sso@npm:3.345.0": + version: 3.345.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.345.0" dependencies: - "@aws-sdk/client-sso": 3.329.0 - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/shared-ini-file-loader": 3.329.0 - "@aws-sdk/token-providers": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/client-sso": 3.345.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/shared-ini-file-loader": 3.342.0 + "@aws-sdk/token-providers": 3.345.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 0c925dc2c5a76606e0338240a1348bce52bee94c6d3f2d7dec179168439857abe0b4c9ff5ab29d59af5af4c7e2228f2ac1dad0f86803f68f1574dbcd9afa96f3 + checksum: 0a7e42c44cb3b5da25c70c17ffbe532aa3edf0995692c137f1072c6cb247efa6557fac64913617a201b518fc57ac6a896240e1af9fa1aee1a63459c5ec5fafce languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.329.0" +"@aws-sdk/credential-provider-web-identity@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.342.0" dependencies: - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: fcbc21976d471999285904cb4924b49d85d846ecc3495a2fc6a5e8ff611765da1fdfd98f5cc828af29e43a0e087c3f49dae0186ef8e43de4afd07bec43c6fc69 + checksum: 19de3af2ee63e9bf9ff88d60c7add38d65b91df043e92281b4ea3caf91184ae9e94d2c890c8a2e38650cfec2d9976d3b03b750e6b3003ea510ae8965e2701452 languageName: node linkType: hard "@aws-sdk/credential-providers@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/credential-providers@npm:3.329.0" + version: 3.345.0 + resolution: "@aws-sdk/credential-providers@npm:3.345.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.329.0 - "@aws-sdk/client-sso": 3.329.0 - "@aws-sdk/client-sts": 3.329.0 - "@aws-sdk/credential-provider-cognito-identity": 3.329.0 - "@aws-sdk/credential-provider-env": 3.329.0 - "@aws-sdk/credential-provider-imds": 3.329.0 - "@aws-sdk/credential-provider-ini": 3.329.0 - "@aws-sdk/credential-provider-node": 3.329.0 - "@aws-sdk/credential-provider-process": 3.329.0 - "@aws-sdk/credential-provider-sso": 3.329.0 - "@aws-sdk/credential-provider-web-identity": 3.329.0 - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/client-cognito-identity": 3.345.0 + "@aws-sdk/client-sso": 3.345.0 + "@aws-sdk/client-sts": 3.345.0 + "@aws-sdk/credential-provider-cognito-identity": 3.345.0 + "@aws-sdk/credential-provider-env": 3.342.0 + "@aws-sdk/credential-provider-imds": 3.342.0 + "@aws-sdk/credential-provider-ini": 3.345.0 + "@aws-sdk/credential-provider-node": 3.345.0 + "@aws-sdk/credential-provider-process": 3.342.0 + "@aws-sdk/credential-provider-sso": 3.345.0 + "@aws-sdk/credential-provider-web-identity": 3.342.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 534ac502c710d23750648166b9a1d51099cc64f23e9fbda586ddbb2cfb6a393b99cd18a0ad5f5f6c431ca106f4e752b2e6bd71ba309b1fb3ca45145c04a90ef7 + checksum: 7b9860d2a374216601e1195db3ae51c44f17c9d1329afb84d2090e3180c61c4f2fe5d56e21168357cd10b48b410ab48441d8fac97b9a899b043715d652f47cf6 languageName: node linkType: hard -"@aws-sdk/eventstream-codec@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/eventstream-codec@npm:3.329.0" +"@aws-sdk/eventstream-codec@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/eventstream-codec@npm:3.342.0" dependencies: "@aws-crypto/crc32": 3.0.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-hex-encoding": 3.310.0 tslib: ^2.5.0 - checksum: c57070e439b8a9009cb11f47b51f233b2fc6cff785a6e8ab869e8d7b299dd358fd14053f943ef14fbf1d4affd7e23de8f976ece09d4b180ca0a053e74724d35b + checksum: 2922d430c6de801e584ff86bc8ee96eb055dbd2509b786c695c8e2f6029e5969d23ab6f815526a81460cbef9b8bf83ed70977855bbfba374e8daaf3043c88431 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-browser@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/eventstream-serde-browser@npm:3.329.0" +"@aws-sdk/eventstream-serde-browser@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/eventstream-serde-browser@npm:3.342.0" dependencies: - "@aws-sdk/eventstream-serde-universal": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/eventstream-serde-universal": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 07d318f9bf41427947dfe885f1fe4b1f2a08934fd43db4c44fd941baf92bb989e8b9e380597e0b7834e3190e697dd72ab2ba5c8fff3437ab84efae3706a5e217 + checksum: 47ded9d3674207946a611ee3f12f7173386ede8d1e60537b1a4782a491ac782e3251fed0096465d307ed0e9597c9d6ace3a7a709b485cd1af8b47abaadfa8006 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-config-resolver@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.329.0" +"@aws-sdk/eventstream-serde-config-resolver@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 51a4c94beffcf74f956f1750a99788fdfd15d1dcddbc5ab2b5c8d0a089a430cad16b2b27515aac84c4dc0ff304a8d69212a2af411e921eb3fd59f49ed3ef7b48 + checksum: c7bac1de5aeedae2393d43d63b87865b9b25b25f56bdd0aeb081490da01b4aa8caecc36a1ded6205b811a8986d7b5a3dd9858eab808c4ccf0f37552d32fffb83 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-node@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/eventstream-serde-node@npm:3.329.0" +"@aws-sdk/eventstream-serde-node@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/eventstream-serde-node@npm:3.342.0" dependencies: - "@aws-sdk/eventstream-serde-universal": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/eventstream-serde-universal": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 398fd78b194eef3a95f84d056d5d1690e0342a3f643aae2ac40465cefa81ff21dcd299d93d53ffbdf22c49807a932c6798d17a913f466f3f7ed4c9b23ea136fa + checksum: 32683ca9a1aaf531bcd27d94f4d5e80d4955dfe426c9d71d60f0a03fdd5ffebd07c44bb4eb5bf1c4302b270abe37c0e8f361aadf77c67ff50b9eac4eef020f70 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-universal@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/eventstream-serde-universal@npm:3.329.0" +"@aws-sdk/eventstream-serde-universal@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/eventstream-serde-universal@npm:3.342.0" dependencies: - "@aws-sdk/eventstream-codec": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/eventstream-codec": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: ffdaa375d9a97079380514849b4f561ba24955da754f5bfebc9406dc43fe93674c0275278d27b2568313056a04be3de6f1783f7a471b501e84736e1f2c95155a + checksum: c7a53aacf39596a98882488d547eb65fd7e40ac56b68f5a2eb0db8a08437c44ad98c75929a2c477b0a26e5ac4ebf3d1bfd712cf31f9d6f379dc00ef2738afe74 languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/fetch-http-handler@npm:3.329.0" +"@aws-sdk/fetch-http-handler@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/fetch-http-handler@npm:3.342.0" dependencies: - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/querystring-builder": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/querystring-builder": 3.342.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-base64": 3.310.0 tslib: ^2.5.0 - checksum: 85795cd97f1538ed4d713b370377667f18bf3ead1326815452b8636e6ae07af3726f75bb95f2ad31d6fa06eb802903344f3413724ca4e593fbe8a05c533c8e52 + checksum: da02fd9ff17e5fefaee3f2a070e13ad105b7bdd194a9e591299b04af556da01024dc8da2c41ef84be0435b68e8f32d88dd67b175c322983d3ed6b1ee5a2b8231 languageName: node linkType: hard -"@aws-sdk/hash-blob-browser@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/hash-blob-browser@npm:3.329.0" +"@aws-sdk/hash-blob-browser@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/hash-blob-browser@npm:3.342.0" dependencies: "@aws-sdk/chunked-blob-reader": 3.310.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 9b8e0a5ae442f0cce372bf79a0e634c6b99eb4fa39cea91bda437de51e4da4fbe288e0229c04f778d865b9281e2e93fbfe0b269a492ecd7285e9f84f3816cb24 + checksum: ebc4e8773e90a8fcf23e04661c91bdcb32b8c05a570ec8572858b9540d8898490401f20b9611a6e8a1c6e520bea499c212874f31810b494b4c348883c93be2cb languageName: node linkType: hard -"@aws-sdk/hash-node@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/hash-node@npm:3.329.0" +"@aws-sdk/hash-node@npm:3.344.0": + version: 3.344.0 + resolution: "@aws-sdk/hash-node@npm:3.344.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-buffer-from": 3.310.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 19f505bc9ef34b15277acb13cfed9f06efc6a4d648df45aed5eb12c0c3566a6338e00bf126081fb5429149c69ba99b9120aebe5940eb91ac7a6686a5f0c9cabf + checksum: 361d96625d39c43a5c1873e4a549014eaeed56a2c1d3c4fa46047610cba9542252f4df5760f802ac268f29fbe1c863d70dbd298b5d0c0ed2dff26073adff9b8f languageName: node linkType: hard -"@aws-sdk/hash-stream-node@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/hash-stream-node@npm:3.329.0" +"@aws-sdk/hash-stream-node@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/hash-stream-node@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 3901b6fa62e9e09a21c16c13f929a401338366c12a0ba695b830a5195859740cc6853cb22cc01c164fbfb9db817dabac2f260033cbb027f506abaae7a499f2c5 + checksum: 812a1c3987219af25073e8cc6bd304b85ea84e170e14b3dcc63c04b2b0b9c35c4b15c6c1194b67872cf113b3307a691d1c27583d0b457717c3abcb22e3c29c5d languageName: node linkType: hard -"@aws-sdk/invalid-dependency@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/invalid-dependency@npm:3.329.0" +"@aws-sdk/invalid-dependency@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/invalid-dependency@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 0e5f122ab2529386f7531bdf1494968264b6e2addd89e484bb3f28ad3bd8d438d381923e61cfd4ea3dfe930982d484541d9b8c562a19de90fec06791d6bcc586 + checksum: 58694fa950beae12bc780687d4dc43bf93bf5764f89c02935fb143d47532ebf8102da854f27aae767399fe507ca76513c625c05cb181935e0579fb35641e2f65 languageName: node linkType: hard @@ -1177,11 +1185,11 @@ __metadata: linkType: hard "@aws-sdk/lib-storage@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/lib-storage@npm:3.329.0" + version: 3.345.0 + resolution: "@aws-sdk/lib-storage@npm:3.345.0" dependencies: - "@aws-sdk/middleware-endpoint": 3.329.0 - "@aws-sdk/smithy-client": 3.329.0 + "@aws-sdk/middleware-endpoint": 3.344.0 + "@aws-sdk/smithy-client": 3.342.0 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 @@ -1189,387 +1197,388 @@ __metadata: peerDependencies: "@aws-sdk/abort-controller": ^3.0.0 "@aws-sdk/client-s3": ^3.0.0 - checksum: 47e3ec6cc4882e6b016c3a161ca0bbfd733f3b6a89a3ee2af80df17ca14113104df79f32d901ce460899da8d01182fc7fddc1ddef3858c5e2020ffa29231ed20 + checksum: 1bece781ac04a3f7e12a0b1831d645f9077416f526dea47f93ca3997d997d154c79951392d2e56006823dd70e99b6d996548a51153d4d506ac33d6937b088791 languageName: node linkType: hard -"@aws-sdk/md5-js@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/md5-js@npm:3.329.0" +"@aws-sdk/md5-js@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/md5-js@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 3471b9c5e62a4c37c609a6575ea521028cd2852bbaf1a55e8d077ed0c4d90c4339e6c6a3015553e9549d1e519ade4d68acc98571a1fa9e880d66c907cfd12977 + checksum: 750dcbac2ce6cb4ec0dc05bf6ee5827b79fea14e64f2826cd20421c1b9460e7d9afe7bf7c7ac48e7b9478d2be00138f5e9127a5f1e9fba398e488318efcd4e10 languageName: node linkType: hard -"@aws-sdk/middleware-bucket-endpoint@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.329.0" +"@aws-sdk/middleware-bucket-endpoint@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.342.0" dependencies: - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-arn-parser": 3.310.0 "@aws-sdk/util-config-provider": 3.310.0 tslib: ^2.5.0 - checksum: bda4e039ee9655d528e6416005bb4efa13e9dcd16a7c16d1693ed7970702bce3c2ff8ea6204a3c090c9881cf7a6ccf2385f44ac9fcc9b8d8addf6a27fa93d56b + checksum: b3d436234049b38af9e0215354787e5262cd5337ef6e4dccd4363fe040b7be82720717270f0803ff3832b0af24abba547df1c1c83e572e8ac82270561d09527a languageName: node linkType: hard -"@aws-sdk/middleware-content-length@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-content-length@npm:3.329.0" +"@aws-sdk/middleware-content-length@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-content-length@npm:3.342.0" dependencies: - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: ffc2f7d2c7b2c7398d54b118c7392816f8e24ac4b350794f0c501a9ca82c67d4b6f90d9442f6ffa71b3e1f75da20b5274390b0a18d8f4adcedf5893251023588 + checksum: 397d211c6497b104457702581b3c8b29afd8dfbc6b07ca49f6c6d57375cb389cfa2c0675af447e635b81843f51382aa550882175d07a8c8c0bf707be7c125b59 languageName: node linkType: hard -"@aws-sdk/middleware-endpoint@npm:3.329.0, @aws-sdk/middleware-endpoint@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-endpoint@npm:3.329.0" +"@aws-sdk/middleware-endpoint@npm:3.344.0, @aws-sdk/middleware-endpoint@npm:^3.310.0": + version: 3.344.0 + resolution: "@aws-sdk/middleware-endpoint@npm:3.344.0" dependencies: - "@aws-sdk/middleware-serde": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/url-parser": 3.329.0 - "@aws-sdk/util-middleware": 3.329.0 + "@aws-sdk/middleware-serde": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/url-parser": 3.342.0 + "@aws-sdk/util-middleware": 3.342.0 tslib: ^2.5.0 - checksum: ed662d778a4ab7b05ee4fba607d6b72e798ee969752fabe2141546a184a71f2daf206a2b8300fa68de0339ebc2646fb8fdf9bf22ebf9cf68495518465c1f1bcc + checksum: 74c8b14104ce6283214d7bb5ce83dc95ccf3e9aec627cb13ee58237d85717d3ed84bffb1d97ba8510e9b154486007cde14a18b0b04592b29ffe4ca19bbcbb46f languageName: node linkType: hard -"@aws-sdk/middleware-expect-continue@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.329.0" +"@aws-sdk/middleware-expect-continue@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.342.0" dependencies: - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 462dd314e80ce17e5975e4b4ce162d41a44691845dfff6b6ae7bd0eb449402bd2d1f93ab577513faf089c9fb193b9a79ccd1ccfb1eb917576e42c2618e4d2ef9 + checksum: aaca4517e61c87775079f7eb673c9474ecd426ca0cbcb8bf891a560518f363de91d0f9ede352d59ec1b1644a789db7a13d79c9ace6e848fc7fc365456dc53309 languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.329.0" +"@aws-sdk/middleware-flexible-checksums@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.342.0" dependencies: "@aws-crypto/crc32": 3.0.0 "@aws-crypto/crc32c": 3.0.0 "@aws-sdk/is-array-buffer": 3.310.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 06a3ca6c7dfd679c092d2f504caf8c72107243efa408f9e04055e4ce74dd32806b5f786f84dd6e9586c4ba92c81f7f3817e7191df45546c775b8f9b682e266f5 + checksum: 31c6a3a01a64420765af3bb5b94f7b096412ad01b746a77b2391dafe9482e2d0b88d01d10be9f4103449c872ddf7411c29434956970112641b0c9fe0227087bc languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.329.0" +"@aws-sdk/middleware-host-header@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.342.0" dependencies: - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: a83d44c24fedf605cfc1b715f5529fc5c424c11ef77a29fa483e390d379a0ca0a4839249d64e71a8a3f096a2ed97ddf95fc8726149bbb9343f50d6522f0ed46b + checksum: eb26b492a2674baabedd96b5ce8152f5f0dab901931b5ae4ef15ad53e59d6967f58c68afe7e7ac53b183d818cc1b5640fd27e7b74b5ecbf7377783d18a35317b languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.329.0" +"@aws-sdk/middleware-location-constraint@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 04565ae85637cec8c2d0fc574479e36cc953c86e9ec22e4ebc22d52b832b2d4e50b71750f72d4ddcabf1ce820ce8edccf9efb5fadcf292e9ad842289d16999c9 + checksum: 7fea65c01b47c7c4b971a6446a1d439d0d914aa160b61ca8aba1ff7ad244d487056a7fd022b9d9a06722d225ef69f08b1994f9ddf9d5eb20f7f66515db5ca040 languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-logger@npm:3.329.0" +"@aws-sdk/middleware-logger@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-logger@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 85031d5d562ae34a550c9ce355cce2e322924dfbb6140e255444056a6f97ab3a98db9d9854572c0d1cf2d73e0e086320a6324cabedac66e975007f1140148c49 + checksum: bada09358137c161d781021336ea988d423f8db067c1eea2942ed7664fdb9ce852a9ee17d3da63a4f3678ff27e789996110848e7043963b771e78505f5cb693e languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.329.0" +"@aws-sdk/middleware-recursion-detection@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.342.0" dependencies: - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 921683327a3047d9fa8c1c027bee44330ae769a45bdd205a7a5d1a262fde09c404c574a60497e87987f01670daf56b2e0084fdacded87270917f04e99ac437a4 + checksum: 4871056c3a8e3c9de17f59f946bfdcad85a5ee9f16cf96914fc0dfe6e2aa9e850e688dc4cfcb908eee0afe9591b6092b3dfb7d3bc3c1fac25f6cd4c6c83ac4d3 languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-retry@npm:3.329.0" +"@aws-sdk/middleware-retry@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-retry@npm:3.342.0" dependencies: - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/service-error-classification": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/util-middleware": 3.329.0 - "@aws-sdk/util-retry": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/service-error-classification": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/util-middleware": 3.342.0 + "@aws-sdk/util-retry": 3.342.0 tslib: ^2.5.0 uuid: ^8.3.2 - checksum: 1c3eed0037a06c5201a8c102c1d5b946571a8085bde0ccc9fafb3c62343414383ee94883c07e7b2e4e870852a7a54798e1cbaeda17062d7a4b7178f6355f3119 + checksum: 066268ccab655680b75865c8c47beb19f269d5b3bc14d85c4f6c53af9a4fac50f9b7c2f7bc0ca93fcb4b3f9bbb5d14b89c21bf855504e90b9a86cd370d4f8e0b languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.329.0" +"@aws-sdk/middleware-sdk-s3@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.342.0" dependencies: - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-arn-parser": 3.310.0 tslib: ^2.5.0 - checksum: 4de1fc7b4ac6b01c3e65ee8e25151b73d3f78d5ac3949d799b10252a42a8b55bb00242822757bbc790dde545745fb8d2f83feb09442eec83846c431d98aeab27 + checksum: 5bf9789bc3e745ac754829d1e0dc6bb6fef7659cacfa38d41bd97df2b5357dbc5429defdb32e6b7fe0e27bc75ed9f04ebb1e42045b5a77e7f132f923d8287ccb languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sqs@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.329.0" +"@aws-sdk/middleware-sdk-sqs@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-hex-encoding": 3.310.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 77faadbf799b37ac036cba465174cabbc5557aa59944c20d05b8253e54266aed7846bf6135f7b7f0ab183da555ba255782e257a3d4364a3ffe0efe6ea738f97a + checksum: 450d44dd0b66da4137a7c2cf96c0a5de88c40b0dd8281cddc90d7ea42ee54c8690243ae95584273de1c5d591149ca0f34c4da575467b01c85479395c3f7fa9cd languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sts@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-sdk-sts@npm:3.329.0" +"@aws-sdk/middleware-sdk-sts@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-sdk-sts@npm:3.342.0" dependencies: - "@aws-sdk/middleware-signing": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/middleware-signing": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 0c5450726c546f6f4b3de50e1a9a1757ca267f6fece5ef3dcf1560955eea885d0476debbce0d3f67290db77e7b894a386f5822b7d5bde8d9bcfea5af94735918 + checksum: 404e122a0d2d9ed6530a57fbd576f9085781bf57476cafd57ef048a49120cb7bcc24849d5337c5b7578f3bf1ba1825cb6282bdf13545e12dac26611b841f67a0 languageName: node linkType: hard -"@aws-sdk/middleware-serde@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-serde@npm:3.329.0" +"@aws-sdk/middleware-serde@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-serde@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 29b72c582f6c783396e6e7a5a9bd6416ceebb18a15b55187267cdb3e2a6f18e2395d2aafdbeedeedce8c014b0d7fbd40d151accc1e409fe8741cee346b0c9ce1 + checksum: 10bff04ba1e31b9a7da311bd509459ad6a45f78aca817c0c436f9b2cde1f5f439a1f089d29cb741141815b9a0bee8a680efa25d5a9e900a079a415acf3cd8602 languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-signing@npm:3.329.0" +"@aws-sdk/middleware-signing@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-signing@npm:3.342.0" dependencies: - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/signature-v4": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/util-middleware": 3.329.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/signature-v4": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/util-middleware": 3.342.0 tslib: ^2.5.0 - checksum: 6dad12d4e3cfad3dd508ad2177da3ec5d54015d606c670999659c21dfaaf41b1cbb52c92704a9ecf0f82e322ae9f62a0639c2e3cf1b201c08d78b99638abdd1c + checksum: d07d718331d63732a4ad55bf580eb20375622f86fe05db3eecc874936e754c16a681951c00d206c30e9a4af84dd31805a72de55d0c67fe80b859c91d192342d5 languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.329.0" +"@aws-sdk/middleware-ssec@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-ssec@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 819623a8a3a8d3518fcc194025a470a06d0b6889cb88f165a7f49aea6b1e4396effe448ac94b8a27928aca8752502960d6899a5597f293f0542ee9d0e5a872da + checksum: 4c85be245737ee4f36b609bb9ba6add5d0c53238694e1772a4a05abebe3f6db5b853230021d8ce592c824c1dc23b84c06d2dd70b32d1ebf9cb17dbc059f5b368 languageName: node linkType: hard -"@aws-sdk/middleware-stack@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-stack@npm:3.329.0" +"@aws-sdk/middleware-stack@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/middleware-stack@npm:3.342.0" dependencies: tslib: ^2.5.0 - checksum: 34b2ac02f8bd21a6803064de8059a866aa776c8a7962d40e11d072801291b9f5e78daac5adf91931ca1d19b11e2e972467c6b9679bf7c049b5f63ce50eb214d9 + checksum: 8cd077f7e60f9ceb57eba0f0766e5784ced7bb959dfeebb4491a948006052da1d1a99a98795146a80424b00f3f6874f85bdb94419a1e1d510227f739886f90a2 languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.329.0" +"@aws-sdk/middleware-user-agent@npm:3.345.0": + version: 3.345.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.345.0" dependencies: - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/types": 3.329.0 - "@aws-sdk/util-endpoints": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/types": 3.342.0 + "@aws-sdk/util-endpoints": 3.342.0 tslib: ^2.5.0 - checksum: 6241246ea640bbe23148fa632e6735f6f25c3e1d32d01bcc21e733b2c11aba4c899acfe9982d98eab4d0dcddc451d60c8d6710ed1240e61ad428df24d10cc64e + checksum: c2e057bbf31e6365d351dbfb007dbaebda8fc5fb5194e1314b32e474c103b09756eb5fdcbd15f5eb6a9e6e80a19a16136ad4111d63685430f93039ff6edab76a languageName: node linkType: hard -"@aws-sdk/node-config-provider@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/node-config-provider@npm:3.329.0" +"@aws-sdk/node-config-provider@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/node-config-provider@npm:3.342.0" dependencies: - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/shared-ini-file-loader": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/shared-ini-file-loader": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 25178c8857f48931079b204e2c904f7960edbae2a34bb6ccb8f27991d807a61e05dcf42cad4bb56cb98c5c12aedebea58a840b3bea30a06c174cb6758b03e2d5 + checksum: b52f42d898e42683493fbda9a50437529bbfbc46d0b12deddbdd0976f05a278a9303de2abe01573c86cf423d37b88881097c7c543c695ab5495e58be99119bfa languageName: node linkType: hard -"@aws-sdk/node-http-handler@npm:3.329.0, @aws-sdk/node-http-handler@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/node-http-handler@npm:3.329.0" +"@aws-sdk/node-http-handler@npm:3.344.0, @aws-sdk/node-http-handler@npm:^3.310.0": + version: 3.344.0 + resolution: "@aws-sdk/node-http-handler@npm:3.344.0" dependencies: - "@aws-sdk/abort-controller": 3.329.0 - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/querystring-builder": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/abort-controller": 3.342.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/querystring-builder": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 0560640be504cbe1f4d5098cdef917085472f476487d2fcd5225ab67063dca53718a30d48cb255790d327356f8b544bba491175dd2d6c9b8319327f5204909ae + checksum: 268ad90f1adfd20a33b61542b1c7c03528dee4dd9eaa07e42120c5c6e2e165c8e9b05e2356410600d5ef62d1e316885d13de81b0c257eb5500a82903abe05a69 languageName: node linkType: hard -"@aws-sdk/property-provider@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/property-provider@npm:3.329.0" +"@aws-sdk/property-provider@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/property-provider@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 17c8cb7d28b55ff9ba1f81da87dff42815919c6458eec422d1a45d7d809f7ee531e7b5daeb2bb63eab569eb12c0d6bce270a66e060c8c19d841d1894211f6dfd + checksum: 22a1d5f1883627e431e0523650877447ad8ebe57e39d1e798ee7870f7dcc0fe8013b958621b30373b5362326e3eafc00716eefe4f42b0d8f435968698d1694d6 languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/protocol-http@npm:3.329.0" +"@aws-sdk/protocol-http@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/protocol-http@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 6b88be86283c67fd6fc9c3f8260c02e916f6f9b4c2a554a261809d6e48ef3dbae0a6c02ecde90cbfcd77f8066dbb37c2263e22fbeb20c2a5ac19e3ffc2582b67 + checksum: f6910fa4880780d224cb5f78eb501cbc900a51b33be4727e734f2ea63e3bbdc7d581bf53e77ba3fa3a569055ba261750d0623e5c95b5ad510d11b4959166b00d languageName: node linkType: hard -"@aws-sdk/querystring-builder@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/querystring-builder@npm:3.329.0" +"@aws-sdk/querystring-builder@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/querystring-builder@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-uri-escape": 3.310.0 tslib: ^2.5.0 - checksum: 188a3e6ee142af8ec8fa6563db831e70069a4f94487f25b02da608fe569d881c4b696abff8bbf98ff154107ed4b57170f1b6633ec55a7ddbffabb3cd745c243f + checksum: 801e5b4230024fa08244b78b96a96df62f1bbe681b3e3eb4694d4fa21bf59e732547d63a1636cc14cc5feb5e8d854497acea15cd826cbe68ea89abc6933f84fa languageName: node linkType: hard -"@aws-sdk/querystring-parser@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/querystring-parser@npm:3.329.0" +"@aws-sdk/querystring-parser@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/querystring-parser@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: eebb633db0bf9d9a3854ab2f83526468b430f57fb8b5cd2c737683facf717d96876acb4a837e17235458e728ebf375a26321ea6dd4dc07f5eb9eaa6e4efad1b5 + checksum: 248b5b855eed52957cf3d2113ce57205723ecf1f378d211c79eb6209e68d8c4994c537bc4ff40695496f69b5337359d8de63825978e7570aa2e9cc76222c9e95 languageName: node linkType: hard -"@aws-sdk/service-error-classification@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/service-error-classification@npm:3.329.0" - checksum: 77b19ffd3fa926b3e4b5f5aee64ff3159af6fa7c9f3a643fe7505690a2bd7d67e2ff8790ea3be21458c95c0eeb65687e4dd01140c352d170549368c0ff908936 +"@aws-sdk/service-error-classification@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/service-error-classification@npm:3.342.0" + checksum: c7cf32ac7eb745db8e54ce1cd66618b10e321f814e406944b46692ea3b76778e43a90c9c9febfaed05049a426526e0820385d71d9868f227e23cb1dc5c719b48 languageName: node linkType: hard -"@aws-sdk/shared-ini-file-loader@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/shared-ini-file-loader@npm:3.329.0" +"@aws-sdk/shared-ini-file-loader@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/shared-ini-file-loader@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: ee5e57d38a17eb4ebb073daa3e1f91bf07c3a5746410470a628765e0b49176ac880a86b6e09279137fdda7a44a38666cb311fd3ed523d9a3c4d4766d1ebeeb7e + checksum: 252c1f2f75a7bc2c135e8a1da5d6cf27353a5fdc5d57b9440b0546cece3b27d498621d07a100e741ff2037df9423e8cd9225f65bb89537da9cb01bb4711a4cb9 languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.329.0" +"@aws-sdk/signature-v4-multi-region@npm:3.344.0": + version: 3.344.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.344.0" dependencies: - "@aws-sdk/protocol-http": 3.329.0 - "@aws-sdk/signature-v4": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/protocol-http": 3.342.0 + "@aws-sdk/signature-v4": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 peerDependencies: "@aws-sdk/signature-v4-crt": ^3.118.0 peerDependenciesMeta: "@aws-sdk/signature-v4-crt": optional: true - checksum: c9ae1a68919674b6444cdb64e865e08b72f6a6127c7f43bffbbfb7457d48efc9ea5c89e58e5e451d1ec28c0d735969e4985fee25a7bca5b9949264d8de2763fc + checksum: d8adf704643bd50a99f6f812e989677152b6d8ae4f39ecae959b0cd9446fdb06f10911ea8fd30793743af4c3f642f3986b122c206ff016de2a009da8c3b466fd languageName: node linkType: hard -"@aws-sdk/signature-v4@npm:3.329.0, @aws-sdk/signature-v4@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/signature-v4@npm:3.329.0" +"@aws-sdk/signature-v4@npm:3.342.0, @aws-sdk/signature-v4@npm:^3.310.0": + version: 3.342.0 + resolution: "@aws-sdk/signature-v4@npm:3.342.0" dependencies: + "@aws-sdk/eventstream-codec": 3.342.0 "@aws-sdk/is-array-buffer": 3.310.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-hex-encoding": 3.310.0 - "@aws-sdk/util-middleware": 3.329.0 + "@aws-sdk/util-middleware": 3.342.0 "@aws-sdk/util-uri-escape": 3.310.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 8bf81f260f8a6a75e43f172bc049b777d081ca75e8456b21331895c0dba2486b804a8e7aed12ebb178e421aacc515fc873141682d7100c045da60b9425b9c432 + checksum: ab251dc6ad546beb1129abbd9dfdf8637da82cf54e14dd7cff9e026d62a428d511065a36604609963a028c2a04140d4c96746e3d3da50a441f0baf5d431a7fa8 languageName: node linkType: hard -"@aws-sdk/smithy-client@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/smithy-client@npm:3.329.0" +"@aws-sdk/smithy-client@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/smithy-client@npm:3.342.0" dependencies: - "@aws-sdk/middleware-stack": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/middleware-stack": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 4235822be0165c44f780a704da01581c8f8476c6a11e2b421d6fa003a30e9ab3bb37c02289b5678194f6d89304b1a576a1fc79b646ac0c58b482f70ea24a4b16 + checksum: af79f4ec9bce5cda76154839f5f2ce24268cc4ec8f496aa5b9a8ff632f88675dc7015363cd57b397691df4de417cc05d706cf7b0c6ae02c686d42e95f204133d languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/token-providers@npm:3.329.0" +"@aws-sdk/token-providers@npm:3.345.0": + version: 3.345.0 + resolution: "@aws-sdk/token-providers@npm:3.345.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.329.0 - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/shared-ini-file-loader": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/client-sso-oidc": 3.345.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/shared-ini-file-loader": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 87d1e4a13ce0cc4af50d4e1d5006967da69d5d1f384edaeea0057ca0a8f3397706934fea152d5f83d7be3c68c9a12c04edb2dbb0558b42cf200066f7d56643a8 + checksum: d9d7d446cdec152e60087e1bac5f123ccb8555b1f4802ed10a522f60eaa716785882fa650fe67ac24bcb153eba2c104a19784b2b4408541ba6e9cfe5e68a5d83 languageName: node linkType: hard -"@aws-sdk/types@npm:3.329.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/types@npm:3.329.0" +"@aws-sdk/types@npm:3.342.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.310.0": + version: 3.342.0 + resolution: "@aws-sdk/types@npm:3.342.0" dependencies: tslib: ^2.5.0 - checksum: 2bbcd8e6ba2f813dc220c60e7ac0fa0d0990d49f88030fd8235479586716016c8f9d7aeaf1f4c1a64694275f33690bd1dd4ed46e127983201061e063da73f426 + checksum: c9ec0873304548696deb604fcc4fcdacb726c9e03a65cdb4e9d8643a24ddf83ea32aa9d85b801406670526ca210131d5a8842d3674c73757c03ca5329ed2d13a languageName: node linkType: hard -"@aws-sdk/url-parser@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/url-parser@npm:3.329.0" +"@aws-sdk/url-parser@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/url-parser@npm:3.342.0" dependencies: - "@aws-sdk/querystring-parser": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/querystring-parser": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: d5640fb2c21ebca56904641204bd51bb14b9d7cc1ae76860ce2e7d51cf5c1e76b09eefb98678d67651de2773a7137509017f22a93c8f2e7451666e10100072ec + checksum: d5c1b23cc3f110ac2acc47c7777911d362bf674ba5226b82b8f8c73c25e45bc56ad5060169821af88890d8d9cc02963d0af0e7574f9a283fc6987f7f8672f7bf languageName: node linkType: hard @@ -1629,39 +1638,39 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-browser@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.329.0" +"@aws-sdk/util-defaults-mode-browser@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.342.0" dependencies: - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/types": 3.342.0 bowser: ^2.11.0 tslib: ^2.5.0 - checksum: 217995ed68d7af117a0efa163ec22b0ee1700d4d1a3f4a1a950298e239788743886453dfb91f07c2b6c341497d489cae142872e629f6701c65d689132527be0d + checksum: 96ff9723313dd331679e311f2e534914e4348b9729c19dce666c766e19a847eaea293d55bfbbda00c42eef127a5816aa6501cc4882be49c24470ab0285e3bff1 languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.329.0" +"@aws-sdk/util-defaults-mode-node@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/util-defaults-mode-node@npm:3.342.0" dependencies: - "@aws-sdk/config-resolver": 3.329.0 - "@aws-sdk/credential-provider-imds": 3.329.0 - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/property-provider": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/config-resolver": 3.342.0 + "@aws-sdk/credential-provider-imds": 3.342.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/property-provider": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 8b727977205638940da63fe3a4a88862d7a9491c3409543e67a7a9ee071f4c2459d24ca2e078a412710a5fa2146f6644356fbda69b9f3a9046c7d65f14902b8d + checksum: b255d8039e56b6ad4264bc2615a995804e3cf565ee36876f05491fbd795f5e0c3c4af3bd7e42c00d08cc68311694e60942a363fa2db6a4228447827d9f36455a languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/util-endpoints@npm:3.329.0" +"@aws-sdk/util-endpoints@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/util-endpoints@npm:3.342.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 6d7c8bcd6a8a14d8597a77799d25fb36a79c0d4453f11257f1964e3230b26d46145a7c98d037f9b238100205733f6e15beb48887a85a52715aa120dbcf02cc69 + checksum: eb9443651d620ff6fd13b2e2cd7cf85f9e40672d385e12d63502bc903e5cd1e6887142d6ca4e2f9fd56cc07cbf1777bf0a356a0dc62143104bbe35352add7003 languageName: node linkType: hard @@ -1683,48 +1692,48 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-middleware@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/util-middleware@npm:3.329.0" +"@aws-sdk/util-middleware@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/util-middleware@npm:3.342.0" dependencies: tslib: ^2.5.0 - checksum: 23bc1ab195d31871edb2a7c9b3772911e881a39d70dfacedcf6e0308cbe95ec0ccb09f5f41f52458bff621d8e44dd3a4c94336da213d6d8074ffa0c0e334fad2 + checksum: b668e04eff6e54b3d2e1f410d1b18244fc1aecb9c6d231f95971c6798393c5a00e139cbd30da08f82226af9ea96addb3a8d96a2612e2e338975495d03c100426 languageName: node linkType: hard -"@aws-sdk/util-retry@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/util-retry@npm:3.329.0" +"@aws-sdk/util-retry@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/util-retry@npm:3.342.0" dependencies: - "@aws-sdk/service-error-classification": 3.329.0 + "@aws-sdk/service-error-classification": 3.342.0 tslib: ^2.5.0 - checksum: 56b5c3567f4b32d37faf93f69c7ca519a5300838065b896fdc291dbdd85e17551e00d44f536fb859e648ff2db2f1fb7176bc46aa2c44e5a947a3dd99b61f642e + checksum: 89f730fcf8dce43e6d426fd2d00b48eca1d8935ecc2ee7f07cc93d18cff82bc50a29f6ff536b2f570ed604f4df3044e53e82d84a5cdf37f08ccc0e43e4c9ff87 languageName: node linkType: hard -"@aws-sdk/util-stream-browser@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/util-stream-browser@npm:3.329.0" +"@aws-sdk/util-stream-browser@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/util-stream-browser@npm:3.342.0" dependencies: - "@aws-sdk/fetch-http-handler": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/fetch-http-handler": 3.342.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-hex-encoding": 3.310.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: a3451714c437c7a33aefa52e37182d58d7ff8e632f1243ec40bba6a352a7e9a7c58fc8cb2f4ba68b969aadbae08290e7506b8c0762080e3502427d8c747f7644 + checksum: 5d6e6cda660001c82abcddc002a164db79ae69da92d6d7b94ad57a09a2147c32d21deb59973e4bad787a2faca831fd0e2f58f4f619e4e953a591ee7c02dafe44 languageName: node linkType: hard -"@aws-sdk/util-stream-node@npm:3.329.0, @aws-sdk/util-stream-node@npm:^3.310.0": - version: 3.329.0 - resolution: "@aws-sdk/util-stream-node@npm:3.329.0" +"@aws-sdk/util-stream-node@npm:3.344.0, @aws-sdk/util-stream-node@npm:^3.310.0": + version: 3.344.0 + resolution: "@aws-sdk/util-stream-node@npm:3.344.0" dependencies: - "@aws-sdk/node-http-handler": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/node-http-handler": 3.344.0 + "@aws-sdk/types": 3.342.0 "@aws-sdk/util-buffer-from": 3.310.0 tslib: ^2.5.0 - checksum: 67e018f8a9ad7da48ceaed48419580e017d91743de3872c9a23900e104651029261d70faed4b7cf479d2c0902297d3c7385ea3393af7798d2e6a88e037a259fc + checksum: 9cdfcf50742078d22c7ba52e09e6ce4d1b41610be5658a1154dcf04ca020583596d5a6525025d639a08e83531580e54ad9de3a0e4b03d3eb43aca6fc18a1d440 languageName: node linkType: hard @@ -1737,30 +1746,30 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.329.0" +"@aws-sdk/util-user-agent-browser@npm:3.345.0": + version: 3.345.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.345.0" dependencies: - "@aws-sdk/types": 3.329.0 + "@aws-sdk/types": 3.342.0 bowser: ^2.11.0 tslib: ^2.5.0 - checksum: ced136d39db2eaa62621819025df1c881e909e37826322ad5d5cb78d51d8e866f88ac1fe90857543a8f7f1fa1111d50bd369fa49495e465a167769935410df45 + checksum: fcab0d5789aea04ec6f5d2ecdb09ab976de7404e3ed9c0fc553caf098bb823c1c969b1215e15f65f8ad545722334b9e5b172670d817e412e053d96d7a0859cb7 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.329.0" +"@aws-sdk/util-user-agent-node@npm:3.345.0": + version: 3.345.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.345.0" dependencies: - "@aws-sdk/node-config-provider": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/node-config-provider": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: 33fae730d0cdb0743af867373f58201c5aea8e48a0f449c9df19c08269cc18fc4b523e481895e4ba5b2a43446ec417f12691249e8b0339c30849473f5f36085f + checksum: d4b24bed46b40a92a54b48d5b67f55e3573d4dcaf1908c99fd26c72515a910f45259dd4811605a45733b78a7eba49b950766622a3407cc40bba31ba2817319d2 languageName: node linkType: hard @@ -1783,14 +1792,14 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-waiter@npm:3.329.0": - version: 3.329.0 - resolution: "@aws-sdk/util-waiter@npm:3.329.0" +"@aws-sdk/util-waiter@npm:3.342.0": + version: 3.342.0 + resolution: "@aws-sdk/util-waiter@npm:3.342.0" dependencies: - "@aws-sdk/abort-controller": 3.329.0 - "@aws-sdk/types": 3.329.0 + "@aws-sdk/abort-controller": 3.342.0 + "@aws-sdk/types": 3.342.0 tslib: ^2.5.0 - checksum: 41f8796c3649313dee3cbc5a643c9bc1d23a54e35a990c41875a3397f18c57844a68e2f0efb585548f88f6047b7e2c31db8c833481839788cee3024bc92aad81 + checksum: b3f5f3747ffb8bd8323cf57043ec8ed8a2633257deb8113ff9da1cd882a61770ef1d7066e14cfd577c6e83d9de3f24188ab7eb140be951c76260cba05d5bbe70 languageName: node linkType: hard @@ -1978,6 +1987,30 @@ __metadata: languageName: node linkType: hard +"@azure/identity@npm:^3.2.1": + version: 3.2.2 + resolution: "@azure/identity@npm:3.2.2" + dependencies: + "@azure/abort-controller": ^1.0.0 + "@azure/core-auth": ^1.3.0 + "@azure/core-client": ^1.4.0 + "@azure/core-rest-pipeline": ^1.1.0 + "@azure/core-tracing": ^1.0.0 + "@azure/core-util": ^1.0.0 + "@azure/logger": ^1.0.0 + "@azure/msal-browser": ^2.32.2 + "@azure/msal-common": ^9.0.2 + "@azure/msal-node": ^1.14.6 + events: ^3.0.0 + jws: ^4.0.0 + open: ^8.0.0 + stoppable: ^1.1.0 + tslib: ^2.2.0 + uuid: ^8.3.0 + checksum: cbedd293ed6360d98c87148686a1be3a38aad3eaeadcaa7d73e79469904aac2f949a1be67e868d3fd295e749a24ad91bc389ddb82d8574dd173c0583767ec6bf + languageName: node + linkType: hard + "@azure/logger@npm:^1.0.0": version: 1.0.1 resolution: "@azure/logger@npm:1.0.1" @@ -2015,16 +2048,23 @@ __metadata: languageName: node linkType: hard -"@azure/msal-browser@npm:^2.26.0": - version: 2.27.0 - resolution: "@azure/msal-browser@npm:2.27.0" +"@azure/msal-browser@npm:^2.26.0, @azure/msal-browser@npm:^2.32.2": + version: 2.37.0 + resolution: "@azure/msal-browser@npm:2.37.0" dependencies: - "@azure/msal-common": ^7.1.0 - checksum: 6cafb4d41a92f1bbb82e7128f64ccd6538ec116a2521f412108d94c4173601d31ea62febb7b22206dcae691e6a01cf7f9ce92793420599437b50a24c7e6ab851 + "@azure/msal-common": 13.0.0 + checksum: e57d04517d51db4b608da6ca127c89e5c134b42743b00e95d8f1aae011d1cc6d5c02fb4f72cd0f96636e500a3eeee7c4884cd537ac8796bbd50f0ff9ac983b4e languageName: node linkType: hard -"@azure/msal-common@npm:^7.0.0, @azure/msal-common@npm:^7.1.0": +"@azure/msal-common@npm:13.0.0": + version: 13.0.0 + resolution: "@azure/msal-common@npm:13.0.0" + checksum: 89f56f9fbf0edffa6023d46c6970dd37a9ad571b7d2952fdef41950ec2f3b4b3fd22d9841e2caaf52619ad97ab415ed22c30797cdb896f459eb665d3d97f778a + languageName: node + linkType: hard + +"@azure/msal-common@npm:^7.0.0": version: 7.1.0 resolution: "@azure/msal-common@npm:7.1.0" checksum: 761a8b9363c7b620d831aba7d7e7a66e341685e306034b027b57dc31dae11abdf86c3187c08fc8008448c845ffdcbbc42c767c75355625cf87aba25ba7e2832e @@ -2038,14 +2078,14 @@ __metadata: languageName: node linkType: hard -"@azure/msal-node@npm:^1.10.0": - version: 1.14.6 - resolution: "@azure/msal-node@npm:1.14.6" +"@azure/msal-node@npm:^1.10.0, @azure/msal-node@npm:^1.14.6": + version: 1.17.2 + resolution: "@azure/msal-node@npm:1.17.2" dependencies: - "@azure/msal-common": ^9.0.2 + "@azure/msal-common": 13.0.0 jsonwebtoken: ^9.0.0 uuid: ^8.3.0 - checksum: 7fb2085fe772474bb4c6c1e0a2467da6b2380dfa66f7c67f63d4a8774f591744dc64a6f3337d43c810ff433bc327be470ece59dcd0fa7aff4459e32beb4c738b + checksum: 5ac809dae6b02ab7de2aafb85733501ba6c3268f1d9371bc857215dad9d47e4f6e10b3e58ebda49504b375c96934761e9734acc241d3bc34d3b4cdeaabdf102e languageName: node linkType: hard @@ -3810,7 +3850,22 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@^1.1.5, @backstage/catalog-model@^1.3.0, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@npm:^1.1.5, @backstage/catalog-model@npm:^1.3.0": + version: 1.3.0 + resolution: "@backstage/catalog-model@npm:1.3.0" + dependencies: + "@backstage/config": ^1.0.7 + "@backstage/errors": ^1.1.5 + "@backstage/types": ^1.0.2 + ajv: ^8.10.0 + json-schema: ^0.4.0 + lodash: ^4.17.21 + uuid: ^8.0.0 + checksum: 728cc73f0e68453eba15db7fb54c6a3c44cb4a511fb65542302b285e5e8d6385332d27c681af5352bb31659e08b7f0899635ea9800a49c288707fc03031c7234 + languageName: node + linkType: hard + +"@backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": version: 0.0.0-use.local resolution: "@backstage/catalog-model@workspace:packages/catalog-model" dependencies: @@ -3859,6 +3914,7 @@ __metadata: resolution: "@backstage/cli@workspace:packages/cli" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/catalog-model": "workspace:^" "@backstage/cli-common": "workspace:^" "@backstage/cli-node": "workspace:^" "@backstage/config": "workspace:^" @@ -3869,12 +3925,15 @@ __metadata: "@backstage/dev-utils": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/eslint-plugin": "workspace:^" + "@backstage/integration": "workspace:^" "@backstage/release-manifests": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@backstage/types": "workspace:^" "@esbuild-kit/cjs-loader": ^2.4.1 "@manypkg/get-packages": ^1.1.3 + "@octokit/graphql": ^5.0.0 + "@octokit/graphql-schema": ^13.7.0 "@octokit/oauth-app": ^4.2.0 "@octokit/request": ^6.0.0 "@pmmmwh/react-refresh-webpack-plugin": ^0.5.7 @@ -3941,6 +4000,7 @@ __metadata: express: ^4.17.1 fork-ts-checker-webpack-plugin: ^7.0.0-alpha.8 fs-extra: 10.1.0 + git-url-parse: ^13.0.0 glob: ^7.1.7 global-agent: ^3.0.0 handlebars: ^4.7.3 @@ -4277,7 +4337,26 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@^1.5.0, @backstage/core-plugin-api@^1.5.1, @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, @backstage/core-plugin-api@npm:^1.5.1": + version: 1.5.1 + resolution: "@backstage/core-plugin-api@npm:1.5.1" + dependencies: + "@backstage/config": ^1.0.7 + "@backstage/types": ^1.0.2 + "@backstage/version-bridge": ^1.0.4 + "@types/react": ^16.13.1 || ^17.0.0 + history: ^5.0.0 + prop-types: ^15.7.2 + 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 + checksum: 59d75c906040ddd436135ab8a281792aec5cf5432f573b1273dba9c0b8b6f35861a899e17cc62417fe596d46903fc5807e632e49c5a8e43d866c639d71c0b86c + 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: @@ -4365,7 +4444,18 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@^1.1.5, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": +"@backstage/errors@npm:^1.1.5": + version: 1.1.5 + resolution: "@backstage/errors@npm:1.1.5" + dependencies: + "@backstage/types": ^1.0.2 + cross-fetch: ^3.1.5 + serialize-error: ^8.0.1 + checksum: fb8cc933345511454f31d899fed113cb28ab90ad0fbfaf5fd12d1e1204a0c52cd45bdc897feae70cc90ce0fa6cd331542036f2a4cb82ee0c935c3d0a687d6ee0 + languageName: node + linkType: hard + +"@backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" dependencies: @@ -4458,10 +4548,27 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration@^1.4.5, @backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": +"@backstage/integration@npm:^1.4.5": + version: 1.4.5 + resolution: "@backstage/integration@npm:1.4.5" + 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: 71e7c5d884ae36a7dc8592dea7dd2e8140f3761ff1c499da2b97a8fbee39ff25012021f0097bbedb728b34b4339a0719086f13f0afd6c5992042081f7733d22c + 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: + "@azure/identity": ^3.2.1 "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/config-loader": "workspace:^" @@ -4513,10 +4620,11 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/integration": "workspace:^" "@backstage/plugin-search-common": "workspace:^" + front-matter: ^4.0.2 languageName: unknown linkType: soft -"@backstage/plugin-adr@workspace:plugins/adr": +"@backstage/plugin-adr@workspace:^, @backstage/plugin-adr@workspace:plugins/adr": version: 0.0.0-use.local resolution: "@backstage/plugin-adr@workspace:plugins/adr" dependencies: @@ -5563,6 +5671,19 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-catalog-backend-module-unprocessed@workspace:^, @backstage/plugin-catalog-backend-module-unprocessed@workspace:plugins/catalog-backend-module-unprocessed": + version: 0.0.0-use.local + resolution: "@backstage/plugin-catalog-backend-module-unprocessed@workspace:plugins/catalog-backend-module-unprocessed" + dependencies: + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/catalog-model": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" + express-promise-router: ^4.1.1 + knex: ^2.4.2 + languageName: unknown + linkType: soft + "@backstage/plugin-catalog-backend@workspace:^, @backstage/plugin-catalog-backend@workspace:plugins/catalog-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend@workspace:plugins/catalog-backend" @@ -5578,6 +5699,7 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" @@ -5621,7 +5743,18 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@^1.0.10, @backstage/plugin-catalog-common@^1.0.13, @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.13": + version: 1.0.13 + resolution: "@backstage/plugin-catalog-common@npm:1.0.13" + dependencies: + "@backstage/catalog-model": ^1.3.0 + "@backstage/plugin-permission-common": ^0.7.5 + "@backstage/plugin-search-common": ^1.2.3 + checksum: 2e7de3a1be8ac4ac823bf200d8f1f10a3353ed873caa4534cdb5f0e328716f79d431aee39b8d7dbe67554c302b1252e6c14ea1aa35d1dca6a4c5e5db27baafa4 + 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: @@ -5844,6 +5977,34 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-catalog-unprocessed-entities@workspace:^, @backstage/plugin-catalog-unprocessed-entities@workspace:plugins/catalog-unprocessed-entities": + version: 0.0.0-use.local + resolution: "@backstage/plugin-catalog-unprocessed-entities@workspace:plugins/catalog-unprocessed-entities" + dependencies: + "@backstage/catalog-model": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/core-app-api": "workspace:^" + "@backstage/core-components": "workspace:^" + "@backstage/core-plugin-api": "workspace:^" + "@backstage/dev-utils": "workspace:^" + "@backstage/errors": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/theme": "workspace:^" + "@material-ui/core": ^4.9.13 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": ^4.0.0-alpha.60 + "@testing-library/jest-dom": ^5.10.1 + "@testing-library/react": ^12.1.3 + "@testing-library/user-event": ^14.0.0 + "@types/node": "*" + cross-fetch: ^3.1.5 + msw: ^1.0.0 + react-use: ^17.2.4 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + languageName: unknown + linkType: soft + "@backstage/plugin-catalog@workspace:^, @backstage/plugin-catalog@workspace:plugins/catalog": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog@workspace:plugins/catalog" @@ -5860,6 +6021,7 @@ __metadata: "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-permission-react": "workspace:^" + "@backstage/plugin-scaffolder-common": "workspace:^" "@backstage/plugin-search-common": "workspace:^" "@backstage/plugin-search-react": "workspace:^" "@backstage/test-utils": "workspace:^" @@ -6064,7 +6226,7 @@ __metadata: supertest: ^6.1.6 uuid: ^8.3.2 winston: ^3.2.1 - xml2js: ^0.5.0 + xml2js: ^0.6.0 yn: ^4.0.0 languageName: unknown linkType: soft @@ -7172,7 +7334,7 @@ __metadata: "@backstage/test-utils": "workspace:^" "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 - "@rjsf/utils": 5.6.0 + "@rjsf/utils": 5.7.3 "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -7238,10 +7400,10 @@ __metadata: "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 - "@rjsf/core-v5": "npm:@rjsf/core@5.6.0" - "@rjsf/material-ui": 5.6.0 - "@rjsf/utils": 5.6.0 - "@rjsf/validator-ajv8": 5.6.0 + "@rjsf/core-v5": "npm:@rjsf/core@5.7.3" + "@rjsf/material-ui": 5.7.3 + "@rjsf/utils": 5.7.3 + "@rjsf/validator-ajv8": 5.7.3 "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -7881,6 +8043,7 @@ __metadata: "@backstage/dev-utils": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" + "@backstage/plugin-home-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 @@ -7987,7 +8150,21 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-common@^0.7.5, @backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": +"@backstage/plugin-permission-common@npm:^0.7.5": + version: 0.7.5 + resolution: "@backstage/plugin-permission-common@npm:0.7.5" + 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.21.4 + checksum: 24bfdc412e987be1d6bfa9e8dc82e19b7046ac60b426db2d7d81cf8389078e3703bd028a9331d4b9f695bf20126db5b17f648d14c70505eba7618c3c1c3f2e87 + 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: @@ -8025,7 +8202,26 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-react@^0.4.12, @backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": +"@backstage/plugin-permission-react@npm:^0.4.12": + version: 0.4.12 + resolution: "@backstage/plugin-permission-react@npm:0.4.12" + dependencies: + "@backstage/config": ^1.0.7 + "@backstage/core-plugin-api": ^1.5.1 + "@backstage/plugin-permission-common": ^0.7.5 + "@types/react": ^16.13.1 || ^17.0.0 + cross-fetch: ^3.1.5 + 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 + checksum: c431772c887c52302ad640233fea16fab44dcc16436cf234e337602dcb47fd9e4afbc9eb89223199016e71f7f4a45276e3095bdc2ef1bf49e5c368cccfc87d06 + 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: @@ -8248,7 +8444,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdown": +"@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:^, @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdown": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdown" dependencies: @@ -8389,6 +8585,7 @@ __metadata: "@types/express": ^4.17.6 "@types/fs-extra": ^9.0.1 "@types/git-url-parse": ^9.0.0 + "@types/libsodium-wrappers": ^0.7.10 "@types/luxon": ^3.0.0 "@types/mock-fs": ^4.13.0 "@types/nunjucks": ^3.1.4 @@ -8409,6 +8606,7 @@ __metadata: jest-when: ^3.1.0 jsonschema: ^1.2.6 knex: ^2.0.0 + libsodium-wrappers: ^0.7.11 lodash: ^4.17.21 luxon: ^3.0.0 mock-fs: ^5.1.0 @@ -8483,11 +8681,11 @@ __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.6.0" + "@rjsf/core-v5": "npm:@rjsf/core@5.7.3" "@rjsf/material-ui": ^3.2.1 - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.6.0" - "@rjsf/utils": 5.6.0 - "@rjsf/validator-ajv8": 5.6.0 + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.7.3" + "@rjsf/utils": 5.7.3 + "@rjsf/validator-ajv8": 5.7.3 "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -8550,8 +8748,8 @@ __metadata: "@react-hookz/web": ^20.0.0 "@rjsf/core": ^3.2.1 "@rjsf/material-ui": ^3.2.1 - "@rjsf/utils": 5.6.0 - "@rjsf/validator-ajv8": 5.6.0 + "@rjsf/utils": 5.7.3 + "@rjsf/validator-ajv8": 5.7.3 "@testing-library/dom": ^8.0.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -8642,6 +8840,7 @@ __metadata: "@backstage/plugin-explore-common": "workspace:^" "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-search-common": "workspace:^" + msw: ^1.2.1 node-fetch: ^2.6.7 winston: ^3.2.1 languageName: unknown @@ -8743,6 +8942,16 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-search-common@npm:^1.2.3": + version: 1.2.3 + resolution: "@backstage/plugin-search-common@npm:1.2.3" + dependencies: + "@backstage/plugin-permission-common": ^0.7.5 + "@backstage/types": ^1.0.2 + checksum: 79f5808c1d3c6bdcd659e4d9228efc6ddf5a5c3135ad87581070243cdcfdfd704136ff997c01fc736af2aa6bdd6ecdec467b6dcec7e4897600d6225491ed9410 + 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" @@ -10117,8 +10326,8 @@ __metadata: linkType: hard "@codemirror/language@npm:^6.0.0": - version: 6.6.0 - resolution: "@codemirror/language@npm:6.6.0" + version: 6.7.0 + resolution: "@codemirror/language@npm:6.7.0" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 @@ -10126,7 +10335,7 @@ __metadata: "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 style-mod: ^4.0.0 - checksum: bb9411620e2f231653a3f0c4429e0d19a3843bff5dbc117df4649d7bf783ec4ad809c0add8bc0887a4ec3f48b4f8f941621168e47d76101d5383f0d670af1722 + checksum: 673905e9eb80f039a5e6c59a8aeca217e124a9a03734848043192aeff9e5b3a82f150559f7bd637ee197c4b2171eb5b04e757d717922128ea4fecca1ac6ecac4 languageName: node linkType: hard @@ -10181,13 +10390,13 @@ __metadata: linkType: hard "@codemirror/view@npm:^6.0.0": - version: 6.9.5 - resolution: "@codemirror/view@npm:6.9.5" + version: 6.13.0 + resolution: "@codemirror/view@npm:6.13.0" dependencies: "@codemirror/state": ^6.1.4 style-mod: ^4.0.0 w3c-keyname: ^2.2.4 - checksum: 38039ae5d1cf4ec54c5d0252790a942b5788b9e8670dcf58e63c1f2befe11e852581c88f4e044ca664a7b11c634b1c152099da1a4ac9f454939b20d7c649b808 + checksum: 3c4713eba5cf54afd9cf92f42295f7a9b42f4041ad9c17fc3dbbeebeb94f95fe3b2bd5377265ceed71a070d5b2472bae2fbb5013254c7e85fe5e1e3b5c807d79 languageName: node linkType: hard @@ -10878,10 +11087,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.41.0": - version: 8.41.0 - resolution: "@eslint/js@npm:8.41.0" - checksum: af013d70fe8d0429cdf5cd8b5dcc6fc384ed026c1eccb0cfe30f5849b968ab91645111373fd1b83282b38955b1bdfbe667c1a7dbda3b06cae753521223cad775 +"@eslint/js@npm:8.42.0": + version: 8.42.0 + resolution: "@eslint/js@npm:8.42.0" + checksum: 750558843ac458f7da666122083ee05306fc087ecc1e5b21e7e14e23885775af6c55bcc92283dff1862b7b0d8863ec676c0f18c7faf1219c722fe91a8ece56b6 languageName: node linkType: hard @@ -10952,8 +11161,8 @@ __metadata: linkType: hard "@frsource/cypress-plugin-visual-regression-diff@npm:^3.2.8": - version: 3.3.1 - resolution: "@frsource/cypress-plugin-visual-regression-diff@npm:3.3.1" + version: 3.3.8 + resolution: "@frsource/cypress-plugin-visual-regression-diff@npm:3.3.8" dependencies: "@frsource/base64": 1.0.14 glob: 8.0.3 @@ -10964,7 +11173,7 @@ __metadata: sharp: 0.31.2 peerDependencies: cypress: ">=4.5.0" - checksum: fae1e9de89fcc0f75a71dd7cc78cb870fa4d0989a0dd2e1084eec2fdc95f9ff503a124f05ea88f87b52c3d03463a79e96439e5620a6c0f24ac39135c81af9edc + checksum: 657cd8f4343da939677ae8db611445846eed21176fd2494617050ac267aed7665ce1b084aba0ce774170f7113a7bd79af41b3207e457af28a212e46b07f4783d languageName: node linkType: hard @@ -11026,23 +11235,23 @@ __metadata: linkType: hard "@google-cloud/container@npm:^4.0.0": - version: 4.8.0 - resolution: "@google-cloud/container@npm:4.8.0" + version: 4.11.0 + resolution: "@google-cloud/container@npm:4.11.0" dependencies: google-gax: ^3.5.8 - checksum: f9c64a368d16a3fbc79a122987f99b02d15a82205d13381b30fcb7e012a6a06dc869bc3c07b1325517863df3692e07351e4b8998b774c3b72c31ecd225f2f3bc + checksum: c5257d86ff73a1770ef6004965cca4d2107a3814257a97b4bace14a75be19455d8598db29b43cd66173b847a494cb10b35c9bbdcf8c262726afb4c7a521a8120 languageName: node linkType: hard "@google-cloud/firestore@npm:^6.0.0": - version: 6.5.0 - resolution: "@google-cloud/firestore@npm:6.5.0" + version: 6.6.1 + resolution: "@google-cloud/firestore@npm:6.6.1" dependencies: fast-deep-equal: ^3.1.1 functional-red-black-tree: ^1.0.1 google-gax: ^3.5.7 protobufjs: ^7.0.0 - checksum: dd9cf4eee263a976239232143d5caf213c34850a352c6b6cb15b7b17cfddc2c6bee5e72eed0d188f4317eb5cb6a898372d02c54be8a30bbdc7ffbd360e138cb7 + checksum: 9f3838e07d74da34ba4cf322efd3f82e3b8f5b330ae01c0e51d717aacafe2a84caa2869989bbff87fe020086f5b8591baaaf8c643dc93c20fd3f6f2adfd67a24 languageName: node linkType: hard @@ -11071,8 +11280,8 @@ __metadata: linkType: hard "@google-cloud/storage@npm:^6.0.0": - version: 6.9.5 - resolution: "@google-cloud/storage@npm:6.9.5" + version: 6.11.0 + resolution: "@google-cloud/storage@npm:6.11.0" dependencies: "@google-cloud/paginator": ^3.0.7 "@google-cloud/projectify": ^3.0.0 @@ -11091,7 +11300,7 @@ __metadata: retry-request: ^5.0.0 teeny-request: ^8.0.0 uuid: ^8.0.0 - checksum: eff663cc44ee553fbd2f62b67ef422783f29210c67f55c86c13e63a40c36f3c9b78e076b2a08bb6a74a9fdc452de9240aac91e0fa11c3a4f782416a230d88b74 + checksum: 4183c0ad3b271e0c22b3aa01e9942590ae64b984efa142a787b96379baaf4c05a2ebdbb6015c8ea189951df251d57f4f35c6a28b920922828cc89d3e4147d1a1 languageName: node linkType: hard @@ -11914,14 +12123,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.8": - version: 0.11.8 - resolution: "@humanwhocodes/config-array@npm:0.11.8" +"@humanwhocodes/config-array@npm:^0.11.10": + version: 0.11.10 + resolution: "@humanwhocodes/config-array@npm:0.11.10" dependencies: "@humanwhocodes/object-schema": ^1.2.1 debug: ^4.1.1 minimatch: ^3.0.5 - checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 + checksum: 1b1302e2403d0e35bc43e66d67a2b36b0ad1119efc704b5faff68c41f791a052355b010fb2d27ef022670f550de24cd6d08d5ecf0821c16326b7dcd0ee5d5d8a languageName: node linkType: hard @@ -12471,26 +12680,26 @@ __metadata: linkType: hard "@keyv/redis@npm:^2.5.3": - version: 2.5.8 - resolution: "@keyv/redis@npm:2.5.8" + version: 2.6.1 + resolution: "@keyv/redis@npm:2.6.1" dependencies: ioredis: ^5.3.2 - checksum: 1050c4997b62e701112b48e5375c4e53a5e49454c1621fbb00b1c2272e55a575f9ace49c5179800f73e6f07ce247a4cf6e1260a6713ad1392fd8f8825079771f + checksum: c0c0aa7d0b449ef295ab65bcc38d42a2f6f606f49bf1d9bc95cd0276d60854c4d579d6dfce9e070f350a07987dfde9d452884ee05e8f87215c49c304b27a68ab languageName: node linkType: hard "@kubernetes-models/apimachinery@npm:^1.1.0": - version: 1.1.1 - resolution: "@kubernetes-models/apimachinery@npm:1.1.1" + version: 1.2.0 + resolution: "@kubernetes-models/apimachinery@npm:1.2.0" dependencies: - "@kubernetes-models/base": ^4.0.1 - "@kubernetes-models/validate": ^3.0.1 + "@kubernetes-models/base": ^4.0.2 + "@kubernetes-models/validate": ^3.1.0 tslib: ^2.4.0 - checksum: 915d6a55b485335622d43c6e1f1031ea949bfb3e985deba6389462b4c0a3b3030e71e6eebfc1e7b894afee543de2e5a1af0ff6694225a372e220f7dccb5b6eed + checksum: ac93980b732239517af47e0cb512e28fc320ed8348eaa8a68f65b16adc98cf90b6b36d9a9752d825e6e1ac84ae0c0d37e2dc8c8de140011506753a058c89bcf2 languageName: node linkType: hard -"@kubernetes-models/base@npm:^4.0.0, @kubernetes-models/base@npm:^4.0.1": +"@kubernetes-models/base@npm:^4.0.0, @kubernetes-models/base@npm:^4.0.1, @kubernetes-models/base@npm:^4.0.2": version: 4.0.2 resolution: "@kubernetes-models/base@npm:4.0.2" dependencies: @@ -12501,7 +12710,7 @@ __metadata: languageName: node linkType: hard -"@kubernetes-models/validate@npm:^3.0.0, @kubernetes-models/validate@npm:^3.0.1, @kubernetes-models/validate@npm:^3.1.0": +"@kubernetes-models/validate@npm:^3.0.0, @kubernetes-models/validate@npm:^3.1.0": version: 3.1.0 resolution: "@kubernetes-models/validate@npm:3.1.0" dependencies: @@ -12991,9 +13200,9 @@ __metadata: linkType: hard "@microsoft/microsoft-graph-types@npm:^2.25.0, @microsoft/microsoft-graph-types@npm:^2.6.0": - version: 2.25.0 - resolution: "@microsoft/microsoft-graph-types@npm:2.25.0" - checksum: b311385e0a51f827082af5a016f35b1d6cd4d861121e8767b3279ab1a17475977cddbbdcc208abdddf0f953fd6ce4634d3c302e317cf50af4cb6111385347b4f + version: 2.33.0 + resolution: "@microsoft/microsoft-graph-types@npm:2.33.0" + checksum: 9a07e258750cfdedebdc05670c9951fe507ba0868839a411ff36592015660a547d1e4fd9abec1533da979238ef674ce2bf4c363ab0ae2082818313fba0978ecb languageName: node linkType: hard @@ -13488,22 +13697,22 @@ __metadata: languageName: node linkType: hard -"@octokit/app@npm:^13.0.5": - version: 13.0.5 - resolution: "@octokit/app@npm:13.0.5" +"@octokit/app@npm:^13.1.5": + version: 13.1.5 + resolution: "@octokit/app@npm:13.1.5" dependencies: - "@octokit/auth-app": ^4.0.0 + "@octokit/auth-app": ^4.0.13 "@octokit/auth-unauthenticated": ^3.0.0 "@octokit/core": ^4.0.0 - "@octokit/oauth-app": ^4.0.4 - "@octokit/plugin-paginate-rest": ^3.0.0 - "@octokit/types": ^6.27.1 + "@octokit/oauth-app": ^4.0.7 + "@octokit/plugin-paginate-rest": ^6.0.0 + "@octokit/types": ^9.0.0 "@octokit/webhooks": ^10.0.0 - checksum: 15fdff892f0ec82a1121b94e82eb09aad8a868147efecb0613dc44b06aeb8252f5a4caade2d929644fd7fa8bff2df56f1fb702506574dafa3df8653421a6015a + checksum: bc1b348c2b80d701d68672455e6f3d6ae7dbed09e2b5ba323fb941316d7055d101d20d1a803b0b5b98d60a6e7bd9907da4a1cca4445263e2180270aab783c3a4 languageName: node linkType: hard -"@octokit/auth-app@npm:^4.0.0": +"@octokit/auth-app@npm:^4.0.0, @octokit/auth-app@npm:^4.0.13": version: 4.0.13 resolution: "@octokit/auth-app@npm:4.0.13" dependencies: @@ -13592,18 +13801,18 @@ __metadata: languageName: node linkType: hard -"@octokit/core@npm:^4.0.0, @octokit/core@npm:^4.0.4, @octokit/core@npm:^4.1.0": - version: 4.1.0 - resolution: "@octokit/core@npm:4.1.0" +"@octokit/core@npm:^4.0.0, @octokit/core@npm:^4.2.1": + version: 4.2.1 + resolution: "@octokit/core@npm:4.2.1" dependencies: "@octokit/auth-token": ^3.0.0 "@octokit/graphql": ^5.0.0 "@octokit/request": ^6.0.0 "@octokit/request-error": ^3.0.0 - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 before-after-hook: ^2.2.0 universal-user-agent: ^6.0.0 - checksum: 4e53e02ff3ebe808b74385be0055cc1cce4b548060b20e3f2d5dd1bf7877ff7b6556f11278edc070842bf24aa869f9f59a02638f1b14083eb290b9e297447a2d + checksum: f82d52e937e12da1c7c163341c845b8e27e7fa75678f5e5954e6fa017a94f1833d6e5c4e43f0be796fbfea9dc5e1137087f655dbd5acb3d57879e1b28568e0a9 languageName: node linkType: hard @@ -13629,6 +13838,16 @@ __metadata: languageName: node linkType: hard +"@octokit/graphql-schema@npm:^13.7.0": + version: 13.10.0 + resolution: "@octokit/graphql-schema@npm:13.10.0" + dependencies: + graphql: ^16.0.0 + graphql-tag: ^2.10.3 + checksum: fdec9c9a4df1f90b733ea0e24964744faceaf65e5d350b1727892e8e0e5821df1d29aec5cfa039925a044c6f56d4ed2028505108db7fbc0c68011053853c2411 + languageName: node + linkType: hard + "@octokit/graphql@npm:^5.0.0": version: 5.0.6 resolution: "@octokit/graphql@npm:5.0.6" @@ -13640,7 +13859,7 @@ __metadata: languageName: node linkType: hard -"@octokit/oauth-app@npm:^4.0.4, @octokit/oauth-app@npm:^4.0.6, @octokit/oauth-app@npm:^4.2.0": +"@octokit/oauth-app@npm:^4.0.7, @octokit/oauth-app@npm:^4.2.0, @octokit/oauth-app@npm:^4.2.1": version: 4.2.2 resolution: "@octokit/oauth-app@npm:4.2.2" dependencies: @@ -13711,50 +13930,22 @@ __metadata: languageName: node linkType: hard -"@octokit/openapi-types@npm:^14.0.0": - version: 14.0.0 - resolution: "@octokit/openapi-types@npm:14.0.0" - checksum: 0a1f8f3be998cd82c5a640e9166d43fd183b33d5d36f5e1a9b81608e94d0da87c01ec46c9988f69cd26585d4e2ffc4d3ec99ee4f75e5fe997fc86dad0aa8293c +"@octokit/openapi-types@npm:^17.2.0": + version: 17.2.0 + resolution: "@octokit/openapi-types@npm:17.2.0" + checksum: 29995e34f98d9d64ba234d64a7ae9486c66d2bb6ac0d30d9a42decdbb4b03b13e811769b1e1505a1748ff20c22d35724985e6c128cd11a3f14f8322201520093 languageName: node linkType: hard -"@octokit/openapi-types@npm:^16.0.0": - version: 16.0.0 - resolution: "@octokit/openapi-types@npm:16.0.0" - checksum: 844f30a545da380d63c712e0eb733366bc567d1aab34529c79fdfbec3d73810e81d83f06fdab13058a5cbc7dae786db1a9b90b5b61b1e606854ee45d5ec5f194 - languageName: node - linkType: hard - -"@octokit/plugin-paginate-rest@npm:^3.0.0": - version: 3.0.0 - resolution: "@octokit/plugin-paginate-rest@npm:3.0.0" +"@octokit/plugin-paginate-rest@npm:^6.0.0, @octokit/plugin-paginate-rest@npm:^6.1.0, @octokit/plugin-paginate-rest@npm:^6.1.2": + version: 6.1.2 + resolution: "@octokit/plugin-paginate-rest@npm:6.1.2" dependencies: - "@octokit/types": ^6.39.0 + "@octokit/tsconfig": ^1.0.2 + "@octokit/types": ^9.2.3 peerDependencies: "@octokit/core": ">=4" - checksum: 1d2c900254f3dcd43f7ba69dfd12ff63f93a0d39a1bf542b1d0f006e95da4924ae0a26044c864ad7fb0309047f44becaf76293aae334d14c946910d65edd2523 - languageName: node - linkType: hard - -"@octokit/plugin-paginate-rest@npm:^4.0.0": - version: 4.0.0 - resolution: "@octokit/plugin-paginate-rest@npm:4.0.0" - dependencies: - "@octokit/types": ^7.0.0 - peerDependencies: - "@octokit/core": ">=4" - checksum: a3fbc1d540cc919df8935dea88b36d59ae85f417713476d8679f1cf8b733cfb44b96d3020094bd7f8daa7b84e4ac9b8403c1cdad323289d586fdb2ed1dcae7c0 - languageName: node - linkType: hard - -"@octokit/plugin-paginate-rest@npm:^6.0.0": - version: 6.0.0 - resolution: "@octokit/plugin-paginate-rest@npm:6.0.0" - dependencies: - "@octokit/types": ^9.0.0 - peerDependencies: - "@octokit/core": ">=4" - checksum: 4ad89568d883373898b733837cada7d849d51eef32157c11d4a81cef5ce8e509720d79b46918cada3c132f9b29847e383f17b7cd5c39ede7c93cdcd2f850b47f + checksum: a7b3e686c7cbd27ec07871cde6e0b1dc96337afbcef426bbe3067152a17b535abd480db1861ca28c88d93db5f7bfdbcadd0919ead19818c28a69d0e194038065 languageName: node linkType: hard @@ -13767,49 +13958,39 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-rest-endpoint-methods@npm:^6.0.0": - version: 6.7.0 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:6.7.0" +"@octokit/plugin-rest-endpoint-methods@npm:^7.1.1, @octokit/plugin-rest-endpoint-methods@npm:^7.1.2": + version: 7.1.2 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:7.1.2" dependencies: - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.2.3 deprecation: ^2.3.1 peerDependencies: "@octokit/core": ">=3" - checksum: 513c6c0717d08f3e85848029bd700412b7d9787750f78cc79a3dede356e94b238bf8a518b108f556a7efe626871720dd0466de9f31091578ea4e0f5a016f0ae7 + checksum: 159d29bf28d7aecbe39f08c25cf376d39b6c90ce17e50a55eafb44f3e4b9e1053a300c1edd72f308ae386146a17cbad46c410c1cfd000b048adf9c21d6922a1a languageName: node linkType: hard -"@octokit/plugin-rest-endpoint-methods@npm:^7.0.0": - version: 7.0.1 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:7.0.1" +"@octokit/plugin-retry@npm:^4.1.3": + version: 4.1.3 + resolution: "@octokit/plugin-retry@npm:4.1.3" dependencies: "@octokit/types": ^9.0.0 - deprecation: ^2.3.1 + bottleneck: ^2.15.3 peerDependencies: "@octokit/core": ">=3" - checksum: cdb8734ec960f75acc2405284920c58efac9a71b1c3b2a71662b9100ffbc22dac597150acff017a93459c57e9a492d9e1c27872b068387dbb90597de75065fcf + checksum: f9ed5869be23dddcf1ee896ce996e46a412a586259b55612ba44c82cdeed91436102e6e3ec57db879bd91a4446dcafbaa94632e4e059c6af56d9cca9b163eacb languageName: node linkType: hard -"@octokit/plugin-retry@npm:^3.0.9": - version: 3.0.9 - resolution: "@octokit/plugin-retry@npm:3.0.9" +"@octokit/plugin-throttling@npm:^5.2.2": + version: 5.2.3 + resolution: "@octokit/plugin-throttling@npm:5.2.3" dependencies: - "@octokit/types": ^6.0.3 - bottleneck: ^2.15.3 - checksum: 5744780d308dd2f2b8174264604a9f8ea977374256f5eaf0314e5181c32f96ec53a3cfcee67bf1b48dc7eed401ebefebd2fa744b41cf03103affac92f397a874 - languageName: node - linkType: hard - -"@octokit/plugin-throttling@npm:^4.0.1": - version: 4.0.1 - resolution: "@octokit/plugin-throttling@npm:4.0.1" - dependencies: - "@octokit/types": ^6.0.1 + "@octokit/types": ^9.0.0 bottleneck: ^2.15.3 peerDependencies: "@octokit/core": ^4.0.0 - checksum: 7642e5968922b8348510782e7675189810d6ed6cb3fc6ae231fd4614ebdb011759628c8f5fbca40f37e5a2cf69898b8b58cdb7722ae75da59012430c6cf7b4d8 + checksum: ce7ca75d150c63cf1bbcb5b385513bd8cd1f714c5e59f33d25c2afd08fa730250055ef8dffa74113f92e7fb3f209a147442242151607a513f55e4ce382c8e80c languageName: node linkType: hard @@ -13864,18 +14045,25 @@ __metadata: linkType: hard "@octokit/rest@npm:^19.0.3": - version: 19.0.7 - resolution: "@octokit/rest@npm:19.0.7" + version: 19.0.11 + resolution: "@octokit/rest@npm:19.0.11" dependencies: - "@octokit/core": ^4.1.0 - "@octokit/plugin-paginate-rest": ^6.0.0 + "@octokit/core": ^4.2.1 + "@octokit/plugin-paginate-rest": ^6.1.2 "@octokit/plugin-request-log": ^1.0.4 - "@octokit/plugin-rest-endpoint-methods": ^7.0.0 - checksum: 1f970c4de2cf3d1691d3cf5dd4bfa5ac205629e76417b5c51561e1beb5b4a7e6c65ba647f368727e67e5243418e06ca9cdafd9e733173e1529385d4f4d053d3d + "@octokit/plugin-rest-endpoint-methods": ^7.1.2 + checksum: 147518ad51d214ead88adc717b5fdc4f33317949d58c124f4069bdf07d2e6b49fa66861036b9e233aed71fcb88ff367a6da0357653484e466175ab4fb7183b3b languageName: node linkType: hard -"@octokit/types@npm:^6.0.1, @octokit/types@npm:^6.0.3, @octokit/types@npm:^6.10.0, @octokit/types@npm:^6.12.2, @octokit/types@npm:^6.16.1, @octokit/types@npm:^6.27.1, @octokit/types@npm:^6.39.0, @octokit/types@npm:^6.8.2": +"@octokit/tsconfig@npm:^1.0.2": + version: 1.0.2 + resolution: "@octokit/tsconfig@npm:1.0.2" + checksum: 74d56f3e9f326a8dd63700e9a51a7c75487180629c7a68bbafee97c612fbf57af8347369bfa6610b9268a3e8b833c19c1e4beb03f26db9a9dce31f6f7a19b5b1 + languageName: node + linkType: hard + +"@octokit/types@npm:^6.0.3, @octokit/types@npm:^6.10.0, @octokit/types@npm:^6.12.2, @octokit/types@npm:^6.16.1, @octokit/types@npm:^6.8.2": version: 6.41.0 resolution: "@octokit/types@npm:6.41.0" dependencies: @@ -13893,21 +14081,12 @@ __metadata: languageName: node linkType: hard -"@octokit/types@npm:^8.0.0": - version: 8.0.0 - resolution: "@octokit/types@npm:8.0.0" +"@octokit/types@npm:^9.0.0, @octokit/types@npm:^9.2.2, @octokit/types@npm:^9.2.3": + version: 9.2.3 + resolution: "@octokit/types@npm:9.2.3" dependencies: - "@octokit/openapi-types": ^14.0.0 - checksum: 1a0197b2c4c522ac90f145e02b3f8cb048a47f71c2c6bdbf021a03db7dd30ca92a899c0186acb401337f218efe44e60d33cc1cc68715b622bb75bc1a4e79515d - languageName: node - linkType: hard - -"@octokit/types@npm:^9.0.0": - version: 9.0.0 - resolution: "@octokit/types@npm:9.0.0" - dependencies: - "@octokit/openapi-types": ^16.0.0 - checksum: 5c7f5cca8f00f7c4daa0d00f4fe991c1598ec47cd6ced50b1c5fbe9721bb9dee0adc2acdee265a3a715bb984e53ef3dc7f1cfb7326f712c6d809d59fc5c6648d + "@octokit/openapi-types": ^17.2.0 + checksum: 6806413089f20a8302237ef85aa2e83bace7499e95fdc3db2d304f9e6dc6e87fb6766452f92e08ddf475046b69753e11beabaeff6733c38bdaf3e21dfd7d3341 languageName: node linkType: hard @@ -13993,16 +14172,72 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api@npm:^1.0.1, @opentelemetry/api@npm:^1.3.0": +"@opentelemetry/api@npm:^1.0.1, @opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.4.1": version: 1.4.1 resolution: "@opentelemetry/api@npm:1.4.1" checksum: e783c40d1a518abf9c4c5d65223237c1392cd9a6c53ac6e2c3ef0c05ff7266e3dfc4fd9874316dae0dcb7a97950878deb513bcbadfaad653d48f0215f2a0911b languageName: node linkType: hard -"@oriflame/backstage-plugin-score-card@npm:^0.6.0": - version: 0.6.3 - resolution: "@oriflame/backstage-plugin-score-card@npm:0.6.3" +"@opentelemetry/core@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/core@npm:1.13.0" + dependencies: + "@opentelemetry/semantic-conventions": 1.13.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: a69916bcb710f1241e98a58ac5f5dfbc3372fdcd6cb2a4b2d33cdeb941765ecbdeea029f60f650a5743a56f583b0f06b672566467b89db84a24f1304bf2e5205 + languageName: node + linkType: hard + +"@opentelemetry/exporter-prometheus@npm:^0.39.1": + version: 0.39.1 + resolution: "@opentelemetry/exporter-prometheus@npm:0.39.1" + dependencies: + "@opentelemetry/core": 1.13.0 + "@opentelemetry/resources": 1.13.0 + "@opentelemetry/sdk-metrics": 1.13.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 97697926ef26e3dca9654b6ea8d2ab8e7fc7fc33ce617d25a6eb70c0ef2e2fe47192fcede15cbe45179d0ade67e55769bbed11c691d34f9e59ebd50aab22add7 + languageName: node + linkType: hard + +"@opentelemetry/resources@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/resources@npm:1.13.0" + dependencies: + "@opentelemetry/core": 1.13.0 + "@opentelemetry/semantic-conventions": 1.13.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: ef0a11596f27b5e1c13b74357da06c5c2725a1056df0a583562dbcc739927ad85bb8bdec4e01f4b43f348b448c0146c033b135840a7d388b75cc751a33a6364e + languageName: node + linkType: hard + +"@opentelemetry/sdk-metrics@npm:1.13.0, @opentelemetry/sdk-metrics@npm:^1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/sdk-metrics@npm:1.13.0" + dependencies: + "@opentelemetry/core": 1.13.0 + "@opentelemetry/resources": 1.13.0 + lodash.merge: 4.6.2 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.5.0" + checksum: 2f87444b6c789acdde3465383b4255b072e201cf9bed642e82970540bfe913d76d4c4ebf8cc1ff3da383d3235dd8399cd6407fac86085a9ac9ff5b5b3afc9f38 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.13.0" + checksum: 9cccf1d73315fed3920bb2201c0e82f66e58dddfa475314b6613780c2804570d6f657be3894eb8b84a2a543c9b8cd520587f5d6cd4b62bc6731d7299b4c5ee69 + languageName: node + linkType: hard + +"@oriflame/backstage-plugin-score-card@npm:^0.7.0": + version: 0.7.0 + resolution: "@oriflame/backstage-plugin-score-card@npm:0.7.0" dependencies: "@backstage/catalog-model": ^1.1.5 "@backstage/config": ^1.0.6 @@ -14020,7 +14255,7 @@ __metadata: peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 - checksum: cdf57bb0ea42b1ef3699b65e558c0d9f2483555fefd03bc3ff4e4d75524c904d723e4808987e8718eac63ab60da6257af82e7d45c70cd42fc00bb1a4c392578b + checksum: 72ce56c8df0cc4611a0a66c7d22659f911ac8d265b3b2802cd4c35b7b0415a70d6c448eb681fd77bd4ab9167ffa560e8facc0b06301fc55ac933bdaf0d9e336d languageName: node linkType: hard @@ -14213,18 +14448,18 @@ __metadata: linkType: hard "@react-hookz/web@npm:^23.0.0": - version: 23.0.0 - resolution: "@react-hookz/web@npm:23.0.0" + version: 23.0.1 + resolution: "@react-hookz/web@npm:23.0.1" dependencies: "@react-hookz/deep-equal": ^1.0.4 peerDependencies: - js-cookie: ^3.0.1 + js-cookie: ^3.0.5 react: ^16.8 || ^17 || ^18 react-dom: ^16.8 || ^17 || ^18 peerDependenciesMeta: js-cookie: optional: true - checksum: 230bff62291bcafa65e0b9adcc3f0769fd63fabc226c77149e7797d1ea67362e9ad581ceff3cdfe2949698798d2deefb223c05bdfed1e465b5d92298d48cf3e5 + checksum: 321770570c947321ba44de6ecee17337e4bb0c2a0c9d0dff5cf29e999faa2b7c1132c72a15aface46da9a709b715042ab48a30085d2a8feefba91aac96e82037 languageName: node linkType: hard @@ -14265,6 +14500,22 @@ __metadata: languageName: node linkType: hard +"@rjsf/core-v5@npm:@rjsf/core@5.7.3": + version: 5.7.3 + resolution: "@rjsf/core@npm:5.7.3" + dependencies: + lodash: ^4.17.21 + lodash-es: ^4.17.21 + markdown-to-jsx: ^7.2.0 + nanoid: ^3.3.6 + prop-types: ^15.8.1 + peerDependencies: + "@rjsf/utils": 5.7.x + react: ^16.14.0 || >=17 + checksum: bdae474fd0a6d4d8fd625ef74384a90624860841e1426b516358365a960d5627a98a1a159a6ddc59cc84659dd768ac7bba126d459c83c4f1d78acd8ad8d98f19 + languageName: node + linkType: hard + "@rjsf/core@npm:^3.2.1": version: 3.2.1 resolution: "@rjsf/core@npm:3.2.1" @@ -14284,7 +14535,20 @@ __metadata: languageName: node linkType: hard -"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.6.0, @rjsf/material-ui@npm:5.6.0": +"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.7.3, @rjsf/material-ui@npm:5.7.3": + version: 5.7.3 + resolution: "@rjsf/material-ui@npm:5.7.3" + peerDependencies: + "@material-ui/core": ^4.12.3 + "@material-ui/icons": ^4.11.2 + "@rjsf/core": 5.7.x + "@rjsf/utils": 5.7.x + react: ^16.14.0 || >=17 + checksum: 96ff2a0227b6810efd8b9e36e7e956f1e753c9cecd78215e79e9487af6276da70ee25b8c9d4678241afb85cf5ade31c3591d39659cdeda3cd52ccb6a1ada1d17 + languageName: node + linkType: hard + +"@rjsf/material-ui@npm:5.6.0": version: 5.6.0 resolution: "@rjsf/material-ui@npm:5.6.0" peerDependencies: @@ -14324,6 +14588,21 @@ __metadata: languageName: node linkType: hard +"@rjsf/utils@npm:5.7.3": + version: 5.7.3 + resolution: "@rjsf/utils@npm:5.7.3" + dependencies: + json-schema-merge-allof: ^0.8.1 + jsonpointer: ^5.0.1 + lodash: ^4.17.21 + lodash-es: ^4.17.21 + react-is: ^18.2.0 + peerDependencies: + react: ^16.14.0 || >=17 + checksum: 30ceab80a98a33076eef3c680d079ca90bb7023d40524776fa6cce79f0dc21a5eeaec63fa786e3775b60ccee27f993d030b340d6704c3c4d23515f9d046d4354 + languageName: node + linkType: hard + "@rjsf/validator-ajv8@npm:5.6.0": version: 5.6.0 resolution: "@rjsf/validator-ajv8@npm:5.6.0" @@ -14338,6 +14617,20 @@ __metadata: languageName: node linkType: hard +"@rjsf/validator-ajv8@npm:5.7.3": + version: 5.7.3 + resolution: "@rjsf/validator-ajv8@npm:5.7.3" + dependencies: + ajv: ^8.12.0 + ajv-formats: ^2.1.1 + lodash: ^4.17.21 + lodash-es: ^4.17.21 + peerDependencies: + "@rjsf/utils": 5.7.x + checksum: 0b2ab4bf718c761a8b990f4a3894ad10af2f3d473c425dd4fdf2f1bec6d15a363ac9a012215f0cc4d9fecb0a6cf12bc4e13fd20fa782975e5c0b1e254ef8939e + languageName: node + linkType: hard + "@roadiehq/backstage-plugin-buildkite@npm:^2.0.8": version: 2.1.9 resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.9" @@ -14495,8 +14788,8 @@ __metadata: linkType: hard "@rollup/plugin-yaml@npm:^4.0.0": - version: 4.0.1 - resolution: "@rollup/plugin-yaml@npm:4.0.1" + version: 4.1.0 + resolution: "@rollup/plugin-yaml@npm:4.1.0" dependencies: "@rollup/pluginutils": ^5.0.1 js-yaml: ^4.1.0 @@ -14506,7 +14799,7 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: d48e248a9acd3110c889d745562e03e5a16e5861838c6b6d92701e59c0d4a24af374ee7bd81db0ab8e6d021cdb925c05bd7d30149e4e9a0fce4d899170a78857 + checksum: e8dcfbb6032ebd493e3cf1f3fcc7ee7e50509e3848a283ab21c743ec59b65b587d3755f744c7135f49db97aee1fc7eee818375519f293e7227e278ccf9d8b3dc languageName: node linkType: hard @@ -14722,6 +15015,25 @@ __metadata: languageName: node linkType: hard +"@smithy/protocol-http@npm:^1.0.1": + version: 1.0.1 + resolution: "@smithy/protocol-http@npm:1.0.1" + dependencies: + "@smithy/types": ^1.0.0 + tslib: ^2.5.0 + checksum: ba9ac4880fed48eeea0813663c94c765fe5b900f2fdac4f5de6524306bbc6645829f48bc175d202076b83acaccf008ed77f4b5546a4c180315f253e22fe6c89f + languageName: node + linkType: hard + +"@smithy/types@npm:^1.0.0": + version: 1.0.0 + resolution: "@smithy/types@npm:1.0.0" + dependencies: + tslib: ^2.5.0 + checksum: ec05163564af050088f3c21cb047640ca842bea645c2a73624475b486d5df8ad9c494bf683a498f4b467b84fab2817cc199893dfb5cee30dce1e0172ab38db00 + languageName: node + linkType: hard + "@spotify/eslint-config-base@npm:^14.0.0": version: 14.0.1 resolution: "@spotify/eslint-config-base@npm:14.0.1" @@ -15322,90 +15634,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-darwin-arm64@npm:1.3.59" +"@swc/core-darwin-arm64@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-darwin-arm64@npm:1.3.62" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-darwin-x64@npm:1.3.59" +"@swc/core-darwin-x64@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-darwin-x64@npm:1.3.62" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.59" +"@swc/core-linux-arm-gnueabihf@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.62" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.59" +"@swc/core-linux-arm64-gnu@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.62" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.59" +"@swc/core-linux-arm64-musl@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.62" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.59" +"@swc/core-linux-x64-gnu@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.62" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-linux-x64-musl@npm:1.3.59" +"@swc/core-linux-x64-musl@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-linux-x64-musl@npm:1.3.62" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.59" +"@swc/core-win32-arm64-msvc@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.62" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.59" +"@swc/core-win32-ia32-msvc@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.62" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.59": - version: 1.3.59 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.59" +"@swc/core-win32-x64-msvc@npm:1.3.62": + version: 1.3.62 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.62" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.3.59 - resolution: "@swc/core@npm:1.3.59" + version: 1.3.62 + resolution: "@swc/core@npm:1.3.62" dependencies: - "@swc/core-darwin-arm64": 1.3.59 - "@swc/core-darwin-x64": 1.3.59 - "@swc/core-linux-arm-gnueabihf": 1.3.59 - "@swc/core-linux-arm64-gnu": 1.3.59 - "@swc/core-linux-arm64-musl": 1.3.59 - "@swc/core-linux-x64-gnu": 1.3.59 - "@swc/core-linux-x64-musl": 1.3.59 - "@swc/core-win32-arm64-msvc": 1.3.59 - "@swc/core-win32-ia32-msvc": 1.3.59 - "@swc/core-win32-x64-msvc": 1.3.59 + "@swc/core-darwin-arm64": 1.3.62 + "@swc/core-darwin-x64": 1.3.62 + "@swc/core-linux-arm-gnueabihf": 1.3.62 + "@swc/core-linux-arm64-gnu": 1.3.62 + "@swc/core-linux-arm64-musl": 1.3.62 + "@swc/core-linux-x64-gnu": 1.3.62 + "@swc/core-linux-x64-musl": 1.3.62 + "@swc/core-win32-arm64-msvc": 1.3.62 + "@swc/core-win32-ia32-msvc": 1.3.62 + "@swc/core-win32-x64-msvc": 1.3.62 peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -15432,7 +15744,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 0283f39cf49cd12a6dc7062ef9ea4fa93e1a4f622ce46903a09605219f4f47ed5ad03925c6146d09ffe6ee02a89bb14e3c82eb86b4c60ecce4985ea6e078ffcf + checksum: a7a0d9ffdb8a2b0050e0ff89fdb86fe189d9bcb7f91cb6847f1bfe3e2b520a87ea2e83692dfd80b6d541fb5addb2194769484516b8ca6d3c62ad80f1c79a9368 languageName: node linkType: hard @@ -15466,18 +15778,18 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:4.27.0": - version: 4.27.0 - resolution: "@tanstack/query-core@npm:4.27.0" - checksum: 914b4f01ac75632f4603b650e9105f64c739b79250baf76aad16cee216f7bad6060c04eda0c70838fe61a5f6c17883e19fcc3075b2433a906539da95ce785796 +"@tanstack/query-core@npm:4.29.11": + version: 4.29.11 + resolution: "@tanstack/query-core@npm:4.29.11" + checksum: 2a17223f34e99e17d564a15206668eb79324da72e630a47cf41690f92fb091a8669bdc89e9ab1b0d8f0e3e8f579529cfb0aa6f10b4fc58ea81cc7e5caede9229 languageName: node linkType: hard "@tanstack/react-query@npm:^4.1.3": - version: 4.28.0 - resolution: "@tanstack/react-query@npm:4.28.0" + version: 4.29.12 + resolution: "@tanstack/react-query@npm:4.29.12" dependencies: - "@tanstack/query-core": 4.27.0 + "@tanstack/query-core": 4.29.11 use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -15488,7 +15800,7 @@ __metadata: optional: true react-native: optional: true - checksum: 7baa70d22b55cfa22f8a1d92ba9f8379c5436ee81fce3f0e7df4a8c29bb26bfef4a83759cf10f752b40ae2940099fcce88ce91a773240f4999ae91136980c6e3 + checksum: aea231af648688c5eafdbbda0667034221cca8b77e00690ab54950b7cc0296d14646931aee44fc5f18d5ce4d683b5d234b053eed5c0a5c340bbbacdab873a70b languageName: node linkType: hard @@ -16095,12 +16407,12 @@ __metadata: linkType: hard "@types/d3-zoom@npm:^3.0.1": - version: 3.0.2 - resolution: "@types/d3-zoom@npm:3.0.2" + version: 3.0.3 + resolution: "@types/d3-zoom@npm:3.0.3" dependencies: "@types/d3-interpolate": "*" "@types/d3-selection": "*" - checksum: c55b18ec5d5108c265d3e19299f51469e48d215f179a665f5797ac18bf8458dcbefd0c682154f8d8eb9d297a7486a5853115f72444af9cd02b3b4b5d1e4f9b22 + checksum: 1c828538e2b04c47f659ead552824bed1c545dd1934f38abfec95f4a3c1cb4eaf7e107959ebd05a3dfec0166fa98677037ede6f633383c6502b1a05eaeb1d418 languageName: node linkType: hard @@ -16190,13 +16502,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:^0.0.51": - version: 0.0.51 - resolution: "@types/estree@npm:0.0.51" - checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189 - languageName: node - linkType: hard - "@types/event-source-polyfill@npm:^1.0.0": version: 1.0.1 resolution: "@types/event-source-polyfill@npm:1.0.1" @@ -16529,9 +16834,9 @@ __metadata: linkType: hard "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d + version: 7.0.12 + resolution: "@types/json-schema@npm:7.0.12" + checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 languageName: node linkType: hard @@ -16604,6 +16909,13 @@ __metadata: languageName: node linkType: hard +"@types/libsodium-wrappers@npm:^0.7.10": + version: 0.7.10 + resolution: "@types/libsodium-wrappers@npm:0.7.10" + checksum: 717054ebcb5fa553e378144b8d564bed8b691905c0d4e90b95c64d77ba24ec9fe798cb2c58cd61dad545ceacb1f05ab69b5597217f9829f2da7a23f0688d11d0 + languageName: node + linkType: hard + "@types/linkify-it@npm:*": version: 3.0.2 resolution: "@types/linkify-it@npm:3.0.2" @@ -16612,9 +16924,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.194 - resolution: "@types/lodash@npm:4.14.194" - checksum: 113f34831c461469d91feca2dde737f88487732898b4d25e9eb23b087bb193985f864d1e1e0f3b777edc5022e460443588b6000a3b2348c966f72d17eedc35ea + version: 4.14.195 + resolution: "@types/lodash@npm:4.14.195" + checksum: 39b75ca635b3fa943d17d3d3aabc750babe4c8212485a4df166fe0516e39288e14b0c60afc6e21913cc0e5a84734633c71e617e2bd14eaa1cf51b8d7799c432e languageName: node linkType: hard @@ -16762,9 +17074,9 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 20.2.2 - resolution: "@types/node@npm:20.2.2" - checksum: a39bef01b7592fd35c5704c74b9167c154a9a357017db8cd8644461c6e6ad87be19f82dfc65ecb2f35a8fb143fc8a0587f17507bc0b0c9bfee676b3fb4bc89ae + version: 20.2.5 + resolution: "@types/node@npm:20.2.5" + checksum: 38ce7c7e9d76880dc632f71d71e0d5914fcda9d5e9a7095d6c339abda55ca4affb0f2a882aeb29398f8e09d2c5151f0b6586c81c8ccdfe529c34b1ea3337425e languageName: node linkType: hard @@ -16783,9 +17095,9 @@ __metadata: linkType: hard "@types/node@npm:^14.14.31": - version: 14.18.47 - resolution: "@types/node@npm:14.18.47" - checksum: 249467fa37e60bb7ce631616a5fea53f3b957a6792c6a09f7db7cdff85a7410c9e657dd9fa54bcc9d878e58f35407ce35169b84556f46b2154f90bc71063e1d0 + version: 14.18.48 + resolution: "@types/node@npm:14.18.48" + checksum: bc410153cd12b5f5218c2c2a5ab4a65e8dc99ebffe98261a30e9d4beb8f9a0e4ee48c41b850f8cb80da6ed1024e42bba8dee1592869aa5b1826ddb7c29ad6899 languageName: node linkType: hard @@ -16797,16 +17109,16 @@ __metadata: linkType: hard "@types/node@npm:^16.0.0, @types/node@npm:^16.11.26, @types/node@npm:^16.9.2": - version: 16.18.32 - resolution: "@types/node@npm:16.18.32" - checksum: c5966c8e671205b2971ae66ae548ce92235cef89ae1a0f2ecbf118e775923259dc85f57c58cfc56267089d56dfce967700c058276199c6ed9510d0a0b077af2d + version: 16.18.34 + resolution: "@types/node@npm:16.18.34" + checksum: 35c0ffe09687578d002ceb7e706d0ba450546aeb3d2716f28691f2af0063bd274dbde0f741d087ea217f2a8db413eb700d22dfb4f08a67986ff801423bd7be8d languageName: node linkType: hard "@types/node@npm:^18.11.17": - version: 18.16.14 - resolution: "@types/node@npm:18.16.14" - checksum: c11cb3c787236414efe58240ae71854971592554d82ff9d201876ce7cafd51c37aaa001c63602d002e8238614d7331bd6d48ac4c1c0caa826799980b6846fb08 + version: 18.16.16 + resolution: "@types/node@npm:18.16.16" + checksum: 0efad726dd1e0bef71c392c708fc5d78c5b39c46b0ac5186fee74de4ccb1b2e847b3fa468da67d62812f56569da721b15bf31bdc795e6c69b56c73a45079ed2d languageName: node linkType: hard @@ -17448,11 +17760,11 @@ __metadata: linkType: hard "@types/testing-library__jest-dom@npm:^5.9.1": - version: 5.14.5 - resolution: "@types/testing-library__jest-dom@npm:5.14.5" + version: 5.14.6 + resolution: "@types/testing-library__jest-dom@npm:5.14.6" dependencies: "@types/jest": "*" - checksum: dcb05416758fe88c1f4f3aa97b4699fcb46a5ed8f53c6b81721e66155452a48caf12ecb97dfdfd4130678e65efd66b9fca0ac434b3d63affec84842a84a6bf38 + checksum: 92f81cefeacba3b5c06d4b3fbea0341fe2bcaa6e425c026ae262de39f1148c2588cf3003112aa4ac0880c3972ffb77641a863f3be71518d1d8080402c944e326 languageName: node linkType: hard @@ -17527,20 +17839,20 @@ __metadata: linkType: hard "@types/webpack-env@npm:^1.15.2, @types/webpack-env@npm:^1.15.3": - version: 1.18.0 - resolution: "@types/webpack-env@npm:1.18.0" - checksum: ecf4daa31cb37d474ac0ce058d83a3cadeb9881ca8107ae93c2299eaa9954943aae09b43e143c62ccbe4288a14db00c918c9debd707afe17c3998f873eaabc59 + version: 1.18.1 + resolution: "@types/webpack-env@npm:1.18.1" + checksum: 3173c069763e51a96565d602af7e6dac9d772ae4aa6f26cac187cbf599a7f0b88f790b4b050b9dbdb0485daed3061b4a337863f3b8ce66f8a4e51f75ad387c6a languageName: node linkType: hard "@types/webpack@npm:^5.28.0": - version: 5.28.0 - resolution: "@types/webpack@npm:5.28.0" + version: 5.28.1 + resolution: "@types/webpack@npm:5.28.1" dependencies: "@types/node": "*" tapable: ^2.2.0 webpack: ^5 - checksum: a038d7e12dd109c6a8d2eb744fd32070ef94f1655e730fb1443b370db98864c3a0e408638b02d12ba08269b9c012b3be8b801117ced2d1102e7676203fd663ed + checksum: 9f9bfe041382acfab36015f95011f6539705ba116fd9b3b8d7599a6396d996b7efcdb71947dba6d24a1a1bf397d15fdfb3c50d2f73e0aa5366a76198d5ec98b3 languageName: node linkType: hard @@ -17648,22 +17960,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/experimental-utils@npm:^5.0.0": - version: 5.9.0 - resolution: "@typescript-eslint/experimental-utils@npm:5.9.0" - dependencies: - "@types/json-schema": ^7.0.9 - "@typescript-eslint/scope-manager": 5.9.0 - "@typescript-eslint/types": 5.9.0 - "@typescript-eslint/typescript-estree": 5.9.0 - eslint-scope: ^5.1.1 - eslint-utils: ^3.0.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 731b27840642b644e65f4ae321ed47e973ffadacd1aa24a19b02b4b298b5bcfbfa16c2d3d034e87a08c3c45f942c5b974f7619cb143eb23fb950f37418dce791 - languageName: node - linkType: hard - "@typescript-eslint/parser@npm:^5.9.0": version: 5.53.0 resolution: "@typescript-eslint/parser@npm:5.53.0" @@ -17691,23 +17987,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.58.0": - version: 5.58.0 - resolution: "@typescript-eslint/scope-manager@npm:5.58.0" +"@typescript-eslint/scope-manager@npm:5.59.8": + version: 5.59.8 + resolution: "@typescript-eslint/scope-manager@npm:5.59.8" dependencies: - "@typescript-eslint/types": 5.58.0 - "@typescript-eslint/visitor-keys": 5.58.0 - checksum: f0d3df5cc3c461fe63ef89ad886b53c239cc7c1d9061d83d8a9d9c8e087e5501eac84bebff8a954728c17ccea191f235686373d54d2b8b6370af2bcf2b18e062 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.9.0": - version: 5.9.0 - resolution: "@typescript-eslint/scope-manager@npm:5.9.0" - dependencies: - "@typescript-eslint/types": 5.9.0 - "@typescript-eslint/visitor-keys": 5.9.0 - checksum: 46e7ab0cef558e7faf1aa8d122a265e196566c0073292f5b2f9cede1f63f52860be8e4ef90251c15e0922339c15852584cb5337382035baff87f1203c0c8d1b5 + "@typescript-eslint/types": 5.59.8 + "@typescript-eslint/visitor-keys": 5.59.8 + checksum: e1e810ee991cfeb433330b04ee949bb6784abe4dbdb7d9480aa7a7536671b4fec914b7803edf662516c8ecb1b31dcff126797f9923270a529c26e2b00b0ea96f languageName: node linkType: hard @@ -17735,17 +18021,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:5.58.0": - version: 5.58.0 - resolution: "@typescript-eslint/types@npm:5.58.0" - checksum: 8622a73d73220c4a7111537825f488c0271272032a1d4e129dc722bc6e8b3ec84f64469b2ca3b8dae7da3a9c18953ce1449af51f5f757dad60835eb579ad1d2c - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.9.0": - version: 5.9.0 - resolution: "@typescript-eslint/types@npm:5.9.0" - checksum: 7c4e142600aec266b41418dab1d0cee8cace980b6990692df6522de6eab6705bf515aef36180e4a38c62acb10c92fb474269ac6856a4266d6b035068cd83fad3 +"@typescript-eslint/types@npm:5.59.8": + version: 5.59.8 + resolution: "@typescript-eslint/types@npm:5.59.8" + checksum: 559473d5601c849eb0da1874a2ac67c753480beed484ad6f6cda62fa6023273f2c3005c7f2864d9c2afb7c6356412d0d304b57db10c53597207f18a7f6cd4f18 languageName: node linkType: hard @@ -17767,12 +18046,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.58.0": - version: 5.58.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.58.0" +"@typescript-eslint/typescript-estree@npm:5.59.8": + version: 5.59.8 + resolution: "@typescript-eslint/typescript-estree@npm:5.59.8" dependencies: - "@typescript-eslint/types": 5.58.0 - "@typescript-eslint/visitor-keys": 5.58.0 + "@typescript-eslint/types": 5.59.8 + "@typescript-eslint/visitor-keys": 5.59.8 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -17781,25 +18060,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 51b668ec858db0c040a71dff526273945cee4ba5a9b240528d503d02526685882d900cf071c6636a4d9061ed3fd4a7274f7f1a23fba55c4b48b143344b4009c7 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:5.9.0": - version: 5.9.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.9.0" - dependencies: - "@typescript-eslint/types": 5.9.0 - "@typescript-eslint/visitor-keys": 5.9.0 - debug: ^4.3.2 - globby: ^11.0.4 - is-glob: ^4.0.3 - semver: ^7.3.5 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 71e3f720e335fb08e66950d32b723484aa4d1f4a3163e82259f4be2d11091545070c2e71472be470403cb6f82bf1abe84fa89c1d0b1d47adc8550b3f70aabfb5 + checksum: d93371cc866f573a6a1ddc0eb10d498a8e59f36763a99ce21da0737fff2b4c942eef1587216aad273f8d896ebc0b19003677cba63a27d2646aa2c087638963eb languageName: node linkType: hard @@ -17821,21 +18082,21 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.58.0": - version: 5.58.0 - resolution: "@typescript-eslint/utils@npm:5.58.0" +"@typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.57.0, @typescript-eslint/utils@npm:^5.58.0": + version: 5.59.8 + resolution: "@typescript-eslint/utils@npm:5.59.8" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@types/json-schema": ^7.0.9 "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.58.0 - "@typescript-eslint/types": 5.58.0 - "@typescript-eslint/typescript-estree": 5.58.0 + "@typescript-eslint/scope-manager": 5.59.8 + "@typescript-eslint/types": 5.59.8 + "@typescript-eslint/typescript-estree": 5.59.8 eslint-scope: ^5.1.1 semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c618ae67963ecf96b1492c09afaeb363f542f0d6780bcac4af3c26034e3b20034666b2d523aa94821df813aafb57a0b150a7d5c2224fe8257452ad1de2237a58 + checksum: cbaa057485c7f52c45d0dfb4f5a8e9273abccb1c52dcb4426a79f9e71d2c1062cf2525bad6d4aca5ec42db3fe723d749843bcade5a323bde7fbe4b5d5b5d5c3b languageName: node linkType: hard @@ -17849,29 +18110,19 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.58.0": - version: 5.58.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.58.0" +"@typescript-eslint/visitor-keys@npm:5.59.8": + version: 5.59.8 + resolution: "@typescript-eslint/visitor-keys@npm:5.59.8" dependencies: - "@typescript-eslint/types": 5.58.0 + "@typescript-eslint/types": 5.59.8 eslint-visitor-keys: ^3.3.0 - checksum: ab2d1f37660559954c840429ef78bbf71834063557e3e68e435005b4987970b9356fdf217ead53f7a57f66f5488dc478062c5c44bf17053a8bf041733539b98f + checksum: 6bfa7918dbb0e08d8a7404aeeef7bcd1a85736dc8d01614d267c0c5ec10f94d2746b50a945bf5c82c54fda67926e8deaeba8565c919da17f725fc11209ef8987 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.9.0": - version: 5.9.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.9.0" - dependencies: - "@typescript-eslint/types": 5.9.0 - eslint-visitor-keys: ^3.0.0 - checksum: 34a595b83b0e7d4f387d6c81b272804b94a1a91478c5f856fdfdd227595bf8562bf3f5d732606d10b4522c3f2617d09d4bacd2193f757a324ea66b3144a68903 - languageName: node - linkType: hard - -"@uiw/codemirror-extensions-basic-setup@npm:4.19.16": - version: 4.19.16 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.19.16" +"@uiw/codemirror-extensions-basic-setup@npm:4.21.1": + version: 4.21.1 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.21.1" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/commands": ^6.0.0 @@ -17888,19 +18139,19 @@ __metadata: "@codemirror/search": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: e5263f19e1ca838ac9cc7c0ab03d4d1ca2453ff306e17d354b0772954c14cfaa146b0a00ed2d5690f5687aeafdd5f2f5587efc573ffb5714bd77f6af46444f74 + checksum: ac1f90f9396b5542bd30222c513354e6756972c455931e4a48327ceaadb4c0c9fa0763a87c6d166ee3cfe45941cb348661f6ee4672f71fd67e8708e73231095b languageName: node linkType: hard "@uiw/react-codemirror@npm:^4.9.3": - version: 4.19.16 - resolution: "@uiw/react-codemirror@npm:4.19.16" + version: 4.21.1 + resolution: "@uiw/react-codemirror@npm:4.21.1" 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.16 + "@uiw/codemirror-extensions-basic-setup": 4.21.1 codemirror: ^6.0.0 peerDependencies: "@babel/runtime": ">=7.11.0" @@ -17910,158 +18161,158 @@ __metadata: codemirror: ">=6.0.0" react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 0625a544eb53ff1236e75dc4c81400285bf4dfdacd5c9c71129066f7decb7e902c97f756c6edc854d44b586ad4b0d3d303df065429532df9085c5f6b1adbad80 + checksum: 359848cad18ae9a70d9767e07f9f520459b0794f32b9558ec442db92ea83f392a5f0b0fcab56804328e18bf4d1371a18ef2eaa5847c5e94603ff9a2dc1123a26 languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ast@npm:1.11.1" +"@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/ast@npm:1.11.6" dependencies: - "@webassemblyjs/helper-numbers": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - checksum: 1eee1534adebeece635362f8e834ae03e389281972611408d64be7895fc49f48f98fddbbb5339bf8a72cb101bcb066e8bca3ca1bf1ef47dadf89def0395a8d87 + "@webassemblyjs/helper-numbers": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + checksum: 38ef1b526ca47c210f30975b06df2faf1a8170b1636ce239fc5738fc231ce28389dd61ecedd1bacfc03cbe95b16d1af848c805652080cb60982836eb4ed2c6cf languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.1" - checksum: b8efc6fa08e4787b7f8e682182d84dfdf8da9d9c77cae5d293818bc4a55c1f419a87fa265ab85252b3e6c1fd323d799efea68d825d341a7c365c64bc14750e97 +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.1" - checksum: 0792813f0ed4a0e5ee0750e8b5d0c631f08e927f4bdfdd9fe9105dc410c786850b8c61bff7f9f515fdfb149903bec3c976a1310573a4c6866a94d49bc7271959 +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.11.1" - checksum: a337ee44b45590c3a30db5a8b7b68a717526cf967ada9f10253995294dbd70a58b2da2165222e0b9830cd4fc6e4c833bf441a721128d1fe2e9a7ab26b36003ce +"@webassemblyjs/helper-buffer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-buffer@npm:1.11.6" + checksum: b14d0573bf680d22b2522e8a341ec451fddd645d1f9c6bd9012ccb7e587a2973b86ab7b89fe91e1c79939ba96095f503af04369a3b356c8023c13a5893221644 languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.1" +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" dependencies: - "@webassemblyjs/floating-point-hex-parser": 1.11.1 - "@webassemblyjs/helper-api-error": 1.11.1 + "@webassemblyjs/floating-point-hex-parser": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 "@xtuc/long": 4.2.2 - checksum: 44d2905dac2f14d1e9b5765cf1063a0fa3d57295c6d8930f6c59a36462afecc6e763e8a110b97b342a0f13376166c5d41aa928e6ced92e2f06b071fd0db59d3a + checksum: f4b562fa219f84368528339e0f8d273ad44e047a07641ffcaaec6f93e5b76fd86490a009aa91a294584e1436d74b0a01fa9fde45e333a4c657b58168b04da424 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.1" - checksum: eac400113127832c88f5826bcc3ad1c0db9b3dbd4c51a723cfdb16af6bfcbceb608170fdaac0ab7731a7e18b291be7af68a47fcdb41cfe0260c10857e7413d97 +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 3535ef4f1fba38de3475e383b3980f4bbf3de72bbb631c2b6584c7df45be4eccd62c6ff48b5edd3f1bcff275cfd605a37679ec199fc91fd0a7705d7f1e3972dc languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.1" +"@webassemblyjs/helper-wasm-section@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - checksum: 617696cfe8ecaf0532763162aaf748eb69096fb27950219bb87686c6b2e66e11cd0614d95d319d0ab1904bc14ebe4e29068b12c3e7c5e020281379741fe4bedf + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + checksum: b2cf751bf4552b5b9999d27bbb7692d0aca75260140195cb58ea6374d7b9c2dc69b61e10b211a0e773f66209c3ddd612137ed66097e3684d7816f854997682e9 languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ieee754@npm:1.11.1" +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" dependencies: "@xtuc/ieee754": ^1.2.0 - checksum: 23a0ac02a50f244471631802798a816524df17e56b1ef929f0c73e3cde70eaf105a24130105c60aff9d64a24ce3b640dad443d6f86e5967f922943a7115022ec + checksum: 13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/leb128@npm:1.11.1" +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" dependencies: "@xtuc/long": 4.2.2 - checksum: 33ccc4ade2f24de07bf31690844d0b1ad224304ee2062b0e464a610b0209c79e0b3009ac190efe0e6bd568b0d1578d7c3047fc1f9d0197c92fc061f56224ff4a + checksum: 7ea942dc9777d4b18a5ebfa3a937b30ae9e1d2ce1fee637583ed7f376334dd1d4274f813d2e250056cca803e0952def4b954913f1a3c9068bcd4ab4ee5143bf0 languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/utf8@npm:1.11.1" - checksum: 972c5cfc769d7af79313a6bfb96517253a270a4bf0c33ba486aa43cac43917184fb35e51dfc9e6b5601548cd5931479a42e42c89a13bb591ffabebf30c8a6a0b +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 807fe5b5ce10c390cfdd93e0fb92abda8aebabb5199980681e7c3743ee3306a75729bcd1e56a3903980e96c885ee53ef901fcbaac8efdfa480f9c0dae1d08713 languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.11.1" +"@webassemblyjs/wasm-edit@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-edit@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/helper-wasm-section": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - "@webassemblyjs/wasm-opt": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - "@webassemblyjs/wast-printer": 1.11.1 - checksum: 6d7d9efaec1227e7ef7585a5d7ff0be5f329f7c1c6b6c0e906b18ed2e9a28792a5635e450aca2d136770d0207225f204eff70a4b8fd879d3ac79e1dcc26dbeb9 + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/helper-wasm-section": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-opt": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + "@webassemblyjs/wast-printer": 1.11.6 + checksum: 29ce75870496d6fad864d815ebb072395a8a3a04dc9c3f4e1ffdc63fc5fa58b1f34304a1117296d8240054cfdbc38aca88e71fb51483cf29ffab0a61ef27b481 languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.11.1" +"@webassemblyjs/wasm-gen@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/ieee754": 1.11.1 - "@webassemblyjs/leb128": 1.11.1 - "@webassemblyjs/utf8": 1.11.1 - checksum: 1f6921e640293bf99fb16b21e09acb59b340a79f986c8f979853a0ae9f0b58557534b81e02ea2b4ef11e929d946708533fd0693c7f3712924128fdafd6465f5b + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: a645a2eecbea24833c3260a249704a7f554ef4a94c6000984728e94bb2bc9140a68dfd6fd21d5e0bbb09f6dfc98e083a45760a83ae0417b41a0196ff6d45a23a languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.11.1" +"@webassemblyjs/wasm-opt@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - checksum: 21586883a20009e2b20feb67bdc451bbc6942252e038aae4c3a08e6f67b6bae0f5f88f20bfc7bd0452db5000bacaf5ab42b98cf9aa034a6c70e9fc616142e1db + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + checksum: b4557f195487f8e97336ddf79f7bef40d788239169aac707f6eaa2fa5fe243557c2d74e550a8e57f2788e70c7ae4e7d32f7be16101afe183d597b747a3bdd528 languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.11.1" +"@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-api-error": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/ieee754": 1.11.1 - "@webassemblyjs/leb128": 1.11.1 - "@webassemblyjs/utf8": 1.11.1 - checksum: 1521644065c360e7b27fad9f4bb2df1802d134dd62937fa1f601a1975cde56bc31a57b6e26408b9ee0228626ff3ba1131ae6f74ffb7d718415b6528c5a6dbfc2 + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: 8200a8d77c15621724a23fdabe58d5571415cda98a7058f542e670ea965dd75499f5e34a48675184947c66f3df23adf55df060312e6d72d57908e3f049620d8a languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wast-printer@npm:1.11.1" +"@webassemblyjs/wast-printer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wast-printer@npm:1.11.6" dependencies: - "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/ast": 1.11.6 "@xtuc/long": 4.2.2 - checksum: f15ae4c2441b979a3b4fce78f3d83472fb22350c6dc3fd34bfe7c3da108e0b2360718734d961bba20e7716cb8578e964b870da55b035e209e50ec9db0378a3f7 + checksum: d2fa6a4c427325ec81463e9c809aa6572af6d47f619f3091bf4c4a6fc34f1da3df7caddaac50b8e7a457f8784c62cd58c6311b6cb69b0162ccd8d4c072f79cf8 languageName: node linkType: hard @@ -18160,6 +18411,15 @@ __metadata: languageName: node linkType: hard +"@wry/trie@npm:^0.4.0": + version: 0.4.3 + resolution: "@wry/trie@npm:0.4.3" + dependencies: + tslib: ^2.3.0 + checksum: 106e021125cfafd22250a6631a0438a6a3debae7bd73f6db87fe42aa0757fe67693db0dfbe200ae1f60ba608c3e09ddb8a4e2b3527d56ed0a7e02aa0ee4c94e1 + languageName: node + linkType: hard + "@xmldom/xmldom@npm:^0.7.0, @xmldom/xmldom@npm:^0.7.5, @xmldom/xmldom@npm:^0.7.6": version: 0.7.9 resolution: "@xmldom/xmldom@npm:0.7.9" @@ -18269,12 +18529,12 @@ __metadata: languageName: node linkType: hard -"acorn-import-assertions@npm:^1.7.6": - version: 1.7.6 - resolution: "acorn-import-assertions@npm:1.7.6" +"acorn-import-assertions@npm:^1.9.0": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" peerDependencies: acorn: ^8 - checksum: bc8a1585abd70ebfb3a6b3112f5e3974fee3ac598230f916a3857f0ad4fa7e72197be532c49d1feeb83678ef264f34bee9bf1934dfb2f276d88468134a51fa9f + checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c languageName: node linkType: hard @@ -21308,9 +21568,9 @@ __metadata: linkType: hard "core-js@npm:^3.6.5": - version: 3.29.1 - resolution: "core-js@npm:3.29.1" - checksum: b38446dbfcfd3887b3d4922990da487e2c95044cb4c5717aaf95e786a4c6b218f05c056c7ed6c699169b9794a49fec890e402659d54661fc56965a0eb717e7bd + version: 3.30.2 + resolution: "core-js@npm:3.30.2" + checksum: 73d47e2b9d9f502800973982d08e995bbf04832e20b04e04be31dd7607247158271315e9328788a2408190e291c7ffbefad141167b1e57dea9f983e1e723541e languageName: node linkType: hard @@ -21453,20 +21713,20 @@ __metadata: linkType: hard "cron@npm:^2.0.0": - version: 2.3.0 - resolution: "cron@npm:2.3.0" + version: 2.3.1 + resolution: "cron@npm:2.3.1" dependencies: luxon: ^3.2.1 - checksum: 70b220f3fc4b6bcd594f7f2c690bbf7a3a03b0e081eb0119f8e3ca21635f2da07d89e038d561d4c0742c8b0dd04977f25e307d0608455ef9f527a556b2da92fc + checksum: ac27c257cb8dba4b51978b4767119fc79bfc0dfa35ef0be2533bc4142ae006130515236e2102d04ee3ce44bffc2a4e37a3bee18a2152bbb303bf5ff944e25204 languageName: node linkType: hard "cronstrue@npm:^2.2.0": - version: 2.24.0 - resolution: "cronstrue@npm:2.24.0" + version: 2.27.0 + resolution: "cronstrue@npm:2.27.0" bin: cronstrue: bin/cli.js - checksum: 2c7d4cfe43bec7b57b1824772641271bb5f5ed0209336ea53796f97b17966dd95cf15ae890f7c2494f639ba489d225bfb882950cda0ec7e5453fa7bf236842dd + checksum: 310d933c4448896519c203a434dc1ede7029967df941e810f02bafb62146045c16df4987edde344d757bafb6d45f63c9ecb7385df19b985ca91486f4efa6ff7b languageName: node linkType: hard @@ -21603,20 +21863,20 @@ __metadata: linkType: hard "css-loader@npm:^6.5.1": - version: 6.7.4 - resolution: "css-loader@npm:6.7.4" + version: 6.8.1 + resolution: "css-loader@npm:6.8.1" dependencies: icss-utils: ^5.1.0 postcss: ^8.4.21 postcss-modules-extract-imports: ^3.0.0 - postcss-modules-local-by-default: ^4.0.1 + postcss-modules-local-by-default: ^4.0.3 postcss-modules-scope: ^3.0.0 postcss-modules-values: ^4.0.0 postcss-value-parser: ^4.2.0 semver: ^7.3.8 peerDependencies: webpack: ^5.0.0 - checksum: 6021fa9e375d767b9675e295c1513f2ee4ae04f76d9de69a75b8446e05f6e02b2170407ea72939925b788dcd5aa308527f6b41be3870dc1f4b0bfff8d2532c6e + checksum: 7c1784247bdbe76dc5c55fb1ac84f1d4177a74c47259942c9cfdb7a8e6baef11967a0bc85ac285f26bd26d5059decb848af8154a03fdb4f4894f41212f45eef3 languageName: node linkType: hard @@ -22970,8 +23230,8 @@ __metadata: linkType: hard "elastic-builder@npm:^2.16.0": - version: 2.18.1 - resolution: "elastic-builder@npm:2.18.1" + version: 2.19.0 + resolution: "elastic-builder@npm:2.19.0" dependencies: lodash.has: ^4.5.2 lodash.hasin: ^4.5.2 @@ -22981,7 +23241,7 @@ __metadata: lodash.isobject: ^3.0.2 lodash.isstring: ^4.0.1 lodash.omit: ^4.5.0 - checksum: 54093daadc1fc3666ac8eef0a268267761e92a3fbb524e51936cf944ceeaeb231a269fc8ae9fb902ca41c976c76c0c037da692a34577d705da301ed727bd8e07 + checksum: 14c3a2e2a76f44425dfff4c57e16f077553845976422cb35c35d235e1ea59942b86c379e516828e8390e3c53360a564ff94ee3aa961a5f2fb791da7e5e97012c languageName: node linkType: hard @@ -23067,13 +23327,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.10.0": - version: 5.10.0 - resolution: "enhanced-resolve@npm:5.10.0" +"enhanced-resolve@npm:^5.14.1": + version: 5.14.1 + resolution: "enhanced-resolve@npm:5.14.1" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: 0bb9830704db271610f900e8d79d70a740ea16f251263362b0c91af545576d09fe50103496606c1300a05e588372d6f9780a9bc2e30ce8ef9b827ec8f44687ff + checksum: ad2a31928b6649eed40d364838449587f731baa63863e83d2629bebaa8be1eabac18b90f89c1784bc805b0818363e99b22547159edd485d7e5ccf18cdc640642 languageName: node linkType: hard @@ -23215,13 +23475,20 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^0.9.0, es-module-lexer@npm:^0.9.3": +"es-module-lexer@npm:^0.9.3": version: 0.9.3 resolution: "es-module-lexer@npm:0.9.3" checksum: 84bbab23c396281db2c906c766af58b1ae2a1a2599844a504df10b9e8dc77ec800b3211fdaa133ff700f5703d791198807bba25d9667392d27a5e9feda344da8 languageName: node linkType: hard +"es-module-lexer@npm:^1.2.1": + version: 1.2.1 + resolution: "es-module-lexer@npm:1.2.1" + checksum: c4145b853e1491eaa5d591e4580926d242978c38071ad3d09165c3b6d50314cc0ae3bf6e1dec81a9e53768b9299df2063d2e4a67d7742a5029ddeae6c4fc26f0 + languageName: node + linkType: hard + "es-shim-unscopables@npm:^1.0.0": version: 1.0.0 resolution: "es-shim-unscopables@npm:1.0.0" @@ -23775,16 +24042,16 @@ __metadata: linkType: hard "eslint-plugin-deprecation@npm:^1.3.2": - version: 1.3.3 - resolution: "eslint-plugin-deprecation@npm:1.3.3" + version: 1.4.1 + resolution: "eslint-plugin-deprecation@npm:1.4.1" dependencies: - "@typescript-eslint/experimental-utils": ^5.0.0 + "@typescript-eslint/utils": ^5.57.0 tslib: ^2.3.1 tsutils: ^3.21.0 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: ^3.7.5 || ^4.0.0 - checksum: 5e14d7bc8245a14784623632d43a6210880a4aad4c029fd44686a5516c248287f32406ff230f6e9d238784854b24cd09da953ec8f73d9d19a7c4b3905884e432 + typescript: ^3.7.5 || ^4.0.0 || ^5.0.0 + checksum: 75c7535d820d1749664705724cc979d706da126a2277f2937467f70156a2c220b10c66670f18226801c9555e4cd02312d353936f14d5752c2d2c648455fe5769 languageName: node linkType: hard @@ -23952,7 +24219,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.0.0, eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": version: 3.4.1 resolution: "eslint-visitor-keys@npm:3.4.1" checksum: f05121d868202736b97de7d750847a328fcfa8593b031c95ea89425333db59676ac087fa905eba438d0a3c5769632f828187e0c1a0d271832a2153c1d3661c2c @@ -23976,14 +24243,14 @@ __metadata: linkType: hard "eslint@npm:^8.33.0, eslint@npm:^8.6.0": - version: 8.41.0 - resolution: "eslint@npm:8.41.0" + version: 8.42.0 + resolution: "eslint@npm:8.42.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.4.0 "@eslint/eslintrc": ^2.0.3 - "@eslint/js": 8.41.0 - "@humanwhocodes/config-array": ^0.11.8 + "@eslint/js": 8.42.0 + "@humanwhocodes/config-array": ^0.11.10 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 ajv: ^6.10.0 @@ -24020,7 +24287,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 09979a6f8451dcc508a7005b6670845c8a518376280b3fd96657a406b8b6ef29d0e480d1ba11b4eb48da93d607e0c55c9b877676fe089d09973ec152354e23b2 + checksum: 07105397b5f2ff4064b983b8971e8c379ec04b1dfcc9d918976b3e00377189000161dac991d82ba14f8759e466091b8c71146f602930ca810c290ee3fcb3faf0 languageName: node linkType: hard @@ -24226,6 +24493,7 @@ __metadata: "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/integration-react": "workspace:^" + "@backstage/plugin-adr": "workspace:^" "@backstage/plugin-airbrake": "workspace:^" "@backstage/plugin-apache-airflow": "workspace:^" "@backstage/plugin-api-docs": "workspace:^" @@ -24236,6 +24504,7 @@ __metadata: "@backstage/plugin-catalog-graph": "workspace:^" "@backstage/plugin-catalog-import": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" + "@backstage/plugin-catalog-unprocessed-entities": "workspace:^" "@backstage/plugin-circleci": "workspace:^" "@backstage/plugin-cloudbuild": "workspace:^" "@backstage/plugin-code-coverage": "workspace:^" @@ -24289,7 +24558,7 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.61 "@octokit/rest": ^19.0.3 - "@oriflame/backstage-plugin-score-card": ^0.6.0 + "@oriflame/backstage-plugin-score-card": ^0.7.0 "@roadiehq/backstage-plugin-buildkite": ^2.0.8 "@roadiehq/backstage-plugin-github-insights": ^2.0.5 "@roadiehq/backstage-plugin-github-pull-requests": ^2.2.7 @@ -24328,6 +24597,7 @@ __metadata: "@backstage/plugin-app-backend": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" "@backstage/plugin-kubernetes-backend": "workspace:^" "@backstage/plugin-permission-backend": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" @@ -24362,6 +24632,7 @@ __metadata: "@backstage/plugin-azure-sites-backend": "workspace:^" "@backstage/plugin-badges-backend": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-code-coverage-backend": "workspace:^" "@backstage/plugin-devtools-backend": "workspace:^" @@ -24382,6 +24653,7 @@ __metadata: "@backstage/plugin-proxy-backend": "workspace:^" "@backstage/plugin-rollbar-backend": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "workspace:^" "@backstage/plugin-scaffolder-backend-module-rails": "workspace:^" "@backstage/plugin-search-backend": "workspace:^" "@backstage/plugin-search-backend-module-elasticsearch": "workspace:^" @@ -24395,6 +24667,9 @@ __metadata: "@backstage/plugin-todo-backend": "workspace:^" "@gitbeaker/node": ^35.1.0 "@octokit/rest": ^19.0.3 + "@opentelemetry/api": ^1.4.1 + "@opentelemetry/exporter-prometheus": ^0.39.1 + "@opentelemetry/sdk-metrics": ^1.13.0 "@types/dockerode": ^3.3.0 "@types/express": ^4.17.6 "@types/express-serve-static-core": ^4.17.5 @@ -24533,7 +24808,7 @@ __metadata: languageName: node linkType: hard -"express-promise-router@npm:^4.1.0": +"express-promise-router@npm:^4.1.0, express-promise-router@npm:^4.1.1": version: 4.1.1 resolution: "express-promise-router@npm:4.1.1" dependencies: @@ -25360,6 +25635,15 @@ __metadata: languageName: node linkType: hard +"front-matter@npm:^4.0.2": + version: 4.0.2 + resolution: "front-matter@npm:4.0.2" + dependencies: + js-yaml: ^3.13.1 + checksum: a5b4c36d75a820301ebf31db0f677332d189c4561903ab6853eaa0504b43634f98557dbf87752e09043dbd2c9dcc14b4bcf9151cb319c8ad7e26edb203c0cd23 + languageName: node + linkType: hard + "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -26110,7 +26394,7 @@ __metadata: languageName: node linkType: hard -"graphql-tag@npm:^2.11.0, graphql-tag@npm:^2.12.6": +"graphql-tag@npm:^2.10.3, graphql-tag@npm:^2.11.0, graphql-tag@npm:^2.12.6": version: 2.12.6 resolution: "graphql-tag@npm:2.12.6" dependencies: @@ -26418,10 +26702,10 @@ __metadata: languageName: node linkType: hard -"headers-polyfill@npm:^3.1.0": - version: 3.1.0 - resolution: "headers-polyfill@npm:3.1.0" - checksum: a95257065684653b7185efbb9a380c547ea832002991b5adf0d90cd222073da2701be9dc2849d1970ecf15e8c35b383984358566afe6e76ca8ff1dbd7cdce3af +"headers-polyfill@npm:^3.1.0, headers-polyfill@npm:^3.1.2": + version: 3.1.2 + resolution: "headers-polyfill@npm:3.1.2" + checksum: 510ca9637ef652404dbd432e680418f8d418ba18094ef2f64c3d8de955ebf6e68d553c7f0aeaa5fc937d130b139c1e2d7c2066cd4cf0f740a4627924eaaee9db languageName: node linkType: hard @@ -27548,10 +27832,10 @@ __metadata: languageName: node linkType: hard -"is-node-process@npm:^1.0.1": - version: 1.0.1 - resolution: "is-node-process@npm:1.0.1" - checksum: 3ddb8a892a00f6eb9c2aea7e7e1426b8683512d9419933d95114f4f64b5455e26601c23a31c0682463890032136dd98a326988a770ab6b4eed54a43ade8bed50 +"is-node-process@npm:^1.2.0": + version: 1.2.0 + resolution: "is-node-process@npm:1.2.0" + checksum: 930765cdc6d81ab8f1bbecbea4a8d35c7c6d88a3ff61f3630e0fc7f22d624d7661c1df05c58547d0eb6a639dfa9304682c8e342c4113a6ed51472b704cee2928 languageName: node linkType: hard @@ -29051,15 +29335,15 @@ __metadata: linkType: hard "json-schema-library@npm:^7.3.9": - version: 7.4.7 - resolution: "json-schema-library@npm:7.4.7" + version: 7.4.8 + resolution: "json-schema-library@npm:7.4.8" dependencies: "@sagold/json-pointer": ^5.0.0 "@sagold/json-query": ^6.0.0 deepmerge: ^4.2.2 fast-deep-equal: ^3.1.3 valid-url: ^1.0.9 - checksum: e738f0b149d52949d854a4de718e79576fabbae206bffdb1cf895ed0b87bbf255f80f162f1924fb89311f6ac1a8e3ed0a5940b709bc3a091ad217f64de70cf60 + checksum: bb7b3d13567f72e3c003300e66cd48bf0b8c02e107aa83d11110bf017ae522f63b702faf2f4e854397655b3a12970431df46f8b9e48642ef0de51ce17532912f languageName: node linkType: hard @@ -29812,6 +30096,22 @@ __metadata: languageName: node linkType: hard +"libsodium-wrappers@npm:^0.7.11": + version: 0.7.11 + resolution: "libsodium-wrappers@npm:0.7.11" + dependencies: + libsodium: ^0.7.11 + checksum: 6a6ef47b2213e3fb4687196c28fee4c9885f70d89547d845e62d96014d3d5ad9f59cb05fadc601debc0031a3cfd0b9b416d7efbeb5bf66db6aa0ed69f55a6293 + languageName: node + linkType: hard + +"libsodium@npm:^0.7.11": + version: 0.7.11 + resolution: "libsodium@npm:0.7.11" + checksum: 0a3493ac1829d1e346178b6984c4eb449dc77157c906876441386c0c653142e3fa56f623ce980bb50e580196578689298c9cd406ce6d514904090e370c6bc0f7 + languageName: node + linkType: hard + "lilconfig@npm:2.1.0, lilconfig@npm:^2.0.3": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" @@ -30012,9 +30312,9 @@ __metadata: linkType: hard "loader-utils@npm:^3.2.0": - version: 3.2.0 - resolution: "loader-utils@npm:3.2.0" - checksum: c7b9a8dc4b3bc19e9ef563c48e3a18ea9f8bb2da1ad38a12e4b88358cfba5f148a7baf12d78fe78ffcb718ce1e062ab31fcf5c148459f1247a672a4213471e80 + version: 3.2.1 + resolution: "loader-utils@npm:3.2.1" + checksum: 4e3ea054cdc8be1ab1f1238f49f42fdf0483039eff920fb1d442039f3f0ad4ebd11fb8e584ccdf2cb7e3c56b3d40c1832416e6408a55651b843da288960cc792 languageName: node linkType: hard @@ -30214,7 +30514,7 @@ __metadata: languageName: node linkType: hard -"lodash.merge@npm:^4.6.2": +"lodash.merge@npm:4.6.2, lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 @@ -31753,9 +32053,9 @@ __metadata: languageName: node linkType: hard -"msw@npm:^1.0.0, msw@npm:^1.0.1": - version: 1.2.0 - resolution: "msw@npm:1.2.0" +"msw@npm:^1.0.0, msw@npm:^1.0.1, msw@npm:^1.2.1": + version: 1.2.1 + resolution: "msw@npm:1.2.1" dependencies: "@mswjs/cookies": ^0.2.2 "@mswjs/interceptors": ^0.17.5 @@ -31766,12 +32066,12 @@ __metadata: chokidar: ^3.4.2 cookie: ^0.4.2 graphql: ^15.0.0 || ^16.0.0 - headers-polyfill: ^3.1.0 + headers-polyfill: ^3.1.2 inquirer: ^8.2.0 - is-node-process: ^1.0.1 + is-node-process: ^1.2.0 js-levenshtein: ^1.1.6 node-fetch: ^2.6.7 - outvariant: ^1.3.0 + outvariant: ^1.4.0 path-to-regexp: ^6.2.0 strict-event-emitter: ^0.4.3 type-fest: ^2.19.0 @@ -31783,7 +32083,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: 2cea7fe0f2ebb59b11534896cbaa91dca65f4fb2272402549079cc4190847fc42f5367f331c552d576d59a3521f498da0384d53cf4960beaebd6165bbc44593b + checksum: 97b9c5ffc81b4380dd24ff40ac52ca02f406c88f86d8209ba991da19aad0bcfc37e807794aa1b9bf29f89cd86fd31e492bf4418c5ff02559b4f80d6ce4fb417b languageName: node linkType: hard @@ -32678,18 +32978,18 @@ __metadata: linkType: hard "octokit@npm:^2.0.0, octokit@npm:^2.0.4": - version: 2.0.7 - resolution: "octokit@npm:2.0.7" + version: 2.0.19 + resolution: "octokit@npm:2.0.19" dependencies: - "@octokit/app": ^13.0.5 - "@octokit/core": ^4.0.4 - "@octokit/oauth-app": ^4.0.6 - "@octokit/plugin-paginate-rest": ^4.0.0 - "@octokit/plugin-rest-endpoint-methods": ^6.0.0 - "@octokit/plugin-retry": ^3.0.9 - "@octokit/plugin-throttling": ^4.0.1 - "@octokit/types": ^7.0.0 - checksum: 26eeba2b3d0614db4147980f6a9acb2a595f3ea6d78e9db5ef485b2c1b4606724e8a0b4c342a9f264903242ada5c329ee82eccb3fd8df822dff1944aa5bf20db + "@octokit/app": ^13.1.5 + "@octokit/core": ^4.2.1 + "@octokit/oauth-app": ^4.2.1 + "@octokit/plugin-paginate-rest": ^6.1.0 + "@octokit/plugin-rest-endpoint-methods": ^7.1.1 + "@octokit/plugin-retry": ^4.1.3 + "@octokit/plugin-throttling": ^5.2.2 + "@octokit/types": ^9.2.2 + checksum: cc0acd5427a3dc25f70ca0ffd2e828cc7bcd51c7e4586caf06e40353f87084addd4ed6df59d441b087b9cf597540069d21bc75c27b2836e78a59e5f9f3fbec38 languageName: node linkType: hard @@ -32793,9 +33093,9 @@ __metadata: linkType: hard "openapi-types@npm:^12.0.0": - version: 12.1.1 - resolution: "openapi-types@npm:12.1.1" - checksum: 881dbc514e22046eb790c81370e912ca2daf5beec13cde77e8a15b5ec2635140487abdebf681ec969777067bcbb56b3c0880a0a22aa236d075d8fca5da9535ad + version: 12.1.3 + resolution: "openapi-types@npm:12.1.3" + checksum: 7fa5547f87a58d2aa0eba6e91d396f42d7d31bc3ae140e61b5d60b47d2fd068b48776f42407d5a8da7280cf31195aa128c2fc285e8bb871d1105edee5647a0bb languageName: node linkType: hard @@ -32912,10 +33212,10 @@ __metadata: languageName: node linkType: hard -"outvariant@npm:^1.2.1, outvariant@npm:^1.3.0": - version: 1.3.0 - resolution: "outvariant@npm:1.3.0" - checksum: ac76ca375c1c642989e1c74f0e9ebac84c05bc9fdc8f28be949c16fae1658e9f1f2fb1133fe3cc1e98afabef78fe4298fe9360b5734baf8e6ad440c182680848 +"outvariant@npm:^1.2.1, outvariant@npm:^1.4.0": + version: 1.4.0 + resolution: "outvariant@npm:1.4.0" + checksum: ec32dfc315c464bb6e4906b2f450d259ce0b86caf70b70b249054359d9af21a7fccf53a8b6aa232f8d718449e31c1cfa594e6ebffaafe7bf908b502495256d7b languageName: node linkType: hard @@ -34134,16 +34434,16 @@ __metadata: languageName: node linkType: hard -"postcss-modules-local-by-default@npm:^4.0.0, postcss-modules-local-by-default@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-modules-local-by-default@npm:4.0.1" +"postcss-modules-local-by-default@npm:^4.0.0, postcss-modules-local-by-default@npm:^4.0.3": + version: 4.0.3 + resolution: "postcss-modules-local-by-default@npm:4.0.3" dependencies: icss-utils: ^5.0.0 postcss-selector-parser: ^6.0.2 postcss-value-parser: ^4.1.0 peerDependencies: postcss: ^8.1.0 - checksum: 1a95eb8bc54a363a77dbd77a0a88f500e7937ecbed5903becef9362eace28de406e6fdf62640126c22964678370e87eb10481eea2703702772935b4515603bfd + checksum: 2f8083687f3d6067885f8863dd32dbbb4f779cfcc7e52c17abede9311d84faf6d3ed8760e7c54c6380281732ae1f78e5e56a28baf3c271b33f450a11c9e30485 languageName: node linkType: hard @@ -34375,13 +34675,13 @@ __metadata: linkType: hard "postcss@npm:^8.1.0, postcss@npm:^8.4.21": - version: 8.4.23 - resolution: "postcss@npm:8.4.23" + version: 8.4.24 + resolution: "postcss@npm:8.4.24" dependencies: nanoid: ^3.3.6 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 8bb9d1b2ea6e694f8987d4f18c94617971b2b8d141602725fedcc2222fdc413b776a6e1b969a25d627d7b2681ca5aabb56f59e727ef94072e1b6ac8412105a2f + checksum: 814e2126dacfea313588eda09cc99a9b4c26ec55c059188aa7a916d20d26d483483106dc5ff9e560731b59f45c5bb91b945dfadc670aed875cc90ddbbf4e787d languageName: node linkType: hard @@ -37091,14 +37391,14 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.0, schema-utils@npm:^3.1.1": - version: 3.1.1 - resolution: "schema-utils@npm:3.1.1" +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.1.2": + version: 3.1.2 + resolution: "schema-utils@npm:3.1.2" dependencies: "@types/json-schema": ^7.0.8 ajv: ^6.12.5 ajv-keywords: ^3.5.2 - checksum: fb73f3d759d43ba033c877628fe9751620a26879f6301d3dbeeb48cf2a65baec5cdf99da65d1bf3b4ff5444b2e59cbe4f81c2456b5e0d2ba7d7fd4aed5da29ce + checksum: 39683edfe3beff018cdb1ae4fa296fc55cea13a080aa2b4d9351895cd64b22ba4d87e2e548c2a2ac1bc76e60980670adb0f413a58104479f1a0c12e5663cb8ca languageName: node linkType: hard @@ -39010,7 +39310,7 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:*, terser-webpack-plugin@npm:^5.1.3": +"terser-webpack-plugin@npm:*, terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.3.7": version: 5.3.9 resolution: "terser-webpack-plugin@npm:5.3.9" dependencies: @@ -40922,20 +41222,20 @@ __metadata: linkType: hard "webpack@npm:^5, webpack@npm:^5.70.0": - version: 5.76.3 - resolution: "webpack@npm:5.76.3" + version: 5.85.0 + resolution: "webpack@npm:5.85.0" dependencies: "@types/eslint-scope": ^3.7.3 - "@types/estree": ^0.0.51 - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/wasm-edit": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 + "@types/estree": ^1.0.0 + "@webassemblyjs/ast": ^1.11.5 + "@webassemblyjs/wasm-edit": ^1.11.5 + "@webassemblyjs/wasm-parser": ^1.11.5 acorn: ^8.7.1 - acorn-import-assertions: ^1.7.6 + acorn-import-assertions: ^1.9.0 browserslist: ^4.14.5 chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.10.0 - es-module-lexer: ^0.9.0 + enhanced-resolve: ^5.14.1 + es-module-lexer: ^1.2.1 eslint-scope: 5.1.1 events: ^3.2.0 glob-to-regexp: ^0.4.1 @@ -40944,9 +41244,9 @@ __metadata: loader-runner: ^4.2.0 mime-types: ^2.1.27 neo-async: ^2.6.2 - schema-utils: ^3.1.0 + schema-utils: ^3.1.2 tapable: ^2.1.1 - terser-webpack-plugin: ^5.1.3 + terser-webpack-plugin: ^5.3.7 watchpack: ^2.4.0 webpack-sources: ^3.2.3 peerDependenciesMeta: @@ -40954,7 +41254,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 363f536b56971d056e34ab4cffa4cbc630b220e51be1a8c3adea87d9f0b51c49cfc7c3720d6614a1fd2c8c63f1ab3100db916fe8367c8bb9299327ff8c3f856d + checksum: b013be9fbc7f6810d1f229f570c70710ddbc7290f817411acffe4214b2b6c783a041ab1f2005d9e1109f4ab21c136f0f8d8c067a5fb64f20a82dcbc1ee0d3f42 languageName: node linkType: hard @@ -41384,13 +41684,13 @@ __metadata: languageName: node linkType: hard -"xml2js@npm:^0.5.0": - version: 0.5.0 - resolution: "xml2js@npm:0.5.0" +"xml2js@npm:^0.6.0": + version: 0.6.0 + resolution: "xml2js@npm:0.6.0" dependencies: sax: ">=0.6.0" xmlbuilder: ~11.0.0 - checksum: 1aa71d62e5bc2d89138e3929b9ea46459157727759cbc62ef99484b778641c0cd21fb637696c052d901a22f82d092a3e740a16b4ce218e81ac59b933535124ea + checksum: 437f353fd66d367bf158e9555a0625df9965d944e499728a5c6bc92a54a2763179b144f14b7e1c725040f56bbd22b0fa6cfcb09ec4faf39c45ce01efe631f40b languageName: node linkType: hard