diff --git a/.changeset/afraid-mice-give.md b/.changeset/afraid-mice-give.md deleted file mode 100644 index 8d6424f536..0000000000 --- a/.changeset/afraid-mice-give.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Fixed an issue where some Okta's resolvers were missing diff --git a/.changeset/brave-queens-crash.md b/.changeset/brave-queens-crash.md deleted file mode 100644 index c28e5975f3..0000000000 --- a/.changeset/brave-queens-crash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-compat-api': patch ---- - -Make `convertLegacyApp` wrap discovered routes with `compatWrapper`. diff --git a/.changeset/brown-planes-sort.md b/.changeset/brown-planes-sort.md deleted file mode 100644 index 2291f950c0..0000000000 --- a/.changeset/brown-planes-sort.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -Scaffolder form now shows a list of errors at the top of the form. diff --git a/.changeset/chatty-rivers-hope.md b/.changeset/chatty-rivers-hope.md deleted file mode 100644 index 97fdd644fe..0000000000 --- a/.changeset/chatty-rivers-hope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-sonarqube-backend': patch ---- - -Updated README diff --git a/.changeset/chilled-seahorses-clean.md b/.changeset/chilled-seahorses-clean.md deleted file mode 100644 index aa3ae4d062..0000000000 --- a/.changeset/chilled-seahorses-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Fixed bug in Link where it was possible to select and copy a hidden element into clipboard diff --git a/.changeset/chilly-seahorses-bake.md b/.changeset/chilly-seahorses-bake.md new file mode 100644 index 0000000000..8ab80cf93e --- /dev/null +++ b/.changeset/chilly-seahorses-bake.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-compat-api': patch +--- + +The backwards compatibility provider will now use the new `ComponentsApi` and `IconsApi` when implementing the old `AppContext`. diff --git a/.changeset/create-app-1703547661.md b/.changeset/create-app-1703547661.md deleted file mode 100644 index b50d431d4b..0000000000 --- a/.changeset/create-app-1703547661.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Bumped create-app version. diff --git a/.changeset/curvy-dingos-jump.md b/.changeset/curvy-dingos-jump.md deleted file mode 100644 index 6b1c827e88..0000000000 --- a/.changeset/curvy-dingos-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-azure-sites': patch ---- - -Show Azure site tags in `EntityAzureSitesOverviewWidget`. diff --git a/.changeset/curvy-ladybugs-impress.md b/.changeset/curvy-ladybugs-impress.md new file mode 100644 index 0000000000..ab799e4888 --- /dev/null +++ b/.changeset/curvy-ladybugs-impress.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-adr': patch +--- + +Updated README diff --git a/.changeset/cyan-bats-lick.md b/.changeset/cyan-bats-lick.md new file mode 100644 index 0000000000..0683d806b0 --- /dev/null +++ b/.changeset/cyan-bats-lick.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-azure-devops-backend': patch +--- + +Added a note about Service Principles diff --git a/.changeset/dry-lobsters-flash.md b/.changeset/dry-lobsters-flash.md new file mode 100644 index 0000000000..9815bf62f4 --- /dev/null +++ b/.changeset/dry-lobsters-flash.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': patch +--- + +Added `IconsApi` implementation and the ability to configure icons through the `icons` option for `createApp` and `createSpecializedApp`. This is not a long-term solution as icons should be installable via extensions instead. This is just a stop-gap to make sure there is feature parity with the existing frontend system. diff --git a/.changeset/fast-jeans-walk.md b/.changeset/fast-jeans-walk.md new file mode 100644 index 0000000000..f733c9f464 --- /dev/null +++ b/.changeset/fast-jeans-walk.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': minor +'@backstage/plugin-scaffolder': minor +--- + +Remove the old legacy exports from `/alpha` diff --git a/.changeset/fast-tables-hammer.md b/.changeset/fast-tables-hammer.md deleted file mode 100644 index 9ed5915073..0000000000 --- a/.changeset/fast-tables-hammer.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Use sha256 instead of md5 in build script cache key calculation - -Makes it possible to build on FIPS nodejs. diff --git a/.changeset/fifty-files-argue.md b/.changeset/fifty-files-argue.md new file mode 100644 index 0000000000..b80b2989af --- /dev/null +++ b/.changeset/fifty-files-argue.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-test-utils': minor +'@backstage/backend-common': minor +--- + +drop databases after unit tests if the database instance is not running in docker diff --git a/.changeset/flat-wasps-fold.md b/.changeset/flat-wasps-fold.md new file mode 100644 index 0000000000..653dc0d78f --- /dev/null +++ b/.changeset/flat-wasps-fold.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-plugin-api': patch +--- + +Added initial `IconsApi` definition. diff --git a/.changeset/friendly-cheetahs-rescue.md b/.changeset/friendly-cheetahs-rescue.md new file mode 100644 index 0000000000..4f54a022af --- /dev/null +++ b/.changeset/friendly-cheetahs-rescue.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Fixed an issue where a misleading error message would be logged when an +unsupported service locator method was specified. diff --git a/.changeset/friendly-horses-kneel.md b/.changeset/friendly-horses-kneel.md deleted file mode 100644 index ebc11a7deb..0000000000 --- a/.changeset/friendly-horses-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-plugin-api': patch ---- - -Removed unnecessary `i18next` dependency. diff --git a/.changeset/funny-rings-fry.md b/.changeset/funny-rings-fry.md deleted file mode 100644 index 66daec0ffb..0000000000 --- a/.changeset/funny-rings-fry.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -Use sha256 instead of md5 for hash key calculation in caches - -This can have a side effect of invalidating caches (when cache key was >250 characters) -This improves compliance with FIPS nodejs diff --git a/.changeset/funny-timers-visit.md b/.changeset/funny-timers-visit.md new file mode 100644 index 0000000000..3d802328b5 --- /dev/null +++ b/.changeset/funny-timers-visit.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-react': patch +--- + +Fix broken XtermJS CSS import diff --git a/.changeset/gold-pianos-worry.md b/.changeset/gold-pianos-worry.md deleted file mode 100644 index 39095dbbd7..0000000000 --- a/.changeset/gold-pianos-worry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Fixed an issue where not passing a `value` to any of the action's permission conditions caused an error. diff --git a/.changeset/gorgeous-bobcats-press.md b/.changeset/gorgeous-bobcats-press.md new file mode 100644 index 0000000000..6193918cb7 --- /dev/null +++ b/.changeset/gorgeous-bobcats-press.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Include the extension point ID and the module ID in the backend init error message. diff --git a/.changeset/grumpy-poets-study.md b/.changeset/grumpy-poets-study.md new file mode 100644 index 0000000000..9925f2f87a --- /dev/null +++ b/.changeset/grumpy-poets-study.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Added basic support for the new frontend system, exported from the `/alpha` subpath. diff --git a/.changeset/happy-forks-jam.md b/.changeset/happy-forks-jam.md deleted file mode 100644 index 3f48853311..0000000000 --- a/.changeset/happy-forks-jam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-user-settings': minor ---- - -Updated the user settings selector to use a select component that displays native language names instead of language codes if possible. diff --git a/.changeset/hip-dancers-pay.md b/.changeset/hip-dancers-pay.md deleted file mode 100644 index b05a291f85..0000000000 --- a/.changeset/hip-dancers-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-octopus-deploy': patch ---- - -added install path and fixed import on plugin-octopus-deploy diff --git a/.changeset/hot-pillows-poke.md b/.changeset/hot-pillows-poke.md new file mode 100644 index 0000000000..8060e7121f --- /dev/null +++ b/.changeset/hot-pillows-poke.md @@ -0,0 +1,11 @@ +--- +'@backstage/plugin-user-settings': patch +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-tech-radar': patch +'@backstage/plugin-graphiql': patch +'@backstage/plugin-techdocs': patch +'@backstage/plugin-catalog': patch +'@backstage/plugin-search': patch +--- + +Use `convertLegacyRouteRefs` to define routes in `/alpha` export plugin. diff --git a/.changeset/kind-clouds-fly.md b/.changeset/kind-clouds-fly.md new file mode 100644 index 0000000000..22aa7cda33 --- /dev/null +++ b/.changeset/kind-clouds-fly.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes-node': patch +--- + +Enabled a way to include custom auth metadata info on the clusters endpoint. If you want to implement a Kubernetes auth strategy which requires surfacing custom auth metadata to the frontend, use the new presentAuthMetadata method on the AuthenticationStrategy interface. diff --git a/.changeset/large-poets-buy.md b/.changeset/large-poets-buy.md deleted file mode 100644 index f22ca7c6b8..0000000000 --- a/.changeset/large-poets-buy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/catalog-client': patch ---- - -Fix a bug in `getLocationByRef` that led to invalid backend calls diff --git a/.changeset/lazy-teachers-walk.md b/.changeset/lazy-teachers-walk.md deleted file mode 100644 index 92f9a63d1e..0000000000 --- a/.changeset/lazy-teachers-walk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -Updated the OpenAPI template to export the `TypedResponse` interface so that client code can leverage it diff --git a/.changeset/loud-walls-compare.md b/.changeset/loud-walls-compare.md new file mode 100644 index 0000000000..495ad933d9 --- /dev/null +++ b/.changeset/loud-walls-compare.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Fixed inconsistencies in icons used for System and Template diff --git a/.changeset/many-peaches-dress.md b/.changeset/many-peaches-dress.md deleted file mode 100644 index 42a4d86b68..0000000000 --- a/.changeset/many-peaches-dress.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch -'@backstage/config-loader': patch -'@backstage/create-app': patch -'@backstage/repo-tools': patch -'@backstage/cli-node': patch ---- - -Removed `mock-fs` dev dependency. diff --git a/.changeset/many-pugs-change.md b/.changeset/many-pugs-change.md new file mode 100644 index 0000000000..318c571891 --- /dev/null +++ b/.changeset/many-pugs-change.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +The purpose of this patch is to add a new login method which is `googleServiceAccount` configuring the kubernetes properties in the app-config.yaml file with authProvider key diff --git a/.changeset/metal-students-drive.md b/.changeset/metal-students-drive.md new file mode 100644 index 0000000000..04f338c64e --- /dev/null +++ b/.changeset/metal-students-drive.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-entity-validation': patch +--- + +Improves UX of the EntityValidationPage: Moves the validate button below the EntityTextArea which is actually validated, the location TextField can now be hidden to prevent confusion about what is validated and additional content can be added to the top of the validation page. diff --git a/.changeset/neat-hotels-wink.md b/.changeset/neat-hotels-wink.md new file mode 100644 index 0000000000..fca82e38fa --- /dev/null +++ b/.changeset/neat-hotels-wink.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +Added the option to provide custom `groupTransformer`, `userTransformer` and `groupNameTransformer` to allow custom transformations of groups and users diff --git a/.changeset/new-plants-sort.md b/.changeset/new-plants-sort.md deleted file mode 100644 index 16521df3c9..0000000000 --- a/.changeset/new-plants-sort.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/plugin-kubernetes-react': patch -'@backstage/plugin-kubernetes': patch ---- - -Add `authuser` search parameter to GKE cluster link formatter in k8s plugin - -Thanks to this, people with multiple simultaneously logged-in accounts in their GCP console will automatically view objects with the same email as the one signed in to the Google auth provider in Backstage. diff --git a/.changeset/olive-singers-accept.md b/.changeset/olive-singers-accept.md new file mode 100644 index 0000000000..7e8cf7ae8d --- /dev/null +++ b/.changeset/olive-singers-accept.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-compat-api': patch +--- + +Added `convertLegacyRouteRefs` for bulk conversion of plugin routes. diff --git a/.changeset/orange-planets-suffer.md b/.changeset/orange-planets-suffer.md deleted file mode 100644 index bc14a8cf8f..0000000000 --- a/.changeset/orange-planets-suffer.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/plugin-search-backend-module-stack-overflow-collator': patch -'@backstage/plugin-search-backend-module-techdocs': patch -'@backstage/plugin-search-backend-module-catalog': patch -'@backstage/plugin-search-backend-module-explore': patch ---- - -Update wording to show that the backend system no longer is in alpha diff --git a/.changeset/polite-meals-hug.md b/.changeset/polite-meals-hug.md new file mode 100644 index 0000000000..664f450c6d --- /dev/null +++ b/.changeset/polite-meals-hug.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-stack-overflow': patch +--- + +Fixes a bug that made the API return questions not related to the tags provided diff --git a/.changeset/pre.json b/.changeset/pre.json index 4321e60c45..1e62c27268 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -2,288 +2,267 @@ "mode": "pre", "tag": "next", "initialVersions": { - "example-app": "0.2.90", - "@backstage/app-defaults": "1.4.6", - "example-app-next": "0.0.4", - "app-next-example-plugin": "0.0.4", - "example-backend": "0.2.90", - "@backstage/backend-app-api": "0.5.9", - "@backstage/backend-common": "0.20.0", - "@backstage/backend-defaults": "0.2.8", - "@backstage/backend-dev-utils": "0.1.2", - "example-backend-next": "0.0.18", - "@backstage/backend-openapi-utils": "0.1.1", - "@backstage/backend-plugin-api": "0.6.8", - "@backstage/backend-plugin-manager": "0.0.4", - "@backstage/backend-tasks": "0.5.13", - "@backstage/backend-test-utils": "0.2.9", - "@backstage/catalog-client": "1.5.0", + "example-app": "0.2.91", + "@backstage/app-defaults": "1.4.7", + "example-app-next": "0.0.5", + "app-next-example-plugin": "0.0.5", + "example-backend": "0.2.91", + "@backstage/backend-app-api": "0.5.10", + "@backstage/backend-common": "0.20.1", + "@backstage/backend-defaults": "0.2.9", + "@backstage/backend-dev-utils": "0.1.3", + "@backstage/backend-dynamic-feature-service": "0.1.0", + "example-backend-next": "0.0.19", + "@backstage/backend-openapi-utils": "0.1.2", + "@backstage/backend-plugin-api": "0.6.9", + "@backstage/backend-tasks": "0.5.14", + "@backstage/backend-test-utils": "0.2.10", + "@backstage/catalog-client": "1.5.2", "@backstage/catalog-model": "1.4.3", - "@backstage/cli": "0.25.0", + "@backstage/cli": "0.25.1", "@backstage/cli-common": "0.1.13", - "@backstage/cli-node": "0.2.1", + "@backstage/cli-node": "0.2.2", "@backstage/codemods": "0.1.46", "@backstage/config": "1.1.1", - "@backstage/config-loader": "1.6.0", - "@backstage/core-app-api": "1.11.2", - "@backstage/core-compat-api": "0.1.0", - "@backstage/core-components": "0.13.9", - "@backstage/core-plugin-api": "1.8.1", - "@backstage/create-app": "0.5.8", - "@backstage/dev-utils": "1.0.25", - "e2e-test": "0.2.10", + "@backstage/config-loader": "1.6.1", + "@backstage/core-app-api": "1.11.3", + "@backstage/core-compat-api": "0.1.1", + "@backstage/core-components": "0.13.10", + "@backstage/core-plugin-api": "1.8.2", + "@backstage/create-app": "0.5.9", + "@backstage/dev-utils": "1.0.26", + "e2e-test": "0.2.11", "@backstage/e2e-test-utils": "0.1.0", "@backstage/errors": "1.2.3", "@backstage/eslint-plugin": "0.1.4", - "@backstage/frontend-app-api": "0.4.0", - "@backstage/frontend-plugin-api": "0.4.0", - "@backstage/frontend-test-utils": "0.1.0", + "@backstage/frontend-app-api": "0.5.0", + "@backstage/frontend-plugin-api": "0.5.0", + "@backstage/frontend-test-utils": "0.1.1", "@backstage/integration": "1.8.0", "@backstage/integration-aws-node": "0.1.8", - "@backstage/integration-react": "1.1.22", + "@backstage/integration-react": "1.1.23", "@backstage/release-manifests": "0.0.11", - "@backstage/repo-tools": "0.5.0", - "@techdocs/cli": "1.8.0", - "techdocs-cli-embedded-app": "0.2.89", - "@backstage/test-utils": "1.4.6", + "@backstage/repo-tools": "0.5.2", + "@techdocs/cli": "1.8.1", + "techdocs-cli-embedded-app": "0.2.90", + "@backstage/test-utils": "1.4.7", "@backstage/theme": "0.5.0", "@backstage/types": "1.1.1", "@backstage/version-bridge": "1.0.7", - "@backstage/plugin-adr": "0.6.11", - "@backstage/plugin-adr-backend": "0.4.5", - "@backstage/plugin-adr-common": "0.2.18", - "@backstage/plugin-airbrake": "0.3.28", - "@backstage/plugin-airbrake-backend": "0.3.5", - "@backstage/plugin-allure": "0.1.44", - "@backstage/plugin-analytics-module-ga": "0.1.36", - "@backstage/plugin-analytics-module-ga4": "0.1.7", - "@backstage/plugin-analytics-module-newrelic-browser": "0.0.5", - "@backstage/plugin-apache-airflow": "0.2.18", - "@backstage/plugin-api-docs": "0.10.2", + "@backstage/plugin-adr": "0.6.12", + "@backstage/plugin-adr-backend": "0.4.6", + "@backstage/plugin-adr-common": "0.2.19", + "@backstage/plugin-airbrake": "0.3.29", + "@backstage/plugin-airbrake-backend": "0.3.6", + "@backstage/plugin-allure": "0.1.45", + "@backstage/plugin-analytics-module-ga": "0.1.37", + "@backstage/plugin-analytics-module-ga4": "0.1.8", + "@backstage/plugin-analytics-module-newrelic-browser": "0.0.6", + "@backstage/plugin-apache-airflow": "0.2.19", + "@backstage/plugin-api-docs": "0.10.3", "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.5", - "@backstage/plugin-apollo-explorer": "0.1.18", - "@backstage/plugin-app-backend": "0.3.56", - "@backstage/plugin-app-node": "0.1.8", - "@backstage/plugin-auth-backend": "0.20.1", - "@backstage/plugin-auth-backend-module-atlassian-provider": "0.1.0", - "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.2.2", - "@backstage/plugin-auth-backend-module-github-provider": "0.1.5", - "@backstage/plugin-auth-backend-module-gitlab-provider": "0.1.5", - "@backstage/plugin-auth-backend-module-google-provider": "0.1.5", - "@backstage/plugin-auth-backend-module-microsoft-provider": "0.1.3", - "@backstage/plugin-auth-backend-module-oauth2-provider": "0.1.5", - "@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "0.1.0", - "@backstage/plugin-auth-backend-module-okta-provider": "0.0.1", - "@backstage/plugin-auth-backend-module-pinniped-provider": "0.1.2", - "@backstage/plugin-auth-backend-module-vmware-cloud-provider": "0.1.0", - "@backstage/plugin-auth-node": "0.4.2", - "@backstage/plugin-azure-devops": "0.3.10", - "@backstage/plugin-azure-devops-backend": "0.5.0", + "@backstage/plugin-apollo-explorer": "0.1.19", + "@backstage/plugin-app-backend": "0.3.57", + "@backstage/plugin-app-node": "0.1.9", + "@backstage/plugin-app-visualizer": "0.1.0", + "@backstage/plugin-auth-backend": "0.20.3", + "@backstage/plugin-auth-backend-module-atlassian-provider": "0.1.1", + "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.2.3", + "@backstage/plugin-auth-backend-module-github-provider": "0.1.6", + "@backstage/plugin-auth-backend-module-gitlab-provider": "0.1.6", + "@backstage/plugin-auth-backend-module-google-provider": "0.1.6", + "@backstage/plugin-auth-backend-module-microsoft-provider": "0.1.4", + "@backstage/plugin-auth-backend-module-oauth2-provider": "0.1.6", + "@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "0.1.1", + "@backstage/plugin-auth-backend-module-okta-provider": "0.0.2", + "@backstage/plugin-auth-backend-module-pinniped-provider": "0.1.3", + "@backstage/plugin-auth-backend-module-vmware-cloud-provider": "0.1.1", + "@backstage/plugin-auth-node": "0.4.3", + "@backstage/plugin-azure-devops": "0.3.11", + "@backstage/plugin-azure-devops-backend": "0.5.1", "@backstage/plugin-azure-devops-common": "0.3.2", - "@backstage/plugin-azure-sites": "0.1.17", - "@backstage/plugin-azure-sites-backend": "0.1.18", + "@backstage/plugin-azure-sites": "0.1.18", + "@backstage/plugin-azure-sites-backend": "0.1.19", "@backstage/plugin-azure-sites-common": "0.1.1", - "@backstage/plugin-badges": "0.2.52", - "@backstage/plugin-badges-backend": "0.3.5", - "@backstage/plugin-bazaar": "0.2.20", - "@backstage/plugin-bazaar-backend": "0.3.6", + "@backstage/plugin-badges": "0.2.53", + "@backstage/plugin-badges-backend": "0.3.6", + "@backstage/plugin-bazaar": "0.2.21", + "@backstage/plugin-bazaar-backend": "0.3.7", "@backstage/plugin-bitbucket-cloud-common": "0.2.15", - "@backstage/plugin-bitrise": "0.1.55", - "@backstage/plugin-catalog": "1.16.0", - "@backstage/plugin-catalog-backend": "1.16.0", - "@backstage/plugin-catalog-backend-module-aws": "0.3.2", - "@backstage/plugin-catalog-backend-module-azure": "0.1.27", - "@backstage/plugin-catalog-backend-module-backstage-openapi": "0.1.1", - "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.23", - "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.23", - "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.21", - "@backstage/plugin-catalog-backend-module-gcp": "0.1.8", - "@backstage/plugin-catalog-backend-module-gerrit": "0.1.24", - "@backstage/plugin-catalog-backend-module-github": "0.4.6", - "@backstage/plugin-catalog-backend-module-github-org": "0.1.2", - "@backstage/plugin-catalog-backend-module-gitlab": "0.3.5", - "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.4.12", - "@backstage/plugin-catalog-backend-module-ldap": "0.5.23", - "@backstage/plugin-catalog-backend-module-msgraph": "0.5.15", - "@backstage/plugin-catalog-backend-module-openapi": "0.1.25", - "@backstage/plugin-catalog-backend-module-puppetdb": "0.1.13", - "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.1.5", - "@backstage/plugin-catalog-backend-module-unprocessed": "0.3.5", - "@backstage/plugin-catalog-common": "1.0.19", - "@backstage/plugin-catalog-graph": "0.3.2", - "@backstage/plugin-catalog-import": "0.10.4", - "@backstage/plugin-catalog-node": "1.6.0", - "@backstage/plugin-catalog-react": "1.9.2", - "@backstage/plugin-catalog-unprocessed-entities": "0.1.6", - "@backstage/plugin-cicd-statistics": "0.1.30", - "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.24", - "@backstage/plugin-circleci": "0.3.28", - "@backstage/plugin-cloudbuild": "0.3.28", - "@backstage/plugin-code-climate": "0.1.28", - "@backstage/plugin-code-coverage": "0.2.21", - "@backstage/plugin-code-coverage-backend": "0.2.22", - "@backstage/plugin-codescene": "0.1.20", - "@backstage/plugin-config-schema": "0.1.48", - "@backstage/plugin-cost-insights": "0.12.17", + "@backstage/plugin-bitrise": "0.1.56", + "@backstage/plugin-catalog": "1.16.1", + "@backstage/plugin-catalog-backend": "1.16.1", + "@backstage/plugin-catalog-backend-module-aws": "0.3.3", + "@backstage/plugin-catalog-backend-module-azure": "0.1.28", + "@backstage/plugin-catalog-backend-module-backstage-openapi": "0.1.2", + "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.24", + "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.24", + "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.22", + "@backstage/plugin-catalog-backend-module-gcp": "0.1.9", + "@backstage/plugin-catalog-backend-module-gerrit": "0.1.25", + "@backstage/plugin-catalog-backend-module-github": "0.4.7", + "@backstage/plugin-catalog-backend-module-github-org": "0.1.3", + "@backstage/plugin-catalog-backend-module-gitlab": "0.3.6", + "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.4.13", + "@backstage/plugin-catalog-backend-module-ldap": "0.5.24", + "@backstage/plugin-catalog-backend-module-msgraph": "0.5.16", + "@backstage/plugin-catalog-backend-module-openapi": "0.1.26", + "@backstage/plugin-catalog-backend-module-puppetdb": "0.1.14", + "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.1.6", + "@backstage/plugin-catalog-backend-module-unprocessed": "0.3.6", + "@backstage/plugin-catalog-common": "1.0.20", + "@backstage/plugin-catalog-graph": "0.3.3", + "@backstage/plugin-catalog-import": "0.10.5", + "@backstage/plugin-catalog-node": "1.6.1", + "@backstage/plugin-catalog-react": "1.9.3", + "@backstage/plugin-catalog-unprocessed-entities": "0.1.7", + "@backstage/plugin-cicd-statistics": "0.1.31", + "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.25", + "@backstage/plugin-circleci": "0.3.29", + "@backstage/plugin-cloudbuild": "0.3.29", + "@backstage/plugin-code-climate": "0.1.29", + "@backstage/plugin-code-coverage": "0.2.22", + "@backstage/plugin-code-coverage-backend": "0.2.23", + "@backstage/plugin-codescene": "0.1.21", + "@backstage/plugin-config-schema": "0.1.49", + "@backstage/plugin-cost-insights": "0.12.18", "@backstage/plugin-cost-insights-common": "0.1.2", - "@backstage/plugin-devtools": "0.1.7", - "@backstage/plugin-devtools-backend": "0.2.5", - "@backstage/plugin-devtools-common": "0.1.7", - "@backstage/plugin-dynatrace": "8.0.2", - "@backstage/plugin-entity-feedback": "0.2.11", - "@backstage/plugin-entity-feedback-backend": "0.2.5", + "@backstage/plugin-devtools": "0.1.8", + "@backstage/plugin-devtools-backend": "0.2.6", + "@backstage/plugin-devtools-common": "0.1.8", + "@backstage/plugin-dynatrace": "8.0.3", + "@backstage/plugin-entity-feedback": "0.2.12", + "@backstage/plugin-entity-feedback-backend": "0.2.6", "@backstage/plugin-entity-feedback-common": "0.1.3", - "@backstage/plugin-entity-validation": "0.1.13", - "@backstage/plugin-events-backend": "0.2.17", - "@backstage/plugin-events-backend-module-aws-sqs": "0.2.11", - "@backstage/plugin-events-backend-module-azure": "0.1.18", - "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.18", - "@backstage/plugin-events-backend-module-gerrit": "0.1.18", - "@backstage/plugin-events-backend-module-github": "0.1.18", - "@backstage/plugin-events-backend-module-gitlab": "0.1.18", - "@backstage/plugin-events-backend-test-utils": "0.1.18", - "@backstage/plugin-events-node": "0.2.17", - "@internal/plugin-todo-list": "1.0.20", - "@internal/plugin-todo-list-backend": "1.0.20", - "@internal/plugin-todo-list-common": "1.0.16", - "@backstage/plugin-explore": "0.4.14", - "@backstage/plugin-explore-backend": "0.0.18", + "@backstage/plugin-entity-validation": "0.1.14", + "@backstage/plugin-events-backend": "0.2.18", + "@backstage/plugin-events-backend-module-aws-sqs": "0.2.12", + "@backstage/plugin-events-backend-module-azure": "0.1.19", + "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.19", + "@backstage/plugin-events-backend-module-gerrit": "0.1.19", + "@backstage/plugin-events-backend-module-github": "0.1.19", + "@backstage/plugin-events-backend-module-gitlab": "0.1.19", + "@backstage/plugin-events-backend-test-utils": "0.1.19", + "@backstage/plugin-events-node": "0.2.18", + "@internal/plugin-todo-list": "1.0.21", + "@internal/plugin-todo-list-backend": "1.0.21", + "@internal/plugin-todo-list-common": "1.0.17", + "@backstage/plugin-explore": "0.4.15", + "@backstage/plugin-explore-backend": "0.0.19", "@backstage/plugin-explore-common": "0.0.2", - "@backstage/plugin-explore-react": "0.0.34", - "@backstage/plugin-firehydrant": "0.2.12", - "@backstage/plugin-fossa": "0.2.60", - "@backstage/plugin-gcalendar": "0.3.21", - "@backstage/plugin-gcp-projects": "0.3.44", - "@backstage/plugin-git-release-manager": "0.3.40", - "@backstage/plugin-github-actions": "0.6.9", - "@backstage/plugin-github-deployments": "0.1.59", - "@backstage/plugin-github-issues": "0.2.17", - "@backstage/plugin-github-pull-requests-board": "0.1.22", - "@backstage/plugin-gitops-profiles": "0.3.43", - "@backstage/plugin-gocd": "0.1.34", - "@backstage/plugin-graphiql": "0.3.1", - "@backstage/plugin-graphql-voyager": "0.1.10", - "@backstage/plugin-home": "0.6.0", - "@backstage/plugin-home-react": "0.1.6", - "@backstage/plugin-ilert": "0.2.17", - "@backstage/plugin-jenkins": "0.9.3", - "@backstage/plugin-jenkins-backend": "0.3.2", - "@backstage/plugin-jenkins-common": "0.1.22", - "@backstage/plugin-kafka": "0.3.28", - "@backstage/plugin-kafka-backend": "0.3.6", - "@backstage/plugin-kubernetes": "0.11.3", - "@backstage/plugin-kubernetes-backend": "0.14.0", - "@backstage/plugin-kubernetes-cluster": "0.0.4", - "@backstage/plugin-kubernetes-common": "0.7.2", - "@backstage/plugin-kubernetes-node": "0.1.2", - "@backstage/plugin-kubernetes-react": "0.2.0", - "@backstage/plugin-lighthouse": "0.4.13", - "@backstage/plugin-lighthouse-backend": "0.4.0", + "@backstage/plugin-explore-react": "0.0.35", + "@backstage/plugin-firehydrant": "0.2.13", + "@backstage/plugin-fossa": "0.2.61", + "@backstage/plugin-gcalendar": "0.3.22", + "@backstage/plugin-gcp-projects": "0.3.45", + "@backstage/plugin-git-release-manager": "0.3.41", + "@backstage/plugin-github-actions": "0.6.10", + "@backstage/plugin-github-deployments": "0.1.60", + "@backstage/plugin-github-issues": "0.2.18", + "@backstage/plugin-github-pull-requests-board": "0.1.23", + "@backstage/plugin-gitops-profiles": "0.3.44", + "@backstage/plugin-gocd": "0.1.35", + "@backstage/plugin-graphiql": "0.3.2", + "@backstage/plugin-graphql-voyager": "0.1.11", + "@backstage/plugin-home": "0.6.1", + "@backstage/plugin-home-react": "0.1.7", + "@backstage/plugin-ilert": "0.2.18", + "@backstage/plugin-jenkins": "0.9.4", + "@backstage/plugin-jenkins-backend": "0.3.3", + "@backstage/plugin-jenkins-common": "0.1.23", + "@backstage/plugin-kafka": "0.3.29", + "@backstage/plugin-kafka-backend": "0.3.7", + "@backstage/plugin-kubernetes": "0.11.4", + "@backstage/plugin-kubernetes-backend": "0.14.1", + "@backstage/plugin-kubernetes-cluster": "0.0.5", + "@backstage/plugin-kubernetes-common": "0.7.3", + "@backstage/plugin-kubernetes-node": "0.1.3", + "@backstage/plugin-kubernetes-react": "0.2.1", + "@backstage/plugin-lighthouse": "0.4.14", + "@backstage/plugin-lighthouse-backend": "0.4.1", "@backstage/plugin-lighthouse-common": "0.1.4", - "@backstage/plugin-linguist": "0.1.13", - "@backstage/plugin-linguist-backend": "0.5.5", + "@backstage/plugin-linguist": "0.1.14", + "@backstage/plugin-linguist-backend": "0.5.6", "@backstage/plugin-linguist-common": "0.1.2", - "@backstage/plugin-microsoft-calendar": "0.1.10", - "@backstage/plugin-newrelic": "0.3.43", - "@backstage/plugin-newrelic-dashboard": "0.3.3", - "@backstage/plugin-nomad": "0.1.9", - "@backstage/plugin-nomad-backend": "0.1.10", - "@backstage/plugin-octopus-deploy": "0.2.10", - "@backstage/plugin-opencost": "0.2.3", - "@backstage/plugin-org": "0.6.18", - "@backstage/plugin-org-react": "0.1.17", - "@backstage/plugin-pagerduty": "0.7.0", - "@backstage/plugin-periskop": "0.1.26", - "@backstage/plugin-periskop-backend": "0.2.6", - "@backstage/plugin-permission-backend": "0.5.31", - "@backstage/plugin-permission-backend-module-allow-all-policy": "0.1.5", - "@backstage/plugin-permission-common": "0.7.11", - "@backstage/plugin-permission-node": "0.7.19", - "@backstage/plugin-permission-react": "0.4.18", - "@backstage/plugin-playlist": "0.2.2", - "@backstage/plugin-playlist-backend": "0.3.12", - "@backstage/plugin-playlist-common": "0.1.13", - "@backstage/plugin-proxy-backend": "0.4.6", - "@backstage/plugin-puppetdb": "0.1.11", - "@backstage/plugin-rollbar": "0.4.28", - "@backstage/plugin-rollbar-backend": "0.1.53", - "@backstage/plugin-scaffolder": "1.17.0", - "@backstage/plugin-scaffolder-backend": "1.19.2", - "@backstage/plugin-scaffolder-backend-module-azure": "0.1.0", - "@backstage/plugin-scaffolder-backend-module-bitbucket": "0.1.0", - "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.2.9", - "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.32", - "@backstage/plugin-scaffolder-backend-module-gerrit": "0.1.0", - "@backstage/plugin-scaffolder-backend-module-github": "0.1.0", - "@backstage/plugin-scaffolder-backend-module-gitlab": "0.2.11", - "@backstage/plugin-scaffolder-backend-module-rails": "0.4.25", - "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.16", - "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.29", - "@backstage/plugin-scaffolder-common": "1.4.4", - "@backstage/plugin-scaffolder-node": "0.2.9", - "@backstage/plugin-scaffolder-react": "1.7.0", - "@backstage/plugin-search": "1.4.4", - "@backstage/plugin-search-backend": "1.4.8", - "@backstage/plugin-search-backend-module-catalog": "0.1.12", - "@backstage/plugin-search-backend-module-elasticsearch": "1.3.11", - "@backstage/plugin-search-backend-module-explore": "0.1.12", - "@backstage/plugin-search-backend-module-pg": "0.5.17", - "@backstage/plugin-search-backend-module-stack-overflow-collator": "0.1.1", - "@backstage/plugin-search-backend-module-techdocs": "0.1.12", - "@backstage/plugin-search-backend-node": "1.2.12", - "@backstage/plugin-search-common": "1.2.9", - "@backstage/plugin-search-react": "1.7.4", - "@backstage/plugin-sentry": "0.5.13", - "@backstage/plugin-shortcuts": "0.3.17", - "@backstage/plugin-sonarqube": "0.7.10", - "@backstage/plugin-sonarqube-backend": "0.2.10", - "@backstage/plugin-sonarqube-react": "0.1.11", - "@backstage/plugin-splunk-on-call": "0.4.17", - "@backstage/plugin-stack-overflow": "0.1.23", - "@backstage/plugin-stack-overflow-backend": "0.2.12", - "@backstage/plugin-stackstorm": "0.1.9", - "@backstage/plugin-tech-insights": "0.3.20", - "@backstage/plugin-tech-insights-backend": "0.5.22", - "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.40", + "@backstage/plugin-microsoft-calendar": "0.1.11", + "@backstage/plugin-newrelic": "0.3.44", + "@backstage/plugin-newrelic-dashboard": "0.3.4", + "@backstage/plugin-nomad": "0.1.10", + "@backstage/plugin-nomad-backend": "0.1.11", + "@backstage/plugin-octopus-deploy": "0.2.11", + "@backstage/plugin-opencost": "0.2.4", + "@backstage/plugin-org": "0.6.19", + "@backstage/plugin-org-react": "0.1.18", + "@backstage/plugin-pagerduty": "0.7.1", + "@backstage/plugin-periskop": "0.1.27", + "@backstage/plugin-periskop-backend": "0.2.7", + "@backstage/plugin-permission-backend": "0.5.32", + "@backstage/plugin-permission-backend-module-allow-all-policy": "0.1.6", + "@backstage/plugin-permission-common": "0.7.12", + "@backstage/plugin-permission-node": "0.7.20", + "@backstage/plugin-permission-react": "0.4.19", + "@backstage/plugin-playlist": "0.2.3", + "@backstage/plugin-playlist-backend": "0.3.13", + "@backstage/plugin-playlist-common": "0.1.14", + "@backstage/plugin-proxy-backend": "0.4.7", + "@backstage/plugin-puppetdb": "0.1.12", + "@backstage/plugin-rollbar": "0.4.29", + "@backstage/plugin-rollbar-backend": "0.1.54", + "@backstage/plugin-scaffolder": "1.17.1", + "@backstage/plugin-scaffolder-backend": "1.20.0", + "@backstage/plugin-scaffolder-backend-module-azure": "0.1.1", + "@backstage/plugin-scaffolder-backend-module-bitbucket": "0.1.1", + "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.2.10", + "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.33", + "@backstage/plugin-scaffolder-backend-module-gerrit": "0.1.1", + "@backstage/plugin-scaffolder-backend-module-github": "0.1.1", + "@backstage/plugin-scaffolder-backend-module-gitlab": "0.2.12", + "@backstage/plugin-scaffolder-backend-module-rails": "0.4.26", + "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.17", + "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.30", + "@backstage/plugin-scaffolder-common": "1.4.5", + "@backstage/plugin-scaffolder-node": "0.2.10", + "@backstage/plugin-scaffolder-react": "1.7.1", + "@backstage/plugin-search": "1.4.5", + "@backstage/plugin-search-backend": "1.4.9", + "@backstage/plugin-search-backend-module-catalog": "0.1.13", + "@backstage/plugin-search-backend-module-elasticsearch": "1.3.12", + "@backstage/plugin-search-backend-module-explore": "0.1.13", + "@backstage/plugin-search-backend-module-pg": "0.5.18", + "@backstage/plugin-search-backend-module-stack-overflow-collator": "0.1.2", + "@backstage/plugin-search-backend-module-techdocs": "0.1.13", + "@backstage/plugin-search-backend-node": "1.2.13", + "@backstage/plugin-search-common": "1.2.10", + "@backstage/plugin-search-react": "1.7.5", + "@backstage/plugin-sentry": "0.5.14", + "@backstage/plugin-shortcuts": "0.3.18", + "@backstage/plugin-sonarqube": "0.7.11", + "@backstage/plugin-sonarqube-backend": "0.2.11", + "@backstage/plugin-sonarqube-react": "0.1.12", + "@backstage/plugin-splunk-on-call": "0.4.18", + "@backstage/plugin-stack-overflow": "0.1.24", + "@backstage/plugin-stack-overflow-backend": "0.2.13", + "@backstage/plugin-stackstorm": "0.1.10", + "@backstage/plugin-tech-insights": "0.3.21", + "@backstage/plugin-tech-insights-backend": "0.5.23", + "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.41", "@backstage/plugin-tech-insights-common": "0.2.12", - "@backstage/plugin-tech-insights-node": "0.4.14", - "@backstage/plugin-tech-radar": "0.6.11", - "@backstage/plugin-techdocs": "1.9.2", - "@backstage/plugin-techdocs-addons-test-utils": "1.0.25", - "@backstage/plugin-techdocs-backend": "1.9.1", - "@backstage/plugin-techdocs-module-addons-contrib": "1.1.3", - "@backstage/plugin-techdocs-node": "1.11.0", - "@backstage/plugin-techdocs-react": "1.1.14", - "@backstage/plugin-todo": "0.2.32", - "@backstage/plugin-todo-backend": "0.3.6", - "@backstage/plugin-user-settings": "0.7.14", - "@backstage/plugin-user-settings-backend": "0.2.7", - "@backstage/plugin-vault": "0.1.23", - "@backstage/plugin-vault-backend": "0.4.1", - "@backstage/plugin-vault-node": "0.1.1", - "@backstage/plugin-visualizer": "0.0.1", - "@backstage/plugin-xcmetrics": "0.2.46" + "@backstage/plugin-tech-insights-node": "0.4.15", + "@backstage/plugin-tech-radar": "0.6.12", + "@backstage/plugin-techdocs": "1.9.3", + "@backstage/plugin-techdocs-addons-test-utils": "1.0.26", + "@backstage/plugin-techdocs-backend": "1.9.2", + "@backstage/plugin-techdocs-module-addons-contrib": "1.1.4", + "@backstage/plugin-techdocs-node": "1.11.1", + "@backstage/plugin-techdocs-react": "1.1.15", + "@backstage/plugin-todo": "0.2.33", + "@backstage/plugin-todo-backend": "0.3.7", + "@backstage/plugin-user-settings": "0.8.0", + "@backstage/plugin-user-settings-backend": "0.2.8", + "@backstage/plugin-vault": "0.1.24", + "@backstage/plugin-vault-backend": "0.4.2", + "@backstage/plugin-vault-node": "0.1.2", + "@backstage/plugin-xcmetrics": "0.2.47" }, - "changesets": [ - "afraid-mice-give", - "brown-planes-sort", - "chilled-seahorses-clean", - "create-app-1703547661", - "curvy-dingos-jump", - "fast-tables-hammer", - "friendly-horses-kneel", - "funny-rings-fry", - "gold-pianos-worry", - "happy-forks-jam", - "large-poets-buy", - "lazy-teachers-walk", - "many-peaches-dress", - "new-plants-sort", - "orange-planets-suffer", - "renovate-126fde4", - "renovate-9647667", - "rotten-tools-clean", - "sour-taxis-rush", - "stale-hairs-sparkle" - ] + "changesets": [] } diff --git a/.changeset/real-eggs-sip.md b/.changeset/real-eggs-sip.md new file mode 100644 index 0000000000..ca23d792f8 --- /dev/null +++ b/.changeset/real-eggs-sip.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-signals-backend': patch +'@backstage/plugin-signals': patch +'@backstage/plugin-signals-react': patch +'@backstage/plugin-signals-node': patch +--- + +Add support to subscribe and publish messages through signals plugins diff --git a/.changeset/renovate-126fde4.md b/.changeset/renovate-126fde4.md deleted file mode 100644 index 409d509e8b..0000000000 --- a/.changeset/renovate-126fde4.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-github-issues': patch -'@backstage/plugin-scaffolder-backend-module-github': patch ---- - -Updated dependency `octokit` to `^3.0.0`. diff --git a/.changeset/renovate-4b698fb.md b/.changeset/renovate-4b698fb.md new file mode 100644 index 0000000000..220aa5c848 --- /dev/null +++ b/.changeset/renovate-4b698fb.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Updated dependency `vite-plugin-node-polyfills` to `^0.19.0`. diff --git a/.changeset/renovate-91133b2.md b/.changeset/renovate-91133b2.md deleted file mode 100644 index 6f5b1b1bee..0000000000 --- a/.changeset/renovate-91133b2.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@backstage/plugin-home-react': patch -'@backstage/plugin-home': patch -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-scaffolder': patch ---- - -Updated dependency `@rjsf/utils` to `5.15.1`. -Updated dependency `@rjsf/core` to `5.15.1`. -Updated dependency `@rjsf/material-ui` to `5.15.1`. -Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. diff --git a/.changeset/renovate-9647667.md b/.changeset/renovate-9647667.md deleted file mode 100644 index 7d13035ecb..0000000000 --- a/.changeset/renovate-9647667.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-azure-devops-backend': patch -'@backstage/plugin-scaffolder-backend-module-azure': patch ---- - -Updated dependency `azure-devops-node-api` to `^12.0.0`. diff --git a/.changeset/renovate-fb2e0b9.md b/.changeset/renovate-fb2e0b9.md new file mode 100644 index 0000000000..39277aaa2a --- /dev/null +++ b/.changeset/renovate-fb2e0b9.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': patch +--- + +Updated dependency `@asyncapi/react-component` to `1.2.13`. diff --git a/.changeset/rotten-tools-clean.md b/.changeset/rotten-tools-clean.md deleted file mode 100644 index 192c3a057b..0000000000 --- a/.changeset/rotten-tools-clean.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch -'@backstage/plugin-catalog-backend-module-scaffolder-entity-model': patch -'@backstage/plugin-permission-backend-module-allow-all-policy': patch -'@backstage/plugin-auth-backend-module-oauth2-proxy-provider': patch -'@backstage/plugin-auth-backend-module-vmware-cloud-provider': patch -'@backstage/plugin-catalog-backend-module-backstage-openapi': patch -'@backstage/plugin-auth-backend-module-atlassian-provider': patch -'@backstage/plugin-auth-backend-module-microsoft-provider': patch -'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch -'@backstage/plugin-auth-backend-module-pinniped-provider': patch -'@backstage/plugin-events-backend-module-bitbucket-cloud': patch -'@backstage/plugin-auth-backend-module-gcp-iap-provider': patch -'@backstage/plugin-auth-backend-module-github-provider': patch -'@backstage/plugin-auth-backend-module-gitlab-provider': patch -'@backstage/plugin-auth-backend-module-google-provider': patch -'@backstage/plugin-auth-backend-module-oauth2-provider': patch -'@backstage/plugin-tech-insights-backend-module-jsonfc': patch -'@backstage/plugin-analytics-module-newrelic-browser': patch -'@backstage/plugin-auth-backend-module-okta-provider': patch -'@backstage/plugin-catalog-backend-module-bitbucket': patch -'@backstage/plugin-scaffolder-backend-module-yeoman': patch -'@backstage/plugin-techdocs-module-addons-contrib': patch -'@backstage/plugin-catalog-backend-module-gerrit': patch -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-catalog-unprocessed-entities': patch -'@backstage/plugin-events-backend-module-gerrit': patch -'@backstage/plugin-events-backend-module-github': patch -'@backstage/plugin-events-backend-module-gitlab': patch -'@backstage/plugin-events-backend-module-azure': patch -'@backstage/plugin-catalog-backend-module-aws': patch -'@backstage/plugin-github-pull-requests-board': patch -'@backstage/plugin-techdocs-addons-test-utils': patch -'@backstage/plugin-entity-feedback-backend': patch -'@backstage/backend-openapi-utils': patch -'@backstage/plugin-stack-overflow-backend': patch -'@backstage/plugin-code-coverage-backend': patch -'@backstage/plugin-user-settings-backend': patch -'@backstage/frontend-plugin-api': patch -'@backstage/plugin-analytics-module-ga4': patch -'@backstage/plugin-azure-devops-backend': patch -'@backstage/plugin-analytics-module-ga': patch -'@backstage/plugin-azure-sites-backend': patch -'@backstage/plugin-git-release-manager': patch -'@backstage/plugin-github-deployments': patch -'@backstage/plugin-kubernetes-cluster': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-newrelic-dashboard': patch -'@backstage/plugin-tech-insights-node': patch -'@backstage/plugin-entity-validation': patch -'@backstage/plugin-kubernetes-common': patch -'@backstage/plugin-airbrake-backend': patch -'@backstage/plugin-devtools-backend': patch -'@backstage/plugin-linguist-backend': patch -'@backstage/plugin-periskop-backend': patch -'@backstage/plugin-permission-react': patch -'@backstage/plugin-playlist-backend': patch -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-techdocs-backend': patch -'@backstage/plugin-apollo-explorer': patch -'@backstage/plugin-entity-feedback': patch -'@backstage/plugin-explore-backend': patch -'@backstage/plugin-gitops-profiles': patch -'@backstage/plugin-graphql-voyager': patch -'@backstage/plugin-jenkins-backend': patch -'@backstage/plugin-apache-airflow': patch -'@backstage/plugin-badges-backend': patch -'@backstage/plugin-bazaar-backend': patch -'@backstage/plugin-github-actions': patch -'@backstage/plugin-octopus-deploy': patch -'@backstage/plugin-search-backend': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-stack-overflow': patch -'@backstage/plugin-techdocs-react': patch -'@backstage/plugin-catalog-graph': patch -'@backstage/plugin-catalog-react': patch -'@backstage/plugin-code-coverage': patch -'@backstage/plugin-config-schema': patch -'@backstage/plugin-cost-insights': patch -'@backstage/plugin-explore-react': patch -'@backstage/plugin-github-issues': patch -'@backstage/plugin-kafka-backend': patch -'@backstage/plugin-nomad-backend': patch -'@backstage/plugin-tech-insights': patch -'@backstage/plugin-user-settings': patch -'@backstage/plugin-auth-backend': patch -'@backstage/plugin-azure-devops': patch -'@backstage/plugin-catalog-node': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-gcp-projects': patch -'@backstage/plugin-todo-backend': patch -'@backstage/plugin-adr-backend': patch -'@backstage/plugin-app-backend': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-firehydrant': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-home-react': patch -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-lighthouse': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-stackstorm': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-dynatrace': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-org-react': patch -'@backstage/plugin-pagerduty': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-xcmetrics': patch -'@backstage/plugin-airbrake': patch -'@backstage/plugin-api-docs': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-devtools': patch -'@backstage/plugin-graphiql': patch -'@backstage/plugin-linguist': patch -'@backstage/plugin-newrelic': patch -'@backstage/plugin-opencost': patch -'@backstage/plugin-periskop': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-puppetdb': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-bitrise': patch -'@backstage/plugin-catalog': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-jenkins': patch -'@backstage/plugin-rollbar': patch -'@backstage/plugin-allure': patch -'@backstage/plugin-badges': patch -'@backstage/plugin-bazaar': patch -'@backstage/plugin-search': patch -'@backstage/plugin-sentry': patch -'@backstage/plugin-fossa': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-kafka': patch -'@backstage/plugin-nomad': patch -'@backstage/plugin-vault': patch -'@backstage/plugin-gocd': patch -'@backstage/plugin-home': patch -'@backstage/plugin-todo': patch -'@backstage/plugin-adr': patch -'@backstage/plugin-org': patch ---- - -Remove some unused dependencies diff --git a/.changeset/sharp-pandas-hunt.md b/.changeset/sharp-pandas-hunt.md new file mode 100644 index 0000000000..1c69c02a0b --- /dev/null +++ b/.changeset/sharp-pandas-hunt.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-bitrise': patch +--- + +Update README diff --git a/.changeset/six-melons-end.md b/.changeset/six-melons-end.md new file mode 100644 index 0000000000..f139e49887 --- /dev/null +++ b/.changeset/six-melons-end.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-react': patch +--- + +Fixed a bug where the logs dialog and any other functionality depending on the proxy endpoint would fail for clusters configured with the OIDC auth provider. diff --git a/.changeset/sixty-shoes-prove.md b/.changeset/sixty-shoes-prove.md new file mode 100644 index 0000000000..fe9438eeb2 --- /dev/null +++ b/.changeset/sixty-shoes-prove.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-react': minor +--- + +**BREAKING** The pod exec terminal is now disabled by default since there are several scenarios where it is known not to work. It can be re-enabled at your own risk by setting the config parameter `kubernetes.podExecTerminal.enabled` to `true`. diff --git a/.changeset/sour-rivers-fry.md b/.changeset/sour-rivers-fry.md new file mode 100644 index 0000000000..1b74850614 --- /dev/null +++ b/.changeset/sour-rivers-fry.md @@ -0,0 +1,9 @@ +--- +'@backstage/create-app': patch +--- + +Updated `packages/app` as well as the root `package.json` type resolutions to use React v18. + +The `@testing-library/*` dependencies have also been updated to the ones compatible with React v18, and the test at `packages/app/src/App.test.tsx` had been updated to use more modern patterns that work better with these new versions. + +For information on how to migrate existing apps to React v18, see the [migration guide](https://backstage.io/docs/tutorials/react18-migration) diff --git a/.changeset/sour-taxis-rush.md b/.changeset/sour-taxis-rush.md deleted file mode 100644 index 1241cf3e8c..0000000000 --- a/.changeset/sour-taxis-rush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Removed unnecessary `history` and `immer` dependencies. diff --git a/.changeset/stale-hairs-sparkle.md b/.changeset/stale-hairs-sparkle.md deleted file mode 100644 index 3db8e974ec..0000000000 --- a/.changeset/stale-hairs-sparkle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-aws': patch ---- - -Added status and e-mail as labels to the AWS Account Resource diff --git a/.changeset/strange-parents-hammer.md b/.changeset/strange-parents-hammer.md new file mode 100644 index 0000000000..57d5eeb83d --- /dev/null +++ b/.changeset/strange-parents-hammer.md @@ -0,0 +1,5 @@ +--- +'@backstage/test-utils': minor +--- + +Added `components` option to `TestAppOptions`, which will be forwarded as the `components` option to `createApp`. diff --git a/.changeset/tame-numbers-smile.md b/.changeset/tame-numbers-smile.md new file mode 100644 index 0000000000..1d675f8c9c --- /dev/null +++ b/.changeset/tame-numbers-smile.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes-node': patch +--- + +Enabling authentication to kubernetes clusters with mTLS x509 client certs diff --git a/.changeset/ten-numbers-happen.md b/.changeset/ten-numbers-happen.md new file mode 100644 index 0000000000..73397d4568 --- /dev/null +++ b/.changeset/ten-numbers-happen.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Custom per-cluster auth metadata (mainly for use with custom `AuthenticationStrategy` implementations) can now be specified in the `authMetadata` property of clusters in the app-config. diff --git a/.changeset/tricky-pans-explain.md b/.changeset/tricky-pans-explain.md deleted file mode 100644 index 64b2bda1fe..0000000000 --- a/.changeset/tricky-pans-explain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist': patch ---- - -Added alpha support for the New Frontend System (Declarative Integration) diff --git a/.changeset/twenty-taxis-mate.md b/.changeset/twenty-taxis-mate.md new file mode 100644 index 0000000000..65ed158e9b --- /dev/null +++ b/.changeset/twenty-taxis-mate.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-compat-api': patch +--- + +Plugins converted by `convertLegacyApp` now have their `routes` and `externalRoutes` included as well, allowing them to be used to bind external routes in configuration. diff --git a/.changeset/warm-maps-scream.md b/.changeset/warm-maps-scream.md new file mode 100644 index 0000000000..3ea5d93b03 --- /dev/null +++ b/.changeset/warm-maps-scream.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-azure-devops': patch +'@backstage/plugin-devtools': patch +'@backstage/plugin-linguist': patch +--- + +Updated imports from named to default imports to help with the Material UI v4 to v5 migration diff --git a/.changeset/young-rules-repeat.md b/.changeset/young-rules-repeat.md new file mode 100644 index 0000000000..6fb17f0608 --- /dev/null +++ b/.changeset/young-rules-repeat.md @@ -0,0 +1,5 @@ +--- +'@backstage/eslint-plugin': patch +--- + +Added new `@backstage/no-top-level-material-ui-4-imports` rule that forbids top level imports from Material UI v4 packages diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 356faa81ea..57595621e4 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -13,29 +13,33 @@ body: required: true attributes: label: '๐Ÿ“œ Description' - description: 'A clear and concise description of what the bug is. It bugs out when ...' + description: 'A clear and concise description of what the bug is.' + placeholder: 'It bugs out when ...' - type: textarea id: expected-behavior validations: required: true attributes: label: '๐Ÿ‘ Expected behavior' - description: 'What did you think should happen? It should ...' + description: 'What did you think should happen?' + placeholder: 'It should ...' - type: textarea id: actual-behavior validations: required: true attributes: label: '๐Ÿ‘Ž Actual Behavior with Screenshots' - description: 'What did actually happen? Add screenshots, if applicable. It actually ...' + description: 'What did actually happen? Add screenshots, if applicable.' + placeholder: 'It actually ...' - type: textarea id: steps-to-reproduce validations: required: true attributes: label: '๐Ÿ‘Ÿ Reproduction steps' - description: 'How do you trigger this bug? Please walk us through it step by step. Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. Include code or configuration to reproduce, if relevant.' - placeholder: "\n + description: 'How do you trigger this bug? Please walk us through it step by step.' + placeholder: + "Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. Include code or configuration to reproduce, if relevant.\n 1. Go to '...'\n 2. Click on '....'\n 3. Scroll down to '....'" @@ -45,14 +49,17 @@ body: required: false attributes: label: '๐Ÿ“ƒ Provide the context for the Bug.' - description: 'How has this issue affected you? What are you trying to accomplish? Providing context (e.g. links to configuration settings, stack trace or log data) helps us come up with a solution that is most useful in the real world.' + description: 'How has this issue affected you? What are you trying to accomplish?' + placeholder: 'Providing context (e.g. links to configuration settings, stack trace or log data) helps us come up with a solution that is most useful in the real world.' - type: textarea id: environment validations: required: false attributes: label: '๐Ÿ–ฅ๏ธ Your Environment' - description: 'Always provide output of `yarn backstage-cli info`; provide browser information when applicable. Include as many relevant details about the environment you experienced the bug in.' + description: 'Provide Browser Information + Provide Output of `yarn backstage-cli info`' + placeholder: 'Include as many relevant details about the environment you experienced the bug in.' - type: checkboxes id: no-duplicate-issues attributes: diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index 8b1a697351..b2d5a6be81 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -14,6 +14,7 @@ body: attributes: label: '๐Ÿ”– Feature description' description: 'A clear and concise description of what the feature is.' + placeholder: 'You should add ...' - type: textarea id: context validations: @@ -21,11 +22,13 @@ body: attributes: label: '๐ŸŽค Context' description: 'Please explain why this feature should be implemented and how it would be used. Add examples, if applicable.' + placeholder: 'In my use-case, ...' - type: textarea id: implementation attributes: label: 'โœŒ๏ธ Possible Implementation' - description: 'A clear and concise description of what you want to happen. Not obligatory, but ideas as to the implementation of the addition or change.' + description: 'A clear and concise description of what you want to happen.' + placeholder: 'Not obligatory, but ideas as to the implementation of the addition or change' - type: checkboxes id: no-duplicate-issues attributes: diff --git a/.github/ISSUE_TEMPLATE/plugin.yaml b/.github/ISSUE_TEMPLATE/plugin.yaml index f77076146c..a7f5216631 100644 --- a/.github/ISSUE_TEMPLATE/plugin.yaml +++ b/.github/ISSUE_TEMPLATE/plugin.yaml @@ -14,16 +14,19 @@ body: attributes: label: '๐Ÿ”– Summary' description: 'Provide a general summary of the plugin and how it should work' + placeholder: 'You should add ...' - type: textarea id: website attributes: label: '๐ŸŒ Project website (if applicable)' description: 'Add a link to the open source project or product this plugin will integrate with, if existing' + placeholder: 'Website Link is ...' - type: textarea id: context attributes: label: 'โœŒ๏ธ Context' - description: 'A clear and concise description about the Plugin and any additional context.' + description: 'A clear and concise description about the Plugin.' + placeholder: 'Providing additional context' - type: checkboxes id: no-duplicate-issues attributes: diff --git a/.github/ISSUE_TEMPLATE/rfc.yaml b/.github/ISSUE_TEMPLATE/rfc.yaml index eae85419e7..8e73992dc8 100644 --- a/.github/ISSUE_TEMPLATE/rfc.yaml +++ b/.github/ISSUE_TEMPLATE/rfc.yaml @@ -13,24 +13,28 @@ body: required: true attributes: label: '๐Ÿ”– Need' - description: "Let us know why are you proposing this change. The problem we're trying to address and the benefits/impact we expect to get from this are ..." + description: 'Let us know why are you proposing this change' + placeholder: 'The problem weโ€™re trying to address and the benefits/impact we expect to get from this are ...' - type: textarea id: proposal validations: required: true attributes: label: '๐ŸŽ‰ Proposal' - description: 'Describe the proposal in as much detail as needed for reviewers to give concrete feedback. Take special care in this section to describe any implications on data privacy or security.' + description: 'Describe the proposal in as much detail as needed for reviewers to give concrete feedback.' + placeholder: 'Take special care in this section to describe any implications on data privacy or security.' - type: textarea id: alternatives attributes: label: 'ใ€ฝ๏ธ Alternatives' - description: 'What alternatives to the proposed solution were considered? What criteria/data was used to discard these?' + description: 'What alternatives to the proposed solution were considered?' + placeholder: 'What criteria/data was used to discard these?' - type: textarea id: risk attributes: label: 'โŒ Risks' - description: 'What other things happening could conflict or compete (for example for resources) with the proposal? What risk are there and how do we plan to handle them?' + description: 'What other things happening could conflict or compete (for example for resources) with the proposal?' + placeholder: 'What risk are there and how do we plan to handle them?' - type: checkboxes id: no-duplicate-issues attributes: diff --git a/.github/ISSUE_TEMPLATE/ux_component.yaml b/.github/ISSUE_TEMPLATE/ux_component.yaml index 97280b67bf..c528356eb3 100644 --- a/.github/ISSUE_TEMPLATE/ux_component.yaml +++ b/.github/ISSUE_TEMPLATE/ux_component.yaml @@ -6,34 +6,37 @@ body: - type: markdown attributes: value: | - We value your time and efforts to submit this UX Component form. ๐Ÿ™ + We value your time and efforts to submit this RFC form. ๐Ÿ™ - type: textarea id: ux-general validations: required: true attributes: label: '๐Ÿ”– General' - description: | - 'Write a nice note to the community requesting the creation of a new component. Include an image of your component. Bonus points for a GIF!' + description: 'Write a nice note to the community requesting the creation of a new component.' + placeholder: 'Include an image of your component. Bonus points for a GIF!' - type: textarea id: usage validations: required: true attributes: label: '๐Ÿ’ป Usage' - description: "Tell us what's the point of this component/pattern is. How does it help? How should it work? Any rules?" + description: "Tell us what's the point of this component/pattern is." + placeholder: 'How does it help? How should it work? Any rules?' - type: textarea id: specs validations: required: true attributes: label: '๐Ÿ“ Specs' - description: "Include images that detail the redlines for your component. Once we get our Figma workspace set up, we'll be posting the Figma files rather than doing specs by hand." + description: 'Include images that detail the redlines for your component.' + placeholder: "Once we get our Figma workspace set up, we'll be posting the Figma files rather than doing specs by hand." - type: textarea id: future attributes: label: '๐Ÿ”ฎ Future' description: 'List out any upcoming, exciting functionality for this component.' + placeholder: 'The component will have ...' - type: checkboxes id: no-duplicate-issues attributes: diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt similarity index 99% rename from .github/vale/Vocab/Backstage/accept.txt rename to .github/vale/config/vocabularies/Backstage/accept.txt index d557434d78..dc0b74b98c 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -312,6 +312,8 @@ rebase rebasing Recharts Redash +renderer +renderers replicasets repo Repo @@ -463,4 +465,4 @@ zod Zolotusky zoomable zsh -scrollable \ No newline at end of file +scrollable diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index 6918db4be5..f7c6c40832 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -6,6 +6,7 @@ on: pull_request: paths: - 'microsite/**' + - 'beps/**' permissions: contents: read diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ada4233f18..fd6e2edbc3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,7 @@ on: pull_request: paths-ignore: - 'microsite/**' + - 'beps/**' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -215,7 +216,7 @@ jobs: run: yarn backstage-cli repo lint --since origin/master - name: test changed packages - run: yarn backstage-cli repo test --maxWorkers=2 --workerIdleMemoryLimit=1300M --since origin/master + run: yarn backstage-cli repo test --maxWorkers=3 --workerIdleMemoryLimit=1300M --since origin/master env: BACKSTAGE_TEST_DISABLE_DOCKER: 1 BACKSTAGE_TEST_DATABASE_POSTGRES16_CONNECTION_STRING: postgresql://postgres:postgres@localhost:${{ job.services.postgres16.ports[5432] }} diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index 0d81f1c40a..6cd6caecf9 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -98,7 +98,7 @@ jobs: - name: test (and upload coverage) run: | - yarn backstage-cli repo test --maxWorkers=2 --workerIdleMemoryLimit=1300M --coverage + yarn backstage-cli repo test --maxWorkers=3 --workerIdleMemoryLimit=1300M --coverage bash <(curl -s https://codecov.io/bash) # Upload code coverage for some specific flags. Also see .codecov.yml bash <(curl -s https://codecov.io/bash) -f packages/core-app-api/coverage/* -F core-app-api diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 64472e71c6..a05d5acee1 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -66,6 +66,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@1500a131381b66de0c52ac28abb13cd79f4b7ecc # v2.22.12 + uses: github/codeql-action/upload-sarif@4759df8df70c5ebe7042c3029bbace20eee13edd # v2.23.1 with: sarif_file: results.sarif diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index f1a91ed7e6..ec7c00111d 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -29,7 +29,7 @@ jobs: cache-prefix: ${{ runner.os }}-v18.x - name: Create Snyk report - uses: snyk/actions/node@3e2680e8df93a24b52d119b1305fb7cedc60ceae # master + uses: snyk/actions/node@1d672a455ab3339ef0a0021e1ec809165ee12fad # master continue-on-error: true # Snyk CLI exits with error when vulnerabilities are found with: args: > diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml index c3f7af1550..a4ae1ac803 100644 --- a/.github/workflows/sync_snyk-monitor.yml +++ b/.github/workflows/sync_snyk-monitor.yml @@ -31,7 +31,7 @@ jobs: - uses: actions/checkout@v4.1.1 - name: Monitor and Synchronize Snyk Policies - uses: snyk/actions/node@3e2680e8df93a24b52d119b1305fb7cedc60ceae # master + uses: snyk/actions/node@1d672a455ab3339ef0a0021e1ec809165ee12fad # master with: command: monitor args: > @@ -46,7 +46,7 @@ jobs: # Above we run the `monitor` command, this runs the `test` command which is # the one that generates the SARIF report that we can upload to GitHub. - name: Create Snyk report - uses: snyk/actions/node@3e2680e8df93a24b52d119b1305fb7cedc60ceae # master + uses: snyk/actions/node@1d672a455ab3339ef0a0021e1ec809165ee12fad # master continue-on-error: true # To make sure that SARIF upload gets called with: args: > @@ -58,6 +58,6 @@ jobs: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} NODE_OPTIONS: --max-old-space-size=7168 - name: Upload Snyk report - uses: github/codeql-action/upload-sarif@v2.22.12 + uses: github/codeql-action/upload-sarif@v2.23.1 with: sarif_file: snyk.sarif diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml index c0bbde49f3..6eac098448 100644 --- a/.github/workflows/uffizzi-build.yml +++ b/.github/workflows/uffizzi-build.yml @@ -7,6 +7,7 @@ on: - 'contrib/**' - 'docs/**' - 'microsite/**' + - 'beps/**' - 'scripts/**' - 'storybook/**' - '**/*.test.*' @@ -60,7 +61,7 @@ jobs: - name: Docker metadata id: meta - uses: docker/metadata-action@e6428a5c4e294a61438ed7f43155db912025b6b3 # v5.2.0 + uses: docker/metadata-action@dbef88086f6cef02e264edb7dbf63250c17cef6c # v5.5.0 with: images: registry.uffizzi.com/${{ env.UUID_TAG_APP }} tags: type=raw,value=60d diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index a9cce41fce..2c1c353847 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -12,16 +12,23 @@ jobs: name: Cache Manifests File runs-on: ubuntu-latest if: ${{ github.event.workflow_run.conclusion == 'success' }} + permissions: + # "If you specify the access for any of these scopes, all of those that are not specified are set to none." + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions + actions: read # Access cache outputs: - manifests-cache-key: ${{ env.MANIFESTS_FILE_HASH }} - git-ref: ${{ env.GIT_REF }} - pr-number: ${{ env.PR_NUMBER }} - action: ${{ env.ACTION }} + manifests-cache-key: ${{ steps.hash.outputs.MANIFESTS_FILE_HASH }} + git-ref: ${{ steps.event.outputs.GIT_REF }} + pr-number: ${{ steps.event.outputs.PR_NUMBER }} + action: ${{ steps.event.outputs.ACTION }} steps: - name: Harden Runner uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: - egress-policy: audit + disable-sudo: true + egress-policy: block + allowed-endpoints: > + api.github.com:443 - name: 'Download artifacts' # Fetch output (zip archive) from the workflow run that triggered this workflow. @@ -48,59 +55,50 @@ jobs: let fs = require('fs'); fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/preview-spec.zip`, Buffer.from(download.data)); - - name: 'Unzip artifact' - run: unzip preview-spec.zip + - name: 'Accept event from first stage' + run: unzip preview-spec.zip event.json - name: Read Event into ENV + id: event run: | - echo 'EVENT_JSON<> $GITHUB_ENV - cat event.json >> $GITHUB_ENV - echo -e '\nEOF' >> $GITHUB_ENV + echo PR_NUMBER=$(jq '.number | tonumber' < event.json) >> $GITHUB_OUTPUT + echo ACTION=$(jq --raw-output '.action | tostring | [scan("\\w+")][0]' < event.json) >> $GITHUB_OUTPUT + echo GIT_REF=$(jq --raw-output '.pull_request.head.sha | tostring | [scan("\\w+")][0]' < event.json) >> $GITHUB_OUTPUT - name: Hash Rendered Manifests File id: hash # If the previous workflow was triggered by a PR close event, we will not have a manifests file artifact. - if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }} + if: ${{ steps.event.outputs.ACTION != 'closed' }} run: | + unzip preview-spec.zip manifests.rendered.yml ls - echo "MANIFESTS_FILE_HASH=$(md5sum manifests.rendered.yml | awk '{ print $1 }')" >> $GITHUB_ENV + echo "MANIFESTS_FILE_HASH=$(md5sum manifests.rendered.yml | awk '{ print $1 }')" >> $GITHUB_OUTPUT - name: Cache Manifests File - if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }} - uses: actions/cache@v3.3.2 + if: ${{ steps.event.outputs.ACTION != 'closed' }} + uses: actions/cache@v3.3.3 with: path: manifests.rendered.yml - key: ${{ env.MANIFESTS_FILE_HASH }} - - - name: Read PR Number From Event Object - id: pr - run: echo "PR_NUMBER=${{ fromJSON(env.EVENT_JSON).number }}" >> $GITHUB_ENV - - - name: Read Event Type from Event Object - id: action - run: echo "ACTION=${{ fromJSON(env.EVENT_JSON).action }}" >> $GITHUB_ENV - - - name: Read Git Ref From Event Object - id: ref - run: echo "GIT_REF=${{ fromJSON(env.EVENT_JSON).pull_request.head.sha }}" >> $GITHUB_ENV + key: ${{ steps.hash.outputs.MANIFESTS_FILE_HASH }} - name: DEBUG - Print Job Outputs if: ${{ runner.debug }} run: | - echo "PR number: ${{ env.PR_NUMBER }}" - echo "Git Ref: ${{ env.GIT_REF }}" - echo "Manifests file hash: ${{ env.MANIFESTS_FILE_HASH }}" + echo "PR number: ${{ steps.event.outputs.PR_NUMBER }}" + echo "Git Ref: ${{ steps.event.outputs.GIT_REF }}" + echo "Action: ${{ steps.event.outputs.ACTION }}" + echo "Manifests file hash: ${{ steps.hash.outputs.MANIFESTS_FILE_HASH }}" cat event.json deploy-uffizzi-preview: - permissions: - contents: read - pull-requests: write - id-token: write name: Deploy to Uffizzi Virtual Cluster needs: - cache-manifests-file if: ${{ github.event.workflow_run.conclusion == 'success' && needs.cache-manifests-file.outputs.action != 'closed' }} + permissions: + contents: read + pull-requests: write + id-token: write runs-on: ubuntu-latest steps: - name: Checkout @@ -126,7 +124,7 @@ jobs: body: | ## Uffizzi Ephemeral Environment - Virtual Cluster - :cloud: deploying ... + :cloud: deploying cluster `pr-${{ needs.cache-manifests-file.outputs.pr-number }}` :gear: Updating now by workflow run [${{ github.run_id }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}). @@ -142,7 +140,6 @@ jobs: - name: Fetch cached Manifests File id: cache - # if: ${{ contains(fromJSON('["create", "update"]'), env.UFFIZZI_ACTION) }} uses: actions/cache@v3 with: path: manifests.rendered.yml diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml index 61be150ff8..43a762e3c9 100644 --- a/.github/workflows/verify_codeql.yml +++ b/.github/workflows/verify_codeql.yml @@ -55,7 +55,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2.22.12 + uses: github/codeql-action/init@v2.23.1 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -66,7 +66,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2.22.12 + uses: github/codeql-action/autobuild@v2.23.1 # โ„น๏ธ Command-line programs to run using the OS shell. # ๐Ÿ“š https://git.io/JvXDl @@ -80,4 +80,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2.22.12 + uses: github/codeql-action/analyze@v2.23.1 diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index f87c8c2d38..d4b83ccefc 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -30,5 +30,6 @@ jobs: with: # This also contains --config=.github/vale/config.ini ... :/ files: '${{ steps.generate.outputs.args }}' + version: latest env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/verify_e2e-linux-noop.yml b/.github/workflows/verify_e2e-linux-noop.yml index c1ac6ecf89..19b2508d27 100644 --- a/.github/workflows/verify_e2e-linux-noop.yml +++ b/.github/workflows/verify_e2e-linux-noop.yml @@ -9,6 +9,7 @@ on: - 'contrib/**' - 'docs/**' - 'microsite/**' + - 'beps/**' concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 0e335b8fe0..3f403b2c91 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -7,6 +7,7 @@ on: - 'contrib/**' - 'docs/**' - 'microsite/**' + - 'beps/**' concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/verify_microsite-noop.yml b/.github/workflows/verify_microsite-noop.yml index ac0e397127..d730c7aba6 100644 --- a/.github/workflows/verify_microsite-noop.yml +++ b/.github/workflows/verify_microsite-noop.yml @@ -7,6 +7,7 @@ on: paths-ignore: - '.github/workflows/verify_microsite.yml' - 'microsite/**' + - 'beps/**' - 'mkdocs.yml' - 'docs/**' diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index 42a6663e59..5c76148b92 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -5,6 +5,7 @@ on: paths: - '.github/workflows/verify_microsite.yml' - 'microsite/**' + - 'beps/**' - 'mkdocs.yml' - 'docs/**' diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index 6219faf616..29d86e913a 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -51,7 +51,7 @@ jobs: - run: yarn build-storybook - - uses: chromaui/action@80bf5911f28005ed208f15b7268843b79ca0e23a # v1 + - uses: chromaui/action@7fb6b0407c69171ce521d08355a825958a5ef81a # v1 with: token: ${{ secrets.GITHUB_TOKEN }} # projectToken intentionally shared to allow collaborators to run Chromatic on forks diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index 4cffa959da..143b22c8b6 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -55,7 +55,7 @@ jobs: run: yarn lint:type-deps - name: test - run: yarn backstage-cli repo test --maxWorkers=2 --workerIdleMemoryLimit=1300M + run: yarn backstage-cli repo test --maxWorkers=3 --workerIdleMemoryLimit=1300M env: BACKSTAGE_TEST_DISABLE_DOCKER: 1 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 527957677b..be88ed2249 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -386,7 +386,7 @@ Here are a few things that can help as you go through the review process: - PRs get automatically assigned so you don't need to ping people, they will be notified and have a process of their own for this - If you are waiting for a review or mid-review and your PR goes stale one of the easiest ways to clear the stale bot is by simply rebasing your PR - There are times where you might run into conflict with the `yarn.lock` during a rebase, to help with that make sure your `master` branch is up to date and then in your branch run `git checkout master yarn.lock` and then run `yarn install`, this will get you a conflict free `yarn.lock` file you can commit -- If Vale finds issues with your documentation but it's a code reference you can fix it by putting backticks (`) around it. Now if it is a special word or maybe a name there are two ways you can fix that by adding it to the list of accepted words in the [accept.txt file](https://github.com/backstage/backstage/blob/master/.github/vale/Vocab/Backstage/accept.txt) and them committing that change +- If Vale finds issues with your documentation but it's a code reference you can fix it by putting backticks (`) around it. Now if it is a special word or maybe a name there are two ways you can fix that by adding it to the list of accepted words in the [accept.txt file](https://github.com/backstage/backstage/blob/master/.github/vale/config/vocabularies/Backstage/accept.txt) and them committing that change ### Merging to Master diff --git a/README-ko_kr.md b/README-ko_kr.md index f7bcba144b..0544304cea 100644 --- a/README-ko_kr.md +++ b/README-ko_kr.md @@ -22,10 +22,10 @@ Backstage ๋Š” ๋ชจ๋“  ์ธํ”„๋ผ ๋„๊ตฌ, ์„œ๋น„์Šค ๋ฐ ๋ฌธ์„œ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์ฒ˜ ![software-catalog](docs/assets/header.png) -Backstage ๋‹ค์Œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค: +Backstage๋Š” ๋‹ค์Œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค: - [Backstage Software Catalog](https://backstage.io/docs/features/software-catalog/) ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ, ์›น ์‚ฌ์ดํŠธ, ML ๋ชจ๋ธ ๋“ฑ ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด ๊ด€๋ฆฌ -- [Backstage Software Templates](https://backstage.io/docs/features/software-templates/) ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ  ์กฐ์ง์˜ ๋ชจ๋ฐค ์‚ฌ๋ก€์—๋”ฐ๋ผ ๋„๊ตฌ๋ฅผ ํ‘œ์ค€ํ™” +- [Backstage Software Templates](https://backstage.io/docs/features/software-templates/) ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ  ์กฐ์ง์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€์—๋”ฐ๋ผ ๋„๊ตฌ๋ฅผ ํ‘œ์ค€ํ™” - [Backstage TechDocs](https://backstage.io/docs/features/techdocs/) "docs like code" ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์ˆ  ๋ฌธ์„œ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑ, ์œ ์ง€ ๊ด€๋ฆฌ, ๊ฒ€์ƒ‰ ๋ฐ ์‚ฌ์šฉ - [open source plugins](https://github.com/backstage/backstage/tree/master/plugins) Backstage์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ํ™•์žฅ diff --git a/README-zh_Hans.md b/README-zh_Hans.md index bf96eea389..b1e5a16add 100644 --- a/README-zh_Hans.md +++ b/README-zh_Hans.md @@ -57,7 +57,7 @@ Backstage ็š„ๆ–‡ๆกฃๅŒ…ๆ‹ฌ๏ผš - [ๅ‚ไธŽ่ดก็Œฎ Backstage](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md) - ๅฆ‚ๆžœๆ‚จๆƒณๅšๅ‡บ่ดก็Œฎ๏ผŒ่ฏทไปŽ่ฟ™้‡Œๅผ€ๅง‹ - [RFCs](https://github.com/backstage/backstage/labels/rfc) - ๅธฎๅŠฉๅˆถๅฎšๆŠ€ๆœฏๆ–นๅ‘ - [FAQ](https://backstage.io/docs/FAQ) - n.: ๅธธ้—ฎ้—ฎ้ข˜ -- [่กŒไธบๅ‡†ๅˆ™](CODE_OF_CONDUCT.md) - ่ฟ™ๆ˜ฏๆˆ‘ไปฌ็š„ๅˆ‘ไบ‹ๆ–นๅผ +- [่กŒไธบๅ‡†ๅˆ™](CODE_OF_CONDUCT.md) - ่ฟ™ๆ˜ฏๆˆ‘ไปฌ็š„่กŒไบ‹ๆ–นๅผ - [้‡‡็บณ่€…](ADOPTERS.md) - ๅทฒ็ปๅœจไฝฟ็”จ Backstage ็š„ๅ…ฌๅธ - [ๅšๅฎข](https://backstage.io/blog/) - ๅ…ฌๅ‘Šๅ’Œๆ›ดๆ–ฐ - [้€š่ฎฏ](https://spoti.fi/backstagenewsletter) - ่ฎข้˜…ๆˆ‘ไปฌ็š„็”ตๅญ้‚ฎไปถ้€š่ฎฏ diff --git a/beps/0001-notifications-system/README.md b/beps/0001-notifications-system/README.md new file mode 100644 index 0000000000..c7b0ffff64 --- /dev/null +++ b/beps/0001-notifications-system/README.md @@ -0,0 +1,255 @@ +--- +title: Backstage Notifications System +status: provisional +authors: + - Rugvip +project-areas: + - core +creation-date: 2023-01-12 +--- + +# BEP: Backstage Notifications System + +[**Discussion Issue**](https://github.com/backstage/backstage/issues/22213) + +- [Summary](#summary) +- [Motivation](#motivation) + - [Goals](#goals) + - [Non-Goals](#non-goals) +- [Proposal](#proposal) +- [Design Details](#design-details) +- [Release Plan](#release-plan) +- [Dependencies](#dependencies) +- [Alternatives](#alternatives) + +## Summary + +The Backstage Notifications System provides a way for Backstage plugins to send notifications to users. The notifications are displayed in the Backstage frontend UI, but future extensions can allow them to be sent via external channels such as email. The system includes a push mechanism to make sure that users receive notifications immediately, as well as persistence of notification history and read status. + +## Motivation + +Support for notifications is an old and common features request. See [#639](https://github.com/backstage/backstage/issues/639) and [#10652](https://github.com/backstage/backstage/issues/10652). There are also initiatives to implement notifications in [#20312](https://github.com/backstage/backstage/issues/20312) as well as the underlying infrastructure pieces, for example [#17997](https://github.com/backstage/backstage/issues/17997). + +This proposal assumes that further motivation for a notifications system as a whole is not needed. The focus is instead on the specific goals of an initial notifications system, and generally aiming to address the need to coordinate this work. + +### Goals + +We aim to build a system that would provide support for the following type of notifications, as listed in [#10652](https://github.com/backstage/backstage/issues/10652): + +- System-wide announcements or alerts +- Notifications for component owners (e.g. build failure, successful deployment, new vulnerabilities) +- Notifications for individuals (e.g. updates you have subscribed to, new required training courses) +- Notifications pertaining to a particular entity in the catalog (a given notification might apply to an entity and the owning team) + +Initially we only target a single way to send notifications: via a REST API call to the notifications backend, which in turn also provides an accompanying [backend service](https://backstage.io/docs/backend-system/architecture/services). + +The notifications system will need to support scaled deployments, where multiple backend instances may be deployed. + +In the future we aim to provide an extensible system that can be customized to send notifications to users via other channels. Notifications can be captured and processed in-band in order to trigger custom behavior such as sending an email. The goal is for this to be possible to build, but not necessarily part of the initial implementation. + +### Non-Goals + +The following features are out of scope for this BEP: + +- Building out specific support for channels such as email, Slack, and other external channels. +- Providing a fallback mechanisms when a notification cannot be delivered to a user. For example, if a user has not logged in for a long time, we will not attempt to send an email instead. + +## Proposal + +The notifications system is implemented through two net-new components, the `notifications` plugin, and the `signal` plugin. + +The `notifications` plugin in its simplest form provides the following: + +- A backend API for sending, reading, and interacting with notifications. +- Persistent storage of notification state. +- A frontend UI for viewing notifications. + +The `signal` plugin provides the following: + +- A backend API for pushing lightweight signals to online users. +- A connection between the frontend and backend that can be used to push messages to the client. +- A frontend API that lets plugins to subscribe to specific signals. + +### Signals Plugin + +In the backend the signal plugin implements a general purpose message bus for sending signals from backend plugins to connected users. It relies on the `EventBroker` from the [events plugin](https://github.com/backstage/backstage/blob/master/plugins/events-backend/README.md) for the actual message passing in the backend. In order to support scaled deployments, each signal backend instance has a separate subscription to the event broker so that each instance receives all events. It is then up to each backend instance to filter out events that are not relevant to it. For this reason, signals should be kept lightweight and not contain unnecessary data. + +In the frontend the signal plugin has a persistent connection to the signal backend. This is initially implemented as a WebSocket connection, but could in the future also receive fallback mechanisms such as Server Sent Events or long polling. It is important that this connection is authenticated as we will be routing signals to specific users. The exact implementation of the authentication is not part of this proposal, but it should use whatever the outcome of the discussion in issue [#19581](https://github.com/backstage/backstage/issues/19581) is. + +In order to route signals from the sender to the intended receiver the signal plugin uses the concept of signaling channels. They are just like the topics on the message bus, but we use separate terminology in order to avoid confusion. They also sit one layer beneath the even topic in the protocol stack, where the signal channel is communicated as part of the event payload. In the frontend, the signal plugin exposes an API to subscribe to a signal channel. Each time the user receives a signal on the specified channel, a listener is called with the signal payload. + +### Notifications Plugin + +The role of the notifications plugin is to manage the lifecycle of notifications. The backend plugin provides an API for other backends to send notifications, as well as an accompanying [backend service](https://backstage.io/docs/backend-system/architecture/services). It also provides a separate API for the frontend plugin to read notifications for an individual user and manage the read status of notifications. + +The notification backend stores notification using the [database service](https://backstage.io/docs/backend-system/core-services/index#database). In particular it needs to store the following information for each notification: + +- ID +- Payload +- Receivers +- Read status by user + +The receivers is **not** a list of users, but rather a filter that describes who should receive the notification. It must be possible to evaluate this filter in a database query, so that we can efficiently fetch all notifications for a given user. The same filter will also be used by the signal backend to determine which users should receive a signal. + +The notification backend does not provide any new permissions, since creating notifications can only be done by other backend plugins, while reading notifications can only be done by the authenticated user. It is possible that we want to add a permissions for reading notifications, in particular for admin and impersonation use cases, but that is not part of this proposal or the initial implementation. + +The notification frontend plugin provides a UI for viewing notifications, which in the initial implementation can be as simple as needed. The only requirement is that a user is able to view recent notifications and distinguish between read and unread notifications. A notification as marked as read once it has been interacted with. The frontend plugin also subscribes to the notifications signal channel and alerts the user when a new notification is received. + +### Architecture Overview + +The diagram below show an overview of the notifications system architecture and the interaction between the different components. + +![notifications system architecture diagram](./notifications-architecture.drawio.svg) + +The components that are presented with dashed lines are not directly part of this proposal, but included to be considered as future extensions. + +Let's walk through the process of sending of a notification to a user: + +1. A backend plugin that wants to send a notification to a user uses the `NotificationService`, which in turn makes a POST request to the notification backend. The request contains a filter to select the target users, as well as the notification payload. + + 1b. As the notification backend handles the request it could optionally invoke a series of notification processors. These processors can be used to transform the notification payload, send the notification through other channels, and decide whether the regular notification flow should continue or not. This step is not in scope for this proposal. + +2. The notification backend stores the received notification in its database. At this point the notification is available from the notification backend's read API. +3. The notification backend published an event to the event bus on the `'signal'` topic. This event payload contains the signaling channel, in this case `'notifications'`, as well as the target user ID and the notification ID, but not the notification payload. +4. Each instance of the signal backend plugin subscribes to the `'signal'` topic and receives the event. +5. Each signal backend instance has a set of push channels set up to online users. The incoming event is filtered based on the target user ID and the signaling is pushed through all connections with a matching user ID. +6. The signal frontend plugin receives the signal and forwards it to all subscribers of the target channel. In this case, the notifications frontend plugin, who is subscribed to the `'notifications'` channel. +7. The notifications frontend plugin receives the signal with the notification ID. It then makes a request to the notification backend to fetch the notification payload and then displays the notification to the user. + + 7b. Rather than rendering the notification directly, the notifications frontend plugin leaves that to an extension installed by the frontend part of the backend plugin that sent the notification. This allows for a more customized notification experience which can also contain custom actions and data display. This step is not in scope for this proposal. + +## Design Details + +### Backend Services + +The following backend service interfaces are added as part of this proposal. + +#### `NotificationService` + +```ts +// TODO - We may want to add an additional wrapping here with interfaces for Notification and NotificationParameters + +interface SendNotificationRequest { + receivers: SignalReceivers; + + /* TODO - please contribute :) */ +} + +interface SendNotificationResponse { + id: string; + receivers: SignalReceivers; + + /* TODO - please contribute :) */ +} + +interface NotificationService { + sendNotification( + request: SendNotificationRequest, + ): Promise; +} +``` + +#### `SignalService` + +```ts +type SignalReceivers = + | { + type: 'entity'; + entityRef: string; // typically a user or group entity + } + | { + type: 'broadcast'; // all users + }; + +interface Signal { + channel: string; + receivers: SignalReceivers; + payload: JsonObject; +} + +interface SignalService { + signal(signal: Signal): Promise; +} +``` + +### Frontend API + +The following frontend API is added as part of this proposal. + +#### `SignalApi` + +> TODO - we likely need a slightly different approach here, since APIs are lazy loaded. + +```ts +interface SignalSubscriber { + unsubscribe(): void; +} + +interface SignalApi { + subscribe( + channel: string, + listener: (payload: JsonObject) => void, + ): SignalSubscriber; +} +``` + +> TODO: Add payload formats and API details + + + +## Release Plan + +The notification and signal plugins are released as two new plugins in the Backstage ecosystem. They will both start out in an experimental state. + +For the notification plugin to reach a stable release we much reach the following: + +- A stable notifications payload format. +- A stable notifications receiver filter format. +- The event broker must have at least one implementation that supports scaled deployments. + +For the signal plugin to reach a stable release we much reach the following: + +- A stable signal receiver filter format. +- A stable signal channel API in the frontend. + +If any changes are required to the frontend framework to facilitate the implementation of notifications or signals, these will be released as experimental alpha features. They will stay in alpha until they are deemed stable enough, which must happen before a stable release of the notifications system. + +## Dependencies + +Since the signal plugin relies on the event broker for communication, it is a dependency for the notifications system as a whole. The event broker does not currently implement any transport for scaled deployments, which is a requirement for scaled deployments of the notification system. + +## Alternatives + +### Signal Plugin Separation + +One primary consideration for the notifications system was whether the notification plugin should set up its own frontend push connection rather than relying on the signal plugin. The signal plugin separation is done for three primary reasons: + +1. The use-case of sending signals from backend plugins to frontend plugins is not limited to only notifications, since not all signals should necessarily be displayed directly to the user. For example, the catalog backend may want to send a signal to the frontend when an entity is updated so that users that are currently viewing the entity in the frontend can trigger an update of the view. +2. We want to limit the number of WebSocket connections that the frontend needs to maintain. By using a separated signal abstraction it is easier to extend the implementation to support other messaging patterns in the future. For example, we may want to move the Scaffolder logs to be sent via the signal plugin instead. That is much more straightforward with a separate signal plugin compared to adding it to the notifications plugin. +3. The technical implementation of sending signals is sufficiently complex that it makes sense to separate out to its own solution in order to reduce the complexity of the notifications plugin. In particular when it comes to handling scaled deployments. + +### User-to-User Notifications + +The notification backend API for sending notifications is only available to other backend plugins, and is not accessible to end users in the frontend. If this were to be added it would likely be a separate backend module that you can install alongside the notification backend. That is unless the permission framework can be extended to support default policy handlers so that we can reject the permission to send user notifications by default. + +There are a few reasons we don't want to allow user-to-user notifications out of the box: + +- To limit the possibility of spam. Even if well-intended, a notification overload can quickly lead to a bad user experience and users disabling and ignoring notifications. +- From a security perspective it's beneficial to avoid user sent notifications since they could be used to trick users into clicking on malicious links, or other similar attacks. +- Our assumption is that this is a feature that most adopters will not want to use, and so by having it be disabled by default we can avoid additional configuration steps. diff --git a/beps/0001-notifications-system/notifications-architecture.drawio.svg b/beps/0001-notifications-system/notifications-architecture.drawio.svg new file mode 100644 index 0000000000..9f8194b499 --- /dev/null +++ b/beps/0001-notifications-system/notifications-architecture.drawio.svg @@ -0,0 +1,537 @@ + + + + + + + + + + +
+
+
+ Notification Backend +
+
+
+
+ + Notification Backend + +
+
+ + + + + + + + +
+
+
+ Notification Frontend +
+
+
+
+ + Notification Frontend + +
+
+ + + + +
+
+
+ Signal Backend +
+
+
+
+ + Signal Backend + +
+
+ + + + + + + + + + +
+
+
+ Signal Frontend +
+
+
+
+ + Signal Frontend + +
+
+ + + + + + +
+
+
+ Plugin X Backend +
+
+
+
+ + Plugin X Backend + +
+
+ + + + +
+
+
+ Plugin X Frontend +
+
+
+
+ + Plugin X Frontend + +
+
+ + + + + + + + + + + + +
+
+
+ Event Broker +
+
+
+
+ + Event Broker + +
+
+ + + + + + +
+
+
+ ... +
+
+
+
+ + ... + +
+
+ + + + +
+
+
+ ... +
+
+
+
+ + ... + +
+
+ + + + +
+
+
+ publish event +
+
+
+
+ + publish event + +
+
+ + + + +
+
+
+ broadcast +
+
+
+
+ + broadcast + +
+
+ + + + +
+
+
+ ??? +
+
+
+
+ + ??? + +
+
+ + + + +
+
+
+ server push +
+
+
+
+ + server push + +
+
+ + + + +
+
+
+ POST +
+
+
+
+ + POST + +
+
+ + + + + + +
+
+
+ External System +
+
+
+
+ + External System + +
+
+ + + + +
+
+
+ email/slack/teams, etc. +
+
+
+
+ + email/slack/teams, etc. + +
+
+ + + + +
+
+
+ Render +
+
+
+
+ + Render + +
+
+ + + + +
+
+
+ + Processor + +
+
+
+
+ + Processor + +
+
+ + + + +
+
+
+ GET +
+
+
+
+ + GET + +
+
+ + + + +
+
+
+ 1 +
+
+
+
+ + 1 + +
+
+ + + + +
+
+
+ 3 +
+
+
+
+ + 3 + +
+
+ + + + +
+
+
+ 1b +
+
+
+
+ + 1b + +
+
+ + + + +
+
+
+ 4 +
+
+
+
+ + 4 + +
+
+ + + + +
+
+
+ 5 +
+
+
+
+ + 5 + +
+
+ + + + +
+
+
+ 6 +
+
+
+
+ + 6 + +
+
+ + + + +
+
+
+ 7b +
+
+
+
+ + 7b + +
+
+ + + + +
+
+
+ 7 +
+
+
+
+ + 7 + +
+
+ + + + + + +
+
+
+ 2 +
+
+
+
+ + 2 + +
+
+ + + + +
+
+
+ Channel Callback +
+
+
+
+ + Channel Callback + +
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/beps/0002-dynamic-frontend-plugins/README.md b/beps/0002-dynamic-frontend-plugins/README.md new file mode 100644 index 0000000000..b44c4a8b20 --- /dev/null +++ b/beps/0002-dynamic-frontend-plugins/README.md @@ -0,0 +1,492 @@ +--- +title: Dynamic Frontend Plugins +status: provisional +authors: + - '@Hyperkid123' +owners: +project-areas: + - core +creation-date: 2024-01-17 +--- + + + +# BEP: + + + +[**Discussion Issue**](https://github.com/backstage/backstage/issues/NNNNN) + +- [Summary](#summary) +- [Motivation](#motivation) + - [Goals](#goals) + - [Non-Goals](#non-goals) +- [Proposal](#proposal) +- [Design Details](#design-details) +- [Release Plan](#release-plan) +- [Dependencies](#dependencies) +- [Alternatives](#alternatives) + +## Summary + + + +The dynamic frontend plugins feature is a way of loading additional frontend plugins at runtime, without the requirement of rebuilding and restarting a running backstage instance. + +This system should significantly improve frontend plugin management for backstage instances. + +The dynamic plugins leverage the declarative UI system to define what a plugin is and how it should be represented in the browser. + +## Motivation + + + +### Goals + + + +- discover and choose tooling to enable dynamic frontend plugins +- easy way of converting existing frontend plugins to be dynamic +- turning on and off UI plugins at runtime without the requirement of rebuilding or restarting backstage +- manage dynamic plugins declaratively + +An additional goal might be exploring the scope of a "on demand" rending and loading. Currently all plugins, or at least some portion of them must be loaded at UI bootstrap. This approach is not fully dynamic and might be considered a waste of resources. Fully optimizing dynamic plugins loading would require additional changes to the new UI system. + +### Non-Goals + + + +## Proposal + + + +### Definition of UI dynamic plugin + +A dynamic UI plugin (from now just plugin) is a plugin that is not part of the output of a backstage instance build. The plugin and its assets are injected into backstage at runtime. In this case, its injected into the browser at some point during user session. + +From the user POV, there is no difference between classic and dynamic plugins. + +The difference is known only to maintainers and should be limited to + +- build requirements +- integration into backstage + +### Dynamic loading tool + +Traditional plugins are not dynamic out of the box. Additional changes are required during build time to make a plugin dynamic. + +The main application (shell) also requires some changes to be able to load, inject, and propagate mandatory context to dynamic plugins. + +Over the last few year, [Module Federation](https://github.com/module-federation) has become the standard when it comes to dynamically load JS modules browser (and nodejs) environment from remote locations and sharing context between the shell and the remote module. + +Although there are other options, like externalizing dependencies, the module federation has proven itself as a robust solution to this particular problem. + +### Module federation implementation + +There are multiple available implementations of module federation. + +Historically, module federation was implemented as a [Webpack feature](https://webpack.js.org/). Since then, additional implementations were created. Mainly for [`rspack`](https://www.rspack.dev/) and [Vite](https://github.com/originjs/vite-plugin-federation). + +Recent changes _claim_, that all of these module federation implementations should be compatible with each other and there should be no need for locking backstage into a single implementation. + +Compatibility between Webpack and `rspack` should available via the [@module-federation/enhanced](https://www.npmjs.com/package/@module-federation/enhanced) package. The compatibility is further [described here](https://www.rspack.dev/blog/module-federation-added-to-rspack.html#introducing-rspack-050). + +The Vite plugin claims webpack compatibility as well. The Vite plugin _is not part of the @module-federation_ organization. The extend of compatibility is at this time unknown. + +**The level of compatibility has to be tested.** Before then, no decision in regards to which implementation(s) will be used should be made. The chosen tool, or their mix, will shape the design and implementation. + +That said, packages from the `@module-federation/*` organization should have higher priority as they are based directly on the module federation concepts and are well supported. + +### Plugin integration into shell applications + +Plugins should be integrated via the new UI system. The system already provides an asynchronous way of loading plugins. The dynamic plugins can be loaded in a similar fashion. + +Plugins should be defined declaratively through configuration. Similar to what was described in this [RFC](https://github.com/backstage/backstage/issues/18372) and in this [issue](https://github.com/backstage/backstage/issues/19545). + +### Plugin registry + +Because plugins are not available at build time, some sort of registry needs to exist to store the information. + +This registry needs to be mutable at runtime (add/remove new plugin metadata) and changes have to be reflected on session refresh. + +This is currently an issue as the app config is embedded into JS assets during build time. + +Each plugin is required to provide manifest file (metadata) in predefined format. This manifest will be used to inject the plugin assets into the browser. + +### Plugin discovery + +Plugin discovery is a pre-requisite for Plugin registry. This should be responsible for scanning for available plugins and generating/modifying the plugin registry to always keep it up to date. + +## Design Details + +> NOTE The details are based on the Janus implementation of dynamic frontend plugins. The implementation leverages [Scalprum](https://github.com/scalprum/scaffolding) which is a Webpack based dynamic plugin manager for React applications. + +### Module federation implementation experiments + +> NOTE Share outcome of testing mixing multiple tools for module federation. + +Test should consist of trying to run permutations of webpack/Rspack/vite based shell apps/plugins and discover if we can freely choose any tool, or if we should restrict the tooling to just a subset of the available options. + +### Plugin manifest + +Each plugin should have a manifest file with important metadata. This metadata is used to load the remote assets to browser. The plugin manifest should be part of a build output. + +A manifest should have: + +- name of plugin +- how can be the init container accessed +- what is the base URL (assets pathname) +- name of the entry script(s) + +#### Scalprum compatible manifest + +```TS +type PluginManifest = { + name: string; + version: string; + dependencies?: Record; + customProperties?: AnyObject; + baseURL: string; + extensions: Extension[]; + loadScripts: string[]; + registrationMethod: 'callback' | 'custom'; + buildHash?: string; +} +``` + +```js +{ + "name": "backstage.plugin-github-actions", + "version": "0.6.6", + "extensions": [], + "registrationMethod": "callback", // where container init is available in browser + "baseURL": "auto", + "loadScripts": [ + "backstage.plugin-github-actions.804b91040fcbca6585ce.js" + ], + "buildHash": "804b91040fcbca6585ce1bcd4b1f8aa2" +} +``` + +##### `registrationMethod` + +Refers to [webpack output.libraryTarget](https://webpack.js.org/configuration/output/#outputlibrarytarget). + +Callback refers to `jsonp` and a the `custom` is used if other available target configuration has been picked. + +It is recommended to use either `global` or `jsonp` as these are environment agnostic (browser VS node). `jsonp` requires additional configurations. The `global` is preferable due to its simplicity. + +##### `baseURL` + +The `baseURL` is derived from [webpack public path](https://webpack.js.org/configuration/output/#outputpublicpath) + +The public path can also be set to `auto` to remove the need to specify origin or pathname and resolve the pathname at runtime. + +In Scalprum, some manifest [post processing](https://github.com/janus-idp/backstage-showcase/blob/main/packages/app/src/components/DynamicRoot/DynamicRoot.tsx#L323) is required to load the initial scripts if the `auto` baseURL is chosen. + +### Plugin registry + +Plugin registry can be fairly simplistic. It can be as simple as JSON file containing list/map of available plugins and their manifests + +```TS +type RegistryEntry = { + name: string // plugin name + manifestLocation: string // path to the manifest resource +} + +// object for easy access +type PluginRegistry = { + [pluginName: string]: RegistryEntry +} + +// or as an array +type PluginRegistry = RegistryEntry[] +``` + +Example of such registry + +```JS +// as object +{ + "backstage.plugin-github-actions": { + "name": "backstage.plugin-github-actions", + "manifestLocation": "https://foo-bar.com/api/plugin-storage/plugin-manifest.json" + }, + // ..rest of plugins +} + +// as array +[ + { + "name": "backstage.plugin-github-actions", + "manifestLocation": "https://foo-bar.com/api/plugin-storage/plugin-manifest.json" + }, + // ...rest of plugins +] +``` + +Scalprum by default lazy loads plugins and manifests. That is because Scalprum initializes plugins only once they are supposed to be rendered in browser. + +Because backstage does not require that functionality in initial dynamic plugin implementation and loads all plugins at bootstrap, there is an alternative to embed manifest data into the registry itself. + +```TS +type RegistryEntry = { + name: string // plugin name + pluginManifest: PluginManifest +} + +// object for easy access +type PluginRegistry = { + [pluginName: string]: RegistryEntry +} + +// or as an array +type PluginRegistry = RegistryEntry[] + +``` + +Example of registry with embedded manifests + +```JS +// as object +{ + "backstage.plugin-github-actions": { + "name": "backstage.plugin-github-actions", + "pluginManifest": { + "name": "backstage.plugin-github-actions", + "version": "0.6.6", + "extensions": [], + "registrationMethod": "callback", + "baseURL": "auto", + "loadScripts": [ + "backstage.plugin-github-actions.804b91040fcbca6585ce.js" + ], + "buildHash": "804b91040fcbca6585ce1bcd4b1f8aa2" + } + }, + // ..rest of plugins +} + +// as array +[ + { + "name": "backstage.plugin-github-actions", + "pluginManifest": { + "name": "backstage.plugin-github-actions", + "version": "0.6.6", + "extensions": [], + "registrationMethod": "callback", + "baseURL": "auto", + "loadScripts": [ + "backstage.plugin-github-actions.804b91040fcbca6585ce.js" + ], + "buildHash": "804b91040fcbca6585ce1bcd4b1f8aa2" + } + }, + // ...rest of plugins +] + +``` + +### Webpack build configuration + +> NOTE This is a sample current configuration in the Janus project. It uses Scalprum webpack based build plugin to generate the output. It does not take the [all options](#Module-federation-implementation-experiments) in consideration. This section will likely change considerably. + +Part of a Scalprum tooling is also [dynamic-plugins-sdk](https://github.com/openshift/dynamic-plugin-sdk). Right now the package is a part of a different project, but that is about to change. More details in the [Scalprum roadmap](https://github.com/scalprum/scaffolding/blob/main/ROADMAP.md). + +#### Sample plugin configuration using Scalprum SDK + +```TS +import { DynamicRemotePlugin } from '@openshift/dynamic-plugin-sdk-webpack'; + +const sharedModules = { + /** + * Mandatory singleton packages for sharing + */ + react: { + singleton: true, + requiredVersion: '*', + }, + 'react-dom': { + singleton: true, + requiredVersion: '*', + }, + 'react-router-dom': { + singleton: true, + requiredVersion: '*', + }, + 'react-router': { + singleton: true, + requiredVersion: '*', + }, + ... + /** + * Full list of shared modules in Janus + * https://github.com/janus-idp/backstage-plugins/blob/87a6b045c7b0f301ebed8b8f99dc1741fa2b044b/packages/cli/src/lib/bundler/scalprumConfig.ts#L16 + */ + +} + +const dynamicPluginPlugin = new DynamicRemotePlugin({ + extensions: [], + sharedModules, + entryScriptFilename: `${options.pluginMetadata.name}.[contenthash].js`, + pluginMetadata: { + // version cna be used from the package.json version field + version: '1.0.0', + /** + * Name can be easily derived from the plugin name + * https://github.com/janus-idp/backstage-plugins/blob/87a6b045c7b0f301ebed8b8f99dc1741fa2b044b/packages/cli/src/commands/export-dynamic-plugin/frontend.ts#L40 + */ + name: 'backstage.plugin-github-actions', + /** + * Path to the plugin entry point. + * It can default to the same entry point as in regular build. + * Plugins can expose multiple modules. We have found that one is sufficient from backstage plugins. + */ + exposedModules: { + PluginRoot: './src/index.ts' + } + }, +}); +``` + +The `DynamicRemotePlugin` webpack plugin takes care of the rest, including the manifest generation. + +#### Sample plugin raw webpack configuration + +The Scalprum config translates to a following base webpack plugin configuration: + +```JS +import { container } from 'webpack'; + +const dynamicPlugin = new container.ModuleFederationPlugin({ + name: 'backstage.plugin-github-actions', + library: { + type: 'global', + /** + * Some library.type has name limitation + * for example, if "type": "var" is used, the library.name can contain the "-" character + */ + name: 'backstage.plugin-github-actions' + }, + filename: 'backstage.plugin-github-actions.[contenthash].js', + exposes: { + PluginRoot: './src/index.ts' + }, + // list of shared modules like "react", "react-dom", etc + shared: sharedModules, +}); +``` + +Additional plugin would have to be written from scratch to generate the plugin manifest file. + +### Sample shell application webpack configuration + +Shell application (backstage) has very simple module federation configuration. It does not require anything special to be able to inject plugins. Main requirement is to provide core shared packages like react and react-dom. + +```JS +import { container } from 'webpack'; + +const scalprumPlugin = new container.ModuleFederationPlugin({ + name: 'backstageHost', + filename: 'backstageHost.[contenthash].js', + // same share modules list as with plugin config + shared: [sharedModules], +}); +``` + +Nothing else is required. + +### Plugin storage + +Where will the dynamic plugin assets be hosted? Module federation does not strictly require the remote assets to be all hosted on the same origin. + +Theoretically plugins can be hosted on some "public CDN" which is detached from individual backstage instances. + +Assets can be also be hosted in the same way as they have always been. + +### Plugin discovery + +How to notify/send data to browser + +### Plugin initialization + +Currently all plugins have to be initialized at UI bootstrap (page refresh). The new UI async API can be used to initialize the remote assets. + +The `CreateAppFeatureLoader` can be leveraged to initialize the remote container. + +```TS +const allPluginManifests = {...} // get this from the config + +const asyncFeatureLoaders: CreateAppFeatureLoader[] = Object.values(allPluginManifests).map(({ manifest }) => { + return { + getLoaderName: () => manifest.name, + load: (options) => { + // initialize the remote container, depends on tooling + const plugin = initDynamicPlugin(manifest) + } + } +}) + +const app = createApp({ + features: [ + ...asyncFeatureLoaders, + // rest of classic features + ] +}) +``` + +### Plugin declarative configuration + +Janus dynamic plugins ref: https://github.com/janus-idp/backstage-showcase/blob/main/showcase-docs%2Fdynamic-plugins.md#frontend-layout-configuration + +TBD, depends heavily on the new UI system + + + +## Release Plan + + + +## Dependencies + + + +## Alternatives + + diff --git a/beps/NNNN-template/README.md b/beps/NNNN-template/README.md new file mode 100644 index 0000000000..40e2eb8f72 --- /dev/null +++ b/beps/NNNN-template/README.md @@ -0,0 +1,99 @@ +--- +title: BEP Title +status: provisional +authors: + - '@ghost' +owners: +project-areas: + - aaa + - bbb +creation-date: yyyy-mm-dd +--- + + + +# BEP: + + + +[**Discussion Issue**](https://github.com/backstage/backstage/issues/NNNNN) + +- [Summary](#summary) +- [Motivation](#motivation) + - [Goals](#goals) + - [Non-Goals](#non-goals) +- [Proposal](#proposal) +- [Design Details](#design-details) +- [Release Plan](#release-plan) +- [Dependencies](#dependencies) +- [Alternatives](#alternatives) + +## Summary + + + +## Motivation + + + +### Goals + + + +### Non-Goals + + + +## Proposal + + + +## Design Details + + + +## Release Plan + + + +## Dependencies + + + +## Alternatives + + diff --git a/beps/README.md b/beps/README.md new file mode 100644 index 0000000000..531bd15f50 --- /dev/null +++ b/beps/README.md @@ -0,0 +1,86 @@ +# Backstage Enhancement Proposals (BEPs) + +A Backstage Enhancement Proposal (BEP) is a way to propose, communicate and coordinate on new efforts for the Backstage project. + +## Quick start for the BEP process + +1. Discuss the idea with the community and maintainers. Either here on GitHub, Discord, or during community sessions or SIG meetings. + Make sure that others think the work is worth taking up and will help review the BEP and any code changes required. +1. Make a copy of the [BEP template](./NNNN-template/) directory as `beps/NNNN-short-descriptive-title`, where `NNNN` is the next available number padded with leading zeroes. +1. Fill out as much of the YAML metadata as you can. +1. Fill out the template as best you can. +1. If you want the BEP to be owned by a particular project area, add an entry for the BEP folder to [CODEOWNERS](../.github/CODEOWNERS). +1. Create a PR for the BEP. Title it "BEP: <title>". Aim to get the high level goals clarified and avoid getting hung up on specific details. The PR can be merged early and iterated on. +1. Once the BEP is ready to be merged, create a [feature issue](https://github.com/backstage/backstage/issues/new?template=feature.yaml) titled "BEP: <title>". Use the summary of the BEP as description and link to the BEP PR in the context section. Once the PR is merged, the issue should be updated to link to the BEP folder instead. This issue will serve as a general discussion issue for the BEP. +1. Once the initial BEP is merged you should keep iterating on it until it is ready to leave that `provisional` state. Leaving the `provisional` state is a decision made by the project area maintainers. + +Just because a BEP is merged does not mean it is complete or approved for implementation. Any BEP marked as `provisional` is a working document and subject to change. + +The authors of the BEP are also responsible for driving the BEP forward all the way to implementation. The approval of a BEP is not a commitment to implement it. + +## FAQs + +### Do I have to use the BEP process? + +No, but it is recommended for larger changes and contributions that affect the Backstage framework or core features where you want to make design decisions upfront and iterate on them across several PRs. + +### What is the difference between a BEP and an RFC issue? + +An RFC issue is a good way to receive feedback on an idea. The BEP process may involve getting feedback on an idea, but it takes things further by making it easier to iterate on the design of a new feature, getting it approved by the owning project area maintainers, and tracking its implementation. + +While anyone can open an RFC issue, the features added by a BEP need to be approved by the owners before it can be merged. The BEP will also contain the latest agreed upon design, whereas an RFC issue is more of a discussion forum. + +Often a BEP can start out as an RFC issue, which may then be converted into a BEP once the idea has received an owner and been approved. + +### Should I use the BEP process for new or existing Backstage plugins? + +No, except for plugins that implement core features of Backstage. The BEP process is only intended for changes to the Backstage framework and core features. + +### Can I update an existing BEP? + +Yes! As long as the BEP is still in the `provisional` state you should keep iterating on it. Please keep each PR focused on a single topic and avoid long-running and overly broad PRs. + +### Can I update a BEP that was submitted by someone else? + +Yes! BEPs are living documents and anyone can suggest changes to them. We encourage to challenge the design decisions in a BEP and suggest alternatives. You can also help fill out details in a BEP that has not yet been fully fleshed out. + +### What's the difference between a BEP and an [ADR](https://backstage.io/docs/architecture-decisions/)? + +Architecture Decision Records (ADRs) are used to document decisions made for development within the Backstage project. They are not intended to be used for proposing new features or changes to Backstage. + +### My FAQ isn't answered here! + +The BEP process is still evolving! + +If something is missing or not answered here feel free to reach out on our community [Discord](https://discord.gg/backstage-687207715902193673). +If you want to propose a change to the BEP process you can also open a PR directly with your proposal. + +### BEP Metadata + +At the start of each BEP is a YAML document that contains metadata about the BEP. These are the fields that should currently be provided: + +| Field | Description | +| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **title** | The title of the BEP in plain language. The title will also be used in the BEP filename. See the template for instructions and details. | +| **status** | The current state of the BEP, must be one of the values listed in the [BEP Status](#bep-status) section. | +| **authors** | A list of GitHub IDs for the authors of the BEP. Typically only the original authors are included, but additional authors can be added if significant contributions are made. | +| **owners** | A list of GitHub IDs for the owners of the BEP. The owners are responsible for the implementation of the BEP, and are required for the BEP to move to the `implementable` status. | +| **project-areas** | The Project Areas closely associated with this BEP that need to approve it. For a list of existing project areas, see [OWNERS.md](../OWNERS.md). If the BEP is not related to any existing project area, use `core-maintainers` instead. | +| **creation-date** | The `yyyy-mm-dd` date that the BEP was first submitted in a PR. | + +## BEP Status + +The BEP Status is critical to clearly communicate the status of each BEP. Each BEP must have its status field set to one of the following values: + +- `provisional`: The BEP has been proposed and is actively being defined. The BEP as been approved by the owning project area maintainers as work to be done. +- `implementable`: The approvers have approved this BEP for implementation. +- `implemented`: The BEP has been implemented and is no longer actively changed. +- `deferred`: The BEP is proposed but not actively being worked on. +- `rejected`: The approvers and authors have decided that this BEP is not moving forward. + The BEP is kept around as a historical document. +- `withdrawn`: The authors have withdrawn the BEP. +- `replaced`: The BEP has been replaced by a new BEP. + +### Prior Art + +The BEP process is heavily inspired by the [Kubernetes Enhancement Proposal (KEP) process](https://github.com/kubernetes/enhancements/blob/master/keps/README.md). diff --git a/contrib/chart/backstage/Chart.lock b/contrib/chart/backstage/Chart.lock deleted file mode 100644 index 542f9d592e..0000000000 --- a/contrib/chart/backstage/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: postgresql - repository: https://charts.bitnami.com/bitnami - version: 13.2.27 -digest: sha256:c2272865ffe4c805153440d8fc6af84945d4ce566b14d0fa8698d75382ada06c -generated: "2023-12-31T14:23:23.75461574Z" diff --git a/contrib/chart/backstage/Chart.yaml b/contrib/chart/backstage/Chart.yaml deleted file mode 100644 index a152ac49ac..0000000000 --- a/contrib/chart/backstage/Chart.yaml +++ /dev/null @@ -1,30 +0,0 @@ -apiVersion: v2 -name: backstage -description: A Helm chart for Backstage -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -version: 0.1.3 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. -appVersion: v0.1.1-alpha.23 - -sources: - - https://github.com/backstage/backstage - - https://github.com/spotify/lighthouse-audit-service - -dependencies: - - name: postgresql - condition: postgresql.enabled - version: 13.2.27 - repository: https://charts.bitnami.com/bitnami - -maintainers: - - name: Martina Iglesias Fernรกndez - email: martina@roadie.io - url: https://roadie.io - - name: David Tuite - email: david@roadie.io - url: https://roadie.io diff --git a/contrib/chart/backstage/README.md b/contrib/chart/backstage/README.md deleted file mode 100644 index 40bb2666bc..0000000000 --- a/contrib/chart/backstage/README.md +++ /dev/null @@ -1,282 +0,0 @@ -# Backstage demo helm charts - -This folder contains Helm charts that can easily create a Kubernetes deployment of a demo Backstage app. - -### Pre-requisites - -These charts depend on the `nginx-ingress` controller being present in the cluster. If it's not already installed you -can run: - -```shell -helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx -helm install nginx-ingress ingress-nginx/ingress-nginx -``` - -### Installing the charts - -After choosing a DNS name where backstage will be hosted create a yaml file for your custom configuration. - -```yaml -appConfig: - app: - baseUrl: https://backstage.mydomain.com - title: Backstage - backend: - baseUrl: https://backstage.mydomain.com - cors: - origin: https://backstage.mydomain.com - lighthouse: - baseUrl: https://backstage.mydomain.com/lighthouse-api - techdocs: - storageUrl: https://backstage.mydomain.com/api/techdocs/static/docs - requestUrl: https://backstage.mydomain.com/api/techdocs -``` - -Then use it to run: - -```shell -git clone https://github.com/backstage/backstage.git -cd contrib/chart/backstage -helm dependency update -helm install -f backstage-mydomain.yaml backstage . -``` - -This command will deploy the following pieces: - -- Backstage frontend -- Backstage backend with scaffolder and auth plugins -- (optional) a PostgreSQL instance -- lighthouse plugin -- ingress - -After a few minutes Backstage should be up and running in your cluster under the DNS specified earlier. - -Make sure to create the appropriate DNS entry in your infrastructure. To find the public IP address run: - -```shell -$ kubectl get ingress -NAME HOSTS ADDRESS PORTS AGE -backstage-ingress * 123.1.2.3 80 17m -``` - -> **NOTE**: this is not a production ready deployment. - -## Customization - -### Issue certificates - -These charts can install or reuse a `clusterIssuer` to generate certificates for the backstage `ingress`. To do that: - -1. [Install][install-cert-manager] or make sure [cert-manager][cert-manager] is installed in the cluster. -2. Enable the issuer in the charts. This will first check if there is a `letsencrypt` issuer already deployed in your - cluster and deploy one if it doesn't exist. - -To enable it you need to provide a valid email address in the chart's values: - -```yaml -issuer: - email: me@example.com - clusterIssuer: 'letsencrypt-prod' -``` - -By default, the charts use `letsencrypt-staging` so in the above example we instruct helm to use the production issuer -instead. - -[cert-manager]: https://cert-manager.io/docs/ -[install-cert-manager]: https://cert-manager.io/docs/installation/kubernetes/#installing-with-helm - -### Custom PostgreSQL instance - -Configuring a connection to an existing PostgreSQL instance is possible through the chart's values. - -First create a yaml file with the configuration you want to override, for example `backstage-prod.yaml`: - -```yaml -postgresql: - enabled: false - -appConfig: - app: - baseUrl: https://backstage-demo.mydomain.com - title: Backstage - backend: - baseUrl: https://backstage-demo.mydomain.com - cors: - origin: https://backstage-demo.mydomain.com - database: - client: pg - connection: - database: backstage_plugin_catalog - host: - user: - password: - lighthouse: - baseUrl: https://backstage-demo.mydomain.com/lighthouse-api - -lighthouse: - database: - client: pg - connection: - host: - user: - password: - database: lighthouse_audit_service -``` - -For the CA, create a `configMap` named `--postgres-ca` with a file called `ca.crt`: - -```shell -kubectl create configmap my-company-backstage-postgres-ca --from-file=ca.crt" -``` - -or disable CA mount - -```yaml -backend: - postgresCertMountEnabled: false - -lighthouse: - postgresCertMountEnabled: false -``` - -> Where the release name contains the chart name "backstage" then only the release name will be used. - -Now install the helm chart: - -```shell -cd contrib/chart/backstage -helm install -f backstage-prod.yaml my-backstage . -``` - -### Use your own docker images - -The docker images used for the deployment can be configured through the charts values: - -```yaml -frontend: - image: - repository: - tag: - -backend: - image: - repository: - tag: - -lighthouse: - image: - repository: - tag: -``` - -### Use a private docker repo - -Create a docker-registry secret - -```shell -kubectl create secret docker-registry # args -``` - -> For private images on docker hub --docker-server can be set to docker.io - -Reference the secret in your chart values - -```yaml -dockerRegistrySecretName: -``` - -### Different namespace - -To install the charts a specific namespace use `--namespace `: - -```shell -helm install -f my_values.yaml --namespace demos backstage . -``` - -### Disable loading of demo data - -To deploy backstage with the pre-loaded demo data disable `backend.demoData`: - -```shell -helm install -f my_values.yaml --set backend.demoData=false backstage . -``` - -### Other options - -For more customization options take a look at the [values.yaml](/contrib/chart/backstage/values.yaml) file. - -## Troubleshooting - -Some resources created by these charts are meant to survive after upgrades and even after uninstalls. When -troubleshooting these charts it can be useful to delete these resources between re-installs. - -Secrets: - -``` --postgresql-certs -- contains the certificates used by the deployed PostgreSQL -``` - -Persistent volumes: - -``` -data--postgresql-0 -- this is the data volume used by PostgreSQL to store data and configuration -``` - -> **NOTE**: this volume also stores the configuration for PostgreSQL which includes things like the password for the -> `postgres` user. This means that uninstalling and re-installing the charts with `postgres.enabled` set to `true` and -> auto generated passwords will fail. The solution is to delete this volume with -> `kubectl delete pvc data--postgresql-0` - -ConfigMaps: - -``` --postgres-ca -- contains the generated CA certificate for PostgreSQL when `postgres` is enabled -``` - -#### Unable to verify signature - -``` -Backend failed to start up Error: unable to verify the first certificate - at TLSSocket.onConnectSecure (_tls_wrap.js:1501:34) - at TLSSocket.emit (events.js:315:20) - at TLSSocket._finishInit (_tls_wrap.js:936:8) - at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:710:12) { - code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' -``` - -This error happens in the backend when it tries to connect to the configured PostgreSQL database and the specified CA is not correct. The solution is to make sure that the contents of the `configMap` that holds the certificate match the CA for the PostgreSQL instance. A workaround is to set `appConfig.backend.database.connection.ssl.rejectUnauthorized` to `false` in the chart's values. - -#### Multi-Platform Kubernetes Services - -If you are running a multi-platform Kubernetes service with Windows and Linux nodes then you will need to apply a `nodeSelector` to the Helm chart to ensure that pods are scheduled onto the correct platform nodes. - -Add the following to your Helm values file: - -```yaml -global: - nodeSelector: - kubernetes.io/os: linux - -# If using Postgres Chart also add -postgresql: - master: - nodeSelector: - kubernetes.io/os: linux - slave: - nodeSelector: - kubernetes.io/os: linux -``` - - - -## Uninstalling Backstage - -To uninstall Backstage simply run: - -```shell -RELEASE_NAME= # use `helm list` to find out the name -helm uninstall ${RELEASE_NAME} -kubectl delete pvc data-${RELEASE_NAME}-postgresql-0 -kubectl delete secret ${RELEASE_NAME}-postgresql-certs -kubectl delete configMap ${RELEASE_NAME}-postgres-ca -``` diff --git a/contrib/chart/backstage/files/app-config.development.yaml.tpl b/contrib/chart/backstage/files/app-config.development.yaml.tpl deleted file mode 100644 index 105ba3b259..0000000000 --- a/contrib/chart/backstage/files/app-config.development.yaml.tpl +++ /dev/null @@ -1,51 +0,0 @@ -backend: - lighthouseHostname: {{ include "lighthouse.serviceName" . | quote }} - listen: - port: {{ .Values.appConfig.backend.listen.port | default 7007 }} - database: - client: {{ .Values.appConfig.backend.database.client | quote }} - connection: - host: {{ include "backend.postgresql.host" . | quote }} - port: {{ include "backend.postgresql.port" . | quote }} - user: {{ include "backend.postgresql.user" . | quote }} - database: {{ .Values.appConfig.backend.database.connection.database | quote }} - ssl: - rejectUnauthorized: {{ .Values.appConfig.backend.database.connection.ssl.rejectUnauthorized | quote }} - ca: {{ include "backstage.backend.postgresCaFilename" . | quote }} - -catalog: -{{- if .Values.backend.demoData }} - locations: - # Backstage example components - - type: github - target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/all-components.yaml - # Example component for github-actions - - type: github - target: https://github.com/backstage/backstage/blob/master/plugins/github-actions/examples/sample.yaml - # Example component for techdocs - - type: github - target: https://github.com/backstage/backstage/blob/master/plugins/techdocs-backend/examples/documented-component/documented-component.yaml - # Backstage example APIs - - type: github - target: https://github.com/backstage/backstage/blob/master/packages/catalog-model/examples/all-apis.yaml - # Backstage example templates - - type: github - target: https://github.com/backstage/backstage/blob/master/plugins/scaffolder-backend/sample-templates/all-templates.yaml -{{- else }} - locations: [] -{{- end }} - -auth: - providers: - microsoft: null - -scaffolder: - azure: null - - -sentry: - organization: {{ .Values.appConfig.sentry.organization | quote }} - -techdocs: - generator: - runIn: 'local' \ No newline at end of file diff --git a/contrib/chart/backstage/files/create-backend-dbs.sql b/contrib/chart/backstage/files/create-backend-dbs.sql deleted file mode 100644 index 043ff7daf5..0000000000 --- a/contrib/chart/backstage/files/create-backend-dbs.sql +++ /dev/null @@ -1,13 +0,0 @@ -{{ $backendDb := .Values.appConfig.backend.database.connection.database }} -{{ $lighthouseDb := .Values.lighthouse.database.connection.database }} -{{ $user := .Values.global.postgresql.postgresqlUsername }} - -grant all privileges on database {{ $backendDb }} to {{ $user }}; - -create database backstage_plugin_auth; -grant all privileges on database backstage_plugin_auth to {{ $user }}; - -{{ if not (eq $backendDb $lighthouseDb) }} -create database {{ $lighthouseDb }}; -grant all privileges on database {{ $lighthouseDb }} to {{ $user }}; -{{ end }} diff --git a/contrib/chart/backstage/templates/_helpers.tpl b/contrib/chart/backstage/templates/_helpers.tpl deleted file mode 100644 index 123d4dba5b..0000000000 --- a/contrib/chart/backstage/templates/_helpers.tpl +++ /dev/null @@ -1,286 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "backstage.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "backstage.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "backstage.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Common App labels -*/}} -{{- define "backstage.app.labels" -}} -app.kubernetes.io/name: {{ include "backstage.name" . }}-app -helm.sh/chart: {{ include "backstage.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Common Backend labels -*/}} -{{- define "backstage.backend.labels" -}} -app.kubernetes.io/name: {{ include "backstage.name" . }}-backend -helm.sh/chart: {{ include "backstage.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Name for postgresql dependency -See https://github.com/helm/helm/issues/3920#issuecomment-686913512 -*/}} -{{- define "backstage.postgresql.fullname" -}} -{{ printf "%s-%s" .Release.Name .Values.postgresql.nameOverride }} -{{- end -}} - - -{{/* -Create the name of the service account to use for the app -*/}} -{{- define "backstage.app.serviceAccountName" -}} -{{- if .Values.app.serviceAccount.create -}} - {{ default "default" .Values.app.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.app.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the backend -*/}} -{{- define "backstage.backend.serviceAccountName" -}} -{{- if .Values.backend.serviceAccount.create -}} - {{ default default .Values.backend.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.backend.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Path to the CA certificate file in the backend -*/}} -{{- define "backstage.backend.postgresCaFilename" -}} -{{ include "backstage.backend.postgresCaDir" . }}/{{- required "The name for the CA certificate file for postgresql is required" .Values.global.postgresql.caFilename }} -{{- end -}} -{{/* - -{{/* -Directory path to the CA certificate file in the backend -*/}} -{{- define "backstage.backend.postgresCaDir" -}} -{{- if .Values.appConfig.backend.database.connection.ssl.ca -}} - {{ .Values.appConfig.backend.database.connection.ssl.ca }} -{{- else -}} -/etc/postgresql -{{- end -}} -{{- end -}} -{{/* - -Path to the CA certificate file in lighthouse -*/}} -{{- define "backstage.lighthouse.postgresCaFilename" -}} -{{ include "backstage.lighthouse.postgresCaDir" . }}/{{- required "The name for the CA certificate file for postgresql is required" .Values.global.postgresql.caFilename }} -{{- end -}} - -{{/* -Directory path to the CA certificate file in lighthouse -*/}} -{{- define "backstage.lighthouse.postgresCaDir" -}} -{{- if .Values.lighthouse.database.pathToDatabaseCa -}} - {{ .Values.lighthouse.database.pathToDatabaseCa }} -{{- else -}} -/etc/postgresql -{{- end -}} -{{- end -}} -{{/* - -{{/* -Generate ca for postgresql -*/}} -{{- define "backstage.postgresql.generateCA" -}} -{{- $ca := .ca | default (genCA (include "backstage.postgresql.fullname" .) 365) -}} -{{- $_ := set . "ca" $ca -}} -{{- $ca.Cert -}} -{{- end -}} - -{{/* -Generate certificates for postgresql -*/}} -{{- define "generateCerts" -}} -{{- $postgresName := (include "backstage.postgresql.fullname" .) }} -{{- $altNames := list $postgresName ( printf "%s.%s" $postgresName .Release.Namespace ) ( printf "%s.%s.svc" ( $postgresName ) .Release.Namespace ) -}} -{{- $ca := .ca | default (genCA (include "backstage.postgresql.fullname" .) 365) -}} -{{- $_ := set . "ca" $ca -}} -{{- $cert := genSignedCert ( $postgresName ) nil $altNames 365 $ca -}} -tls.crt: {{ $cert.Cert | b64enc }} -tls.key: {{ $cert.Key | b64enc }} -{{- end -}} - -{{/* -Generate a password for the postgres user used for the connections from the backend and lighthouse -*/}} -{{- define "postgresql.generateUserPassword" -}} -{{- $pgPassword := .pgPassword | default ( randAlphaNum 12 ) -}} -{{- $_ := set . "pgPassword" $pgPassword -}} -{{ $pgPassword}} -{{- end -}} - -{{/* -Name of the backend service -*/}} -{{- define "backend.serviceName" -}} -{{ include "backstage.fullname" . }}-backend -{{- end -}} - -{{/* -Name of the frontend service -*/}} -{{- define "frontend.serviceName" -}} -{{ include "backstage.fullname" . }}-frontend -{{- end -}} - -{{/* -Name of the lighthouse backend service -*/}} -{{- define "lighthouse.serviceName" -}} -{{ include "backstage.fullname" . }}-lighthouse -{{- end -}} - -{{/* -Name of the postgresql service -*/}} -{{- define "postgresql.serviceName" -}} -{{- include "backstage.postgresql.fullname" . }} -{{- end -}} - -{{/* -Postgres host for lighthouse -*/}} -{{- define "lighthouse.postgresql.host" -}} -{{- if .Values.postgresql.enabled }} -{{- include "postgresql.serviceName" . }} -{{- else -}} -{{- required "A valid .Values.lighthouse.database.connection.host is required when postgresql is not enabled" .Values.lighthouse.database.connection.host -}} -{{- end -}} -{{- end -}} - -{{/* -Postgres host for the backend -*/}} -{{- define "backend.postgresql.host" -}} -{{- if .Values.postgresql.enabled }} -{{- include "postgresql.serviceName" . }} -{{- else -}} -{{- required "A valid .Values.appConfig.backend.database.connection.host is required when postgresql is not enabled" .Values.appConfig.backend.database.connection.host -}} -{{- end -}} -{{- end -}} - -{{/* -Postgres port for the backend -*/}} -{{- define "backend.postgresql.port" -}} -{{- if .Values.postgresql.enabled }} -{{- .Values.postgresql.service.port }} -{{- else if .Values.appConfig.backend.database.connection.port -}} -{{- .Values.appConfig.backend.database.connection.port }} -{{- else -}} -5432 -{{- end -}} -{{- end -}} - -{{/* -Postgres port for lighthouse -*/}} -{{- define "lighthouse.postgresql.port" -}} -{{- if .Values.postgresql.enabled }} -{{- .Values.postgresql.service.port }} -{{- else if .Values.lighthouse.database.connection.port -}} -{{- .Values.lighthouse.database.connection.port }} -{{- else -}} -5432 -{{- end -}} -{{- end -}} - -{{/* -Postgres user for backend -*/}} -{{- define "backend.postgresql.user" -}} -{{- if .Values.postgresql.enabled }} -{{- .Values.global.postgresql.postgresqlUsername }} -{{- else -}} -{{- required "A valid .Values.appConfig.backend.database.connection.user is required when postgresql is not enabled" .Values.appConfig.backend.database.connection.user -}} -{{- end -}} -{{- end -}} - -{{/* -Postgres user for lighthouse -*/}} -{{- define "lighthouse.postgresql.user" -}} -{{- if .Values.postgresql.enabled }} -{{- .Values.global.postgresql.postgresqlUsername }} -{{- else -}} -{{- required "A valid .Values.lighthouse.database.connection.user is required when postgresql is not enabled" .Values.lighthouse.database.connection.user -}} -{{- end -}} -{{- end -}} - -{{/* -Postgres password secret for backend -*/}} -{{- define "backend.postgresql.passwordSecret" -}} -{{- if .Values.postgresql.enabled }} -{{- template "backstage.postgresql.fullname" . }} -{{- else -}} -{{ $secretName := (printf "%s-backend-postgres" (include "backstage.fullname" . )) }} -{{- required "A valid .Values.appConfig.backend.database.connection.password is required when postgresql is not enabled" $secretName -}} -{{- end -}} -{{- end -}} - -{{/* -Postgres password for lighthouse -*/}} -{{- define "lighthouse.postgresql.passwordSecret" -}} -{{- if .Values.postgresql.enabled }} -{{- template "backstage.postgresql.fullname" . }} -{{- else -}} -{{ $secretName := (printf "%s-lighthouse-postgres" (include "backstage.fullname" . )) }} -{{- required "A valid .Values.lighthouse.database.connection.password is required when postgresql is not enabled" $secretName -}} -{{- end -}} -{{- end -}} - -{{/* -app-config file name -*/}} -{{- define "backstage.appConfigFilename" -}} -{{- "app-config.development.yaml" -}} -{{- end -}} diff --git a/contrib/chart/backstage/templates/backend-deployment.yaml b/contrib/chart/backstage/templates/backend-deployment.yaml deleted file mode 100644 index 0fa6b7fbe2..0000000000 --- a/contrib/chart/backstage/templates/backend-deployment.yaml +++ /dev/null @@ -1,98 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "backstage.fullname" . }}-backend - -spec: - replicas: {{ .Values.backend.replicaCount }} - - selector: - matchLabels: - app: backstage - component: backend - - template: - metadata: - annotations: - ad.datadoghq.com/backstage.logs: '[{"source":"backstage","service":"backend"}]' - labels: - app: backstage - component: backend - - spec: - {{- if .Values.dockerRegistrySecretName }} - imagePullSecrets: - - name: {{ .Values.dockerRegistrySecretName }} - {{- end}} - containers: - - name: {{ .Chart.Name }}-backend - command: ["node"] - args: - - "packages/backend" - - "--config" - - "app-config.yaml" - - "--config" - - {{ printf "/usr/src/app/%s" (include "backstage.appConfigFilename" .) | quote }} - image: {{ .Values.backend.image.repository }}:{{ .Values.backend.image.tag }} - imagePullPolicy: {{ .Values.backend.image.pullPolicy }} - ports: - - containerPort: {{ .Values.backend.containerPort }} - resources: - {{- toYaml .Values.backend.resources | nindent 12 }} - - envFrom: - - secretRef: - name: {{ include "backstage.fullname" . }}-backend - - configMapRef: - name: {{ include "backstage.fullname" . }}-app-env - - configMapRef: - name: {{ include "backstage.fullname" . }}-auth - env: - - name: NODE_ENV - value: {{ .Values.backend.nodeEnv | default "development" }} - - name: APP_CONFIG_backend_database_connection_password - valueFrom: - secretKeyRef: - name: {{ include "backend.postgresql.passwordSecret" .}} - key: postgresql-password - volumeMounts: - {{- if .Values.backend.postgresCertMountEnabled }} - - name: postgres-ca - mountPath: {{ include "backstage.backend.postgresCaDir" . }} - {{- end }} - - name: app-config - mountPath: {{ printf "/usr/src/app/%s" (include "backstage.appConfigFilename" .) }} - subPath: {{ include "backstage.appConfigFilename" . }} - - volumes: - {{- if .Values.backend.postgresCertMountEnabled }} - - name: postgres-ca - configMap: - name: {{ include "backstage.fullname" . }}-postgres-ca - {{- end }} - - name: app-config - configMap: - name: {{ include "backstage.fullname" . }}-app-config - - {{- if .Values.global.nodeSelector }} - nodeSelector: {{- toYaml .Values.global.nodeSelector | nindent 8 }} - {{- end }} - -{{- if .Values.backend.enabled }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "backend.serviceName" . }} - -spec: - ports: - - port: 80 - targetPort: {{ .Values.backend.containerPort }} - - selector: - app: backstage - component: backend - - type: {{ .Values.backend.serviceType }} -{{- end }} diff --git a/contrib/chart/backstage/templates/backend-secret.yaml b/contrib/chart/backstage/templates/backend-secret.yaml deleted file mode 100644 index 299d893ec4..0000000000 --- a/contrib/chart/backstage/templates/backend-secret.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if .Values.backend.enabled }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ include "backstage.fullname" . }}-backend -type: Opaque -stringData: - AUTH_GOOGLE_CLIENT_SECRET: {{ .Values.auth.google.clientSecret }} - AUTH_GITHUB_CLIENT_SECRET: {{ .Values.auth.github.clientSecret }} - AUTH_GITLAB_CLIENT_SECRET: {{ .Values.auth.gitlab.clientSecret }} - AUTH_OKTA_CLIENT_SECRET: {{ .Values.auth.okta.clientSecret }} - AUTH_OAUTH2_CLIENT_SECRET: {{ .Values.auth.oauth2.clientSecret }} - AUTH_AUTH0_CLIENT_SECRET: {{ .Values.auth.auth0.clientSecret }} - AUTH_MICROSOFT_CLIENT_SECRET: {{ .Values.auth.microsoft.clientSecret }} - SENTRY_TOKEN: {{ .Values.auth.sentryToken }} - ROLLBAR_ACCOUNT_TOKEN: {{ .Values.auth.rollbarAccountToken }} - CIRCLECI_AUTH_TOKEN: {{ .Values.auth.circleciAuthToken }} - GITHUB_TOKEN: {{ .Values.auth.githubToken }} - GITLAB_TOKEN: {{ .Values.auth.gitlabToken }} - AZURE_TOKEN: {{ .Values.auth.azure.api.token }} - NEW_RELIC_REST_API_KEY: {{ .Values.auth.newRelicRestApiKey }} - TRAVISCI_AUTH_TOKEN: {{ .Values.auth.travisciAuthToken }} - PAGERDUTY_TOKEN: {{ .Values.auth.pagerdutyToken }} -{{- end }} diff --git a/contrib/chart/backstage/templates/backstage-app-config.yaml b/contrib/chart/backstage/templates/backstage-app-config.yaml deleted file mode 100644 index 061fc3285b..0000000000 --- a/contrib/chart/backstage/templates/backstage-app-config.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "backstage.fullname" . }}-app-config -data: -{{ include "backstage.appConfigFilename" . | indent 2 }}: | -{{ tpl (.Files.Get "files/app-config.development.yaml.tpl") . | indent 4 }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "backstage.fullname" . }}-app-env -data: - APP_CONFIG_app_baseUrl: {{ .Values.appConfig.app.baseUrl | quote | quote }} - APP_CONFIG_app_title: {{ .Values.appConfig.app.title | quote | quote }} - APP_CONFIG_backend_baseUrl: {{ .Values.appConfig.backend.baseUrl | quote | quote }} - APP_CONFIG_backend_cors_origin: {{ .Values.appConfig.backend.cors.origin | quote | quote }} - APP_CONFIG_techdocs_storageUrl: {{ .Values.appConfig.techdocs.storageUrl | quote | quote }} - APP_CONFIG_techdocs_requestUrl: {{ .Values.appConfig.techdocs.requestUrl | quote | quote }} - APP_CONFIG_lighthouse_baseUrl: {{ .Values.appConfig.lighthouse.baseUrl | quote | quote }} - APP_CONFIG_backend_database_connection_ssl_rejectUnauthorized: "false" - APP_CONFIG_auth_providers_github_development_appOrigin: {{ .Values.appConfig.auth.providers.github.development.appOrigin | quote | quote }} - APP_CONFIG_auth_providers_google_development_appOrigin: {{ .Values.appConfig.auth.providers.google.development.appOrigin | quote | quote }} - APP_CONFIG_auth_providers_gitlab_development_appOrigin: {{ .Values.appConfig.auth.providers.gitlab.development.appOrigin | quote | quote }} - APP_CONFIG_auth_providers_okta_development_appOrigin: {{ .Values.appConfig.auth.providers.okta.development.appOrigin | quote | quote }} - APP_CONFIG_auth_providers_oauth2_development_appOrigin: {{ .Values.appConfig.auth.providers.oauth2.development.appOrigin | quote | quote }} - diff --git a/contrib/chart/backstage/templates/backstage-auth-config.yaml b/contrib/chart/backstage/templates/backstage-auth-config.yaml deleted file mode 100644 index 7dcf8379aa..0000000000 --- a/contrib/chart/backstage/templates/backstage-auth-config.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "backstage.fullname" . }}-auth -data: - AUTH_GOOGLE_CLIENT_ID: {{ .Values.auth.google.clientId }} - AUTH_GITHUB_CLIENT_ID: {{ .Values.auth.github.clientId }} - AUTH_GITLAB_CLIENT_ID: {{ .Values.auth.gitlab.clientId }} - # This should not be prefixed with AUTH_. This could be a typo in the Backstage app config. - # Regardless, it is not decided by me. - GITLAB_BASE_URL: {{ .Values.auth.gitlab.baseUrl }} - AUTH_OKTA_CLIENT_ID: {{ .Values.auth.okta.clientId }} - AUTH_OKTA_AUDIENCE: {{ .Values.auth.okta.audience }} - AUTH_OAUTH2_CLIENT_ID: {{ .Values.auth.oauth2.clientId }} - AUTH_OAUTH2_AUTH_URL: {{ .Values.auth.oauth2.authUrl }} - AUTH_OAUTH2_TOKEN_URL: {{ .Values.auth.oauth2.tokenUrl }} - AUTH_AUTH0_CLIENT_ID: {{ .Values.auth.auth0.clientId }} - AUTH_AUTH0_DOMAIN: {{ .Values.auth.auth0.domain }} - AUTH_MICROSOFT_CLIENT_ID: {{ .Values.auth.microsoft.clientId }} - AUTH_MICROSOFT_TENANT_ID: {{ .Values.auth.microsoft.tenantId }} - diff --git a/contrib/chart/backstage/templates/frontend-deployment.yaml b/contrib/chart/backstage/templates/frontend-deployment.yaml deleted file mode 100644 index dba4e2c96a..0000000000 --- a/contrib/chart/backstage/templates/frontend-deployment.yaml +++ /dev/null @@ -1,66 +0,0 @@ -{{- if .Values.frontend.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "backstage.fullname" . }}-frontend - -spec: - replicas: {{ .Values.frontend.replicaCount }} - - selector: - matchLabels: - app: backstage - component: frontend - - template: - metadata: - annotations: - ad.datadoghq.com/backstage.logs: '[{"source":"backstage","service":"frontend"}]' - labels: - app: backstage - component: frontend - - spec: - {{- if .Values.dockerRegistrySecretName }} - imagePullSecrets: - - name: {{ .Values.dockerRegistrySecretName }} - {{- end}} - containers: - - name: {{ .Chart.Name }}-frontend - image: {{ .Values.frontend.image.repository }}:{{ .Values.frontend.image.tag }} - imagePullPolicy: {{ .Values.frontend.image.pullPolicy }} - ports: - - containerPort: {{ .Values.frontend.containerPort }} - resources: - {{- toYaml .Values.frontend.resources | nindent 12 }} - envFrom: - - configMapRef: - name: {{ include "backstage.fullname" . }}-app-env - volumeMounts: - - name: app-config - mountPath: {{ printf "/usr/share/nginx/html/static/%s" (include "backstage.appConfigFilename" .) }} - subPath: {{ include "backstage.appConfigFilename" . }} - volumes: - - name: app-config - configMap: - name: {{ include "backstage.fullname" . }}-app-config - {{- if .Values.global.nodeSelector }} - nodeSelector: {{- toYaml .Values.global.nodeSelector | nindent 8 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "frontend.serviceName" . }} - -spec: - ports: - - port: 80 - targetPort: {{ .Values.frontend.containerPort }} - - selector: - app: backstage - component: frontend - - type: {{ .Values.frontend.serviceType }} -{{- end }} diff --git a/contrib/chart/backstage/templates/ingress.yaml b/contrib/chart/backstage/templates/ingress.yaml deleted file mode 100644 index 7e008c5d9d..0000000000 --- a/contrib/chart/backstage/templates/ingress.yaml +++ /dev/null @@ -1,150 +0,0 @@ -{{- $frontendUrl := urlParse .Values.appConfig.app.baseUrl}} -{{- $backendUrl := urlParse .Values.appConfig.backend.baseUrl}} -{{- $lighthouseUrl := urlParse .Values.appConfig.lighthouse.baseUrl}} - -{{/* Determine the api type for the ingress */}} -{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} -apiVersion: networking.k8s.io/v1 -{{- else -}} -apiVersion: networking.k8s.io/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ include "backstage.fullname" . }}-ingress - annotations: - {{- if .Values.issuer.email }} - cert-manager.io/cluster-issuer: {{ .Values.issuer.clusterIssuer }} - {{- end }} - nginx.ingress.kubernetes.io/ssl-redirect: "false" - nginx.ingress.kubernetes.io/configuration-snippet: | - if ($scheme = https) { - add_header Strict-Transport-Security "max-age=0;"; - } - {{- toYaml .Values.ingress.annotations | nindent 4 }} -spec: - tls: - - secretName: {{ include "backstage.fullname" . }}-tls - hosts: - - {{ $frontendUrl.host }} - - {{ $backendUrl.host }} - - {{ $lighthouseUrl.host }} - rules: - - host: {{ $frontendUrl.host }} - http: - paths: - - path: / - {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} - pathType: Prefix - {{- end }} - backend: - {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} - service: - name: {{ include "frontend.serviceName" . }} - port: - number: 80 - {{- else -}} - serviceName: {{ include "frontend.serviceName" . }} - servicePort: 80 - {{- end }} - {{/* Route the backend inside the same hostname as the frontend when they are the same */}} - {{- if eq $frontendUrl.host $backendUrl.host}} - - path: /api/ - {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} - pathType: Prefix - {{- end }} - backend: - {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} - service: - name: {{ include "backend.serviceName" . }} - port: - number: 80 - {{- else -}} - serviceName: {{ include "backend.serviceName" . }} - servicePort: 80 - {{- end }} - {{/* Route the backend through a different host */}} - {{- else -}} - - host: {{ $backendUrl.host }} - http: - paths: - - path: {{ $backendUrl.path | default "/" }} - {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} - pathType: Prefix - {{- end }} - backend: - {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} - service: - name: {{ include "backend.serviceName" . }} - port: - number: 80 - {{- else -}} - serviceName: {{ include "backend.serviceName" . }} - servicePort: 80 - {{- end }} - {{- end }} - -{{/* Route lighthouse through a different host */}} -{{- if not ( eq $frontendUrl.host $lighthouseUrl.host ) }} - - host: {{ $lighthouseUrl.host }} - http: - paths: - - path: {{ $lighthouseUrl.path | default "/" }} - {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} - pathType: Prefix - {{- end }} - backend: - {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} - service: - name: {{ include "lighthouse.serviceName" . }} - port: - number: 80 - {{- else -}} - serviceName: {{ include "lighthouse.serviceName" . }} - servicePort: 80 - {{- end }} -{{- else }} -{{/* Route lighthouse by path with re-write rules when it is hosted under the same hostname */}} ---- -{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} -apiVersion: networking.k8s.io/v1 -{{- else -}} -apiVersion: networking.k8s.io/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ include "backstage.fullname" . }}-ingress-lighthouse - annotations: - {{- if .Values.issuer.email }} - cert-manager.io/cluster-issuer: {{ .Values.issuer.clusterIssuer }} - {{- end }} - nginx.ingress.kubernetes.io/rewrite-target: /$2 - nginx.ingress.kubernetes.io/ssl-redirect: "false" - nginx.ingress.kubernetes.io/configuration-snippet: | - if ($scheme = https) { - add_header Strict-Transport-Security "max-age=0;"; - } - {{- toYaml .Values.ingress.annotations | nindent 4 }} -spec: - tls: - - secretName: {{ include "backstage.fullname" . }}-tls - hosts: - - {{ $lighthouseUrl.host }} - rules: - - host: {{ $frontendUrl.host }} - http: - paths: - - path: {{$lighthouseUrl.path}}(/|$)(.*) - {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} - pathType: Prefix - {{- end }} - backend: - {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} - service: - name: {{ include "lighthouse.serviceName" . }} - port: - number: 80 - {{- else -}} - serviceName: {{ include "lighthouse.serviceName" . }} - servicePort: 80 - {{- end }} -{{- end }} diff --git a/contrib/chart/backstage/templates/issuer.yaml b/contrib/chart/backstage/templates/issuer.yaml deleted file mode 100644 index d129c8c701..0000000000 --- a/contrib/chart/backstage/templates/issuer.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if (and (.Capabilities.APIVersions.Has "cert-manager.io/v1alpha2") .Values.issuer.email ) -}} -{{/* Only install issuer if it doesn't already exist in the cluster */}} -{{- if not ( lookup "cert-manager.io/v1alpha2" "ClusterIssuer" "" .Values.issuer.clusterIssuer ) }} -apiVersion: cert-manager.io/v1alpha2 -kind: ClusterIssuer -metadata: - name: {{ .Values.issuer.clusterIssuer }} -spec: - acme: - server: https://acme-v02.api.letsencrypt.org/directory - email: {{ required "expected a valid .Values.issuer.email to enable ClusterIssuer" .Values.issuer.email }} - privateKeySecretRef: - name: {{ required "expected .Values.issuer.cluster-issuer to not be empty (letsencrypt-prod | letsencrypt-staging)" .Values.issuer.clusterIssuer }} - solvers: - - http01: - ingress: - class: nginx -{{- end -}} -{{- end -}} diff --git a/contrib/chart/backstage/templates/lighthouse-config.yaml b/contrib/chart/backstage/templates/lighthouse-config.yaml deleted file mode 100644 index 7b8cad42dc..0000000000 --- a/contrib/chart/backstage/templates/lighthouse-config.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.lighthouse.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "backstage.fullname" . -}}-lighthouse -data: - PGDATABASE: {{ .Values.lighthouse.database.connection.database | quote }} - PGUSER: {{ include "lighthouse.postgresql.user" . | quote }} - PGPORT: {{ include "lighthouse.postgresql.port" . | quote }} - PGHOST: {{ include "lighthouse.postgresql.host" . | quote }} - PGPATH_TO_CA: {{ include "backstage.lighthouse.postgresCaFilename" . | quote }} -{{- end }} \ No newline at end of file diff --git a/contrib/chart/backstage/templates/lighthouse-deployment.yaml b/contrib/chart/backstage/templates/lighthouse-deployment.yaml deleted file mode 100644 index 849c48d7a6..0000000000 --- a/contrib/chart/backstage/templates/lighthouse-deployment.yaml +++ /dev/null @@ -1,86 +0,0 @@ -{{- if .Values.lighthouse.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "backstage.fullname" . }}-lighthouse - -spec: - replicas: {{ .Values.lighthouse.replicaCount }} - - selector: - matchLabels: - app: backstage - component: lighthouse-audit-service - - template: - metadata: - annotations: - ad.datadoghq.com/backstage.logs: '[{"source":"backstage","service":"lighthouse"}]' - labels: - app: backstage - component: lighthouse-audit-service - - spec: - {{- if .Values.dockerRegistrySecretName }} - imagePullSecrets: - - name: {{ .Values.dockerRegistrySecretName }} - {{- end}} - containers: - - name: lighthouse-audit-service - image: {{ .Values.lighthouse.image.repository }}:{{ .Values.lighthouse.image.tag }} - imagePullPolicy: {{ .Values.lighthouse.image.pullPolicy }} - ports: - - containerPort: {{ .Values.lighthouse.containerPort }} - resources: - {{- toYaml .Values.lighthouse.resources | nindent 12 }} - - envFrom: - - configMapRef: - name: {{ include "backstage.fullname" . -}}-lighthouse - - configMapRef: - name: {{ include "backstage.fullname" . }}-app-env - - env: - - name: LAS_PORT - value: {{ .Values.lighthouse.containerPort | quote }} - - name: LAS_CORS - value: "true" - - name: PGPASSWORD - valueFrom: - secretKeyRef: - name: {{ include "lighthouse.postgresql.passwordSecret" . }} - key: postgresql-password - - {{- if .Values.lighthouse.postgresCertMountEnabled }} - volumeMounts: - - name: postgres-ca - mountPath: {{ include "backstage.lighthouse.postgresCaDir" . }} - {{- end }} - - {{- if .Values.lighthouse.postgresCertMountEnabled }} - volumes: - - name: postgres-ca - configMap: - name: {{ include "backstage.fullname" . }}-postgres-ca - {{- end }} - - {{- if .Values.global.nodeSelector }} - nodeSelector: {{- toYaml .Values.global.nodeSelector | nindent 8 }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "lighthouse.serviceName" . }} - -spec: - ports: - - port: 80 - targetPort: {{ .Values.lighthouse.containerPort }} - - selector: - app: backstage - component: lighthouse-audit-service - - type: {{ .Values.lighthouse.serviceType }} -{{- end }} diff --git a/contrib/chart/backstage/templates/postgresql-ca-config.yaml b/contrib/chart/backstage/templates/postgresql-ca-config.yaml deleted file mode 100644 index 2631989f4e..0000000000 --- a/contrib/chart/backstage/templates/postgresql-ca-config.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if .Values.postgresql.enabled }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "backstage.fullname" . }}-postgres-ca - labels: - app: {{ include "backstage.postgresql.fullname" . }} - release: {{ .Release.Name }} - annotations: - "helm.sh/hook": "pre-install" - "helm.sh/hook-delete-policy": "before-hook-creation" -data: - {{ .Values.global.postgresql.caFilename }}: | -{{ include "backstage.postgresql.generateCA" . | indent 4}} -{{- else }} -{{- $caConfig := printf "%s-postgres-ca" (include "backstage.fullname" .) }} -{{- if not ( lookup "v1" "ConfigMap" .Release.Namespace $caConfig ) }} -{{- fail (printf "\n\nPlease create the '%s' configmap with the CA certificate for your existing postgresql: kubectl create configmap %s --from-file=ca.crt" $caConfig $caConfig) }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/contrib/chart/backstage/templates/postgresql-certs-secret.yaml b/contrib/chart/backstage/templates/postgresql-certs-secret.yaml deleted file mode 100644 index c6845caa7e..0000000000 --- a/contrib/chart/backstage/templates/postgresql-certs-secret.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.postgresql.enabled }} ---- -apiVersion: v1 -kind: Secret -type: kubernetes.io/tls -metadata: - name: {{ required ".Values.postgresql.tls.certificatesSecret is required" .Values.postgresql.tls.certificatesSecret }} - labels: - app: {{ include "backstage.postgresql.fullname" . }} - release: {{ .Release.Name }} - annotations: - "helm.sh/hook": "pre-install" - "helm.sh/hook-delete-policy": "before-hook-creation" -data: -{{ include "generateCerts" . | indent 2 }} -{{- end }} diff --git a/contrib/chart/backstage/templates/postgresql-initdb-secret.yaml b/contrib/chart/backstage/templates/postgresql-initdb-secret.yaml deleted file mode 100644 index d1c446f79f..0000000000 --- a/contrib/chart/backstage/templates/postgresql-initdb-secret.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.postgresql.enabled }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ required ".Values.postgresql.initdbScriptsSecret is required" .Values.postgresql.initdbScriptsSecret }} - annotations: - "helm.sh/hook": "pre-install" - "helm.sh/hook-delete-policy": "before-hook-creation" -type: Opaque -data: - create-backend-dbs.sql: | - {{ tpl (.Files.Get "files/create-backend-dbs.sql") . | b64enc }} -{{- end }} - diff --git a/contrib/chart/backstage/templates/postgresql-password-backend-secret.yaml b/contrib/chart/backstage/templates/postgresql-password-backend-secret.yaml deleted file mode 100644 index a71cef7b21..0000000000 --- a/contrib/chart/backstage/templates/postgresql-password-backend-secret.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if not .Values.postgresql.enabled }} ---- -apiVersion: v1 -kind: Secret -type: Opaque -metadata: - name: {{ include "backend.postgresql.passwordSecret" . }} - labels: - release: {{ .Release.Name }} - annotations: - "helm.sh/hook": "pre-install,pre-upgrade" - "helm.sh/hook-delete-policy": "before-hook-creation" -data: - postgresql-password: {{ .Values.appConfig.backend.database.connection.password | b64enc }} -{{- end }} diff --git a/contrib/chart/backstage/templates/postgresql-password-lighthouse-secret.yaml b/contrib/chart/backstage/templates/postgresql-password-lighthouse-secret.yaml deleted file mode 100644 index e7374e70db..0000000000 --- a/contrib/chart/backstage/templates/postgresql-password-lighthouse-secret.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if .Values.lighthouse.enabled }} -{{- if not .Values.postgresql.enabled }} ---- -apiVersion: v1 -kind: Secret -type: Opaque -metadata: - name: {{ include "lighthouse.postgresql.passwordSecret" . }} - labels: - release: {{ .Release.Name }} - annotations: - "helm.sh/hook": "pre-install,pre-upgrade" - "helm.sh/hook-delete-policy": "before-hook-creation" -data: - postgresql-password: {{ .Values.lighthouse.database.connection.password | b64enc }} -{{- end }} -{{- end }} diff --git a/contrib/chart/backstage/templates/tests/test-app-connection.yaml b/contrib/chart/backstage/templates/tests/test-app-connection.yaml deleted file mode 100644 index 93f51f3f09..0000000000 --- a/contrib/chart/backstage/templates/tests/test-app-connection.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -apiVersion: v1 -kind: Pod -metadata: - name: {{ include "backstage.fullname" . -}}-test-app-connection - annotations: - "helm.sh/hook": test -spec: - containers: - - name: test-app - image: busybox - command: - - /bin/sh - - -ecx - - | - echo -e "===== Testing the connection with the frontend...\n" - wget -q -O - {{ printf "%s.%s" (include "frontend.serviceName" .) .Release.Namespace | quote }} - echo -e "\n\n===== Testing the connection with the backend...\n" - wget -q -O - {{ printf "http://%s.%s/catalog/entities" (include "backend.serviceName" .) .Release.Namespace | quote }} - echo -e "\n\n===== Testing the connection with the lighthouse plugin...\n" - wget -q -O - {{ printf "%s.%s/v1/audits" (include "lighthouse.serviceName" .) .Release.Namespace | quote }} - echo -e "\n" - restartPolicy: Never \ No newline at end of file diff --git a/contrib/chart/backstage/templates/tests/test-postgresql.yaml b/contrib/chart/backstage/templates/tests/test-postgresql.yaml deleted file mode 100644 index 8eec1db452..0000000000 --- a/contrib/chart/backstage/templates/tests/test-postgresql.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if .Values.postgresql.enabled}} ---- -apiVersion: v1 -kind: Pod -metadata: - name: {{ include "backstage.name" . -}}-test-postgres - annotations: - "helm.sh/hook": test -spec: - containers: - - name: postgresql-client - image: bitnami/postgresql - env: - - name: PG_HOST - value: {{ include "postgresql.serviceName" . | quote }} - - name: PG_PORT - value: {{ .Values.postgresql.service.port | quote }} - - name: PG_USER - value: {{ .Values.global.postgresql.postgresqlUsername | quote }} - - name: PGPASSWORD - valueFrom: - secretKeyRef: - name: {{ include "backend.postgresql.passwordSecret" .}} - key: postgresql-password - - name: PG_DBNAME - value: {{ .Values.appConfig.backend.database.connection.database }} - command: - - /bin/bash - - -ecx - - | - psql --host=$PG_HOST --port=$PG_PORT --username=$PG_USER --dbname=$PG_DBNAME --no-password - restartPolicy: Never -{{- end }} \ No newline at end of file diff --git a/contrib/chart/backstage/values.yaml b/contrib/chart/backstage/values.yaml deleted file mode 100644 index cd80fd954b..0000000000 --- a/contrib/chart/backstage/values.yaml +++ /dev/null @@ -1,216 +0,0 @@ -# Default values for backstage. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -frontend: - enabled: false - replicaCount: 1 - image: - repository: martinaif/backstage-k8s-demo-frontend - tag: test1 - pullPolicy: IfNotPresent - containerPort: 80 - serviceType: ClusterIP - resources: - requests: - memory: 128Mi - limits: - memory: 256Mi - -backend: - enabled: true - nodeEnv: development - demoData: true - replicaCount: 1 - image: - repository: martinaif/backstage-k8s-demo-backend - tag: 20210423T1550 - pullPolicy: IfNotPresent - containerPort: 7007 - serviceType: ClusterIP - postgresCertMountEnabled: true - resources: - requests: - memory: 512Mi - limits: - memory: 1024Mi - -lighthouse: - enabled: true - replicaCount: 1 - image: - repository: roadiehq/lighthouse-audit-service - tag: latest - pullPolicy: IfNotPresent - containerPort: 3003 - serviceType: ClusterIP - postgresCertMountEnabled: true - resources: - requests: - memory: 128Mi - limits: - memory: 256Mi - database: - connection: - port: - host: - user: - password: - database: lighthouse_audit_service - pathToDatabaseCa: - -nameOverride: '' -fullnameOverride: '' - -ingress: - annotations: - kubernetes.io/ingress.class: nginx - -issuer: - email: - clusterIssuer: 'letsencrypt-staging' - -global: - postgresql: - postgresqlUsername: backend-user - caFilename: ca.crt - nodeSelector: {} - -postgresql: - enabled: true - nameOverride: postgresql - tls: - enabled: true - certificatesSecret: backstage-postgresql-certs - certFilename: tls.crt - certKeyFilename: tls.key - volumePermissions: - enabled: true - initdbScriptsSecret: backstage-postgresql-initdb - -appConfig: - app: - baseUrl: https://demo.example.com - title: Backstage - backend: - baseUrl: https://demo.example.com - listen: - port: 7007 - cors: - origin: https://demo.example.com - database: - client: pg - connection: - database: backstage_plugin_catalog - host: - user: - port: - password: - ssl: - rejectUnauthorized: false - ca: - sentry: - organization: example-org-name - techdocs: - storageUrl: https://demo.example.com/api/techdocs/static/docs - requestUrl: https://demo.example.com/api/techdocs - lighthouse: - baseUrl: https://demo.example.com/lighthouse-api - rollbar: - organization: example-org-name - - # Auth config has recently moved into the app config file in upstream Backstage. However, - # most of this config simply mandates that items like the client id and client secret should - # be picked up from the environment variables named below. Those environment variables are - # set in this helm controlled environment by the 'auth' configuration below this section. - # Thus, the only key in this config which directly controls an app config is the - # auth.providers.github.development.appOrigin property. - auth: - providers: - google: - development: - appOrigin: 'http://localhost:3000/' - secure: false - clientId: ${AUTH_GOOGLE_CLIENT_ID} - clientSecret: ${AUTH_GOOGLE_CLIENT_SECRET} - github: - development: - appOrigin: 'http://localhost:3000/' - secure: false - clientId: ${AUTH_GITHUB_CLIENT_ID} - clientSecret: ${AUTH_GITHUB_CLIENT_SECRET} - enterpriseInstanceUrl: ${AUTH_GITHUB_ENTERPRISE_INSTANCE_URL} - gitlab: - development: - appOrigin: 'http://localhost:3000/' - secure: false - clientId: ${AUTH_GITLAB_CLIENT_ID} - clientSecret: ${AUTH_GITLAB_CLIENT_SECRET} - audience: ${GITLAB_BASE_URL} - okta: - development: - appOrigin: 'http://localhost:3000/' - secure: false - clientId: ${AUTH_OKTA_CLIENT_ID} - clientSecret: ${AUTH_OKTA_CLIENT_SECRET} - audience: ${AUTH_OKTA_AUDIENCE} - oauth2: - development: - appOrigin: 'http://localhost:3000/' - secure: false - clientId: ${AUTH_OAUTH2_CLIENT_ID} - clientSecret: ${AUTH_OAUTH2_CLIENT_SECRET} - authorizationURL: ${AUTH_OAUTH2_AUTH_URL} - tokenURL: ${AUTH_OAUTH2_TOKEN_URL} - auth0: - development: - clientId: ${AUTH_AUTH0_CLIENT_ID} - clientSecret: ${AUTH_AUTH0_CLIENT_SECRET} - domain: ${AUTH_AUTH0_DOMAIN} - microsoft: - development: - clientId: ${AUTH_MICROSOFT_CLIENT_ID} - clientSecret: ${AUTH_MICROSOFT_CLIENT_SECRET} - tenantId: ${AUTH_MICROSOFT_TENANT_ID} - -auth: - google: - clientId: a - clientSecret: a - github: - clientId: c - clientSecret: c - gitlab: - clientId: b - clientSecret: b - baseUrl: b - okta: - clientId: b - clientSecret: b - audience: b - oauth2: - clientId: b - clientSecret: b - authUrl: b - tokenUrl: b - auth0: - clientId: b - clientSecret: b - domain: b - microsoft: - clientId: f - clientSecret: f - tenantId: f - azure: - api: - token: h - sentryToken: e - rollbarAccountToken: f - # This is a 'Personal Access Token' - circleciAuthToken: r - # Used by the scaffolder to create GitHub repos. Must have 'repo' scope. - githubToken: g - gitlabToken: g - newRelicRestApiKey: r - travisciAuthToken: fake-travis-ci-auth-token - pagerdutyToken: h diff --git a/docs/architecture-decisions/adr011-plugin-package-structure.md b/docs/architecture-decisions/adr011-plugin-package-structure.md index 2def903dfc..8e4b5435f9 100644 --- a/docs/architecture-decisions/adr011-plugin-package-structure.md +++ b/docs/architecture-decisions/adr011-plugin-package-structure.md @@ -7,8 +7,7 @@ description: Architecture Decision Record (ADR) for Plugin Package Structure ## Context -A core feature of Backstage is the extensibility via plugins. The Backstage -repository is open for contributions of plugins. Even most of the core features +A core feature of Backstage is the extensibility via plugins. Even most of the core features are implemented as plugins. A plugin consists of one or multiple packages in the `plugins/` directory. Up till now, we have a simple conventions for naming plugin packages: Plugins are named `x`, with the option of having a related diff --git a/docs/assets/backend-system/scaled-deployments.drawio.svg b/docs/assets/backend-system/scaled-deployments.drawio.svg new file mode 100644 index 0000000000..85060af236 --- /dev/null +++ b/docs/assets/backend-system/scaled-deployments.drawio.svg @@ -0,0 +1,429 @@ + + + + + + + + + + + + + + + + + + + +
+
+
+ Backend Deployment A +
+
+
+
+ + Backend Deployme... + +
+
+ + + + +
+
+
+ Frontend App +
+
+
+
+ + Frontend App + +
+
+ + + + + + + +
+
+
+ All other traffic +
+
+
+
+ + All other traffic + +
+
+ + + + + +
+
+
+ /api/{techdocs,scaffolder}/* +
+
+
+
+ + /api/{techdocs,scaffolder}/* + +
+
+ + + + +
+
+
+ (Authenticating) Reverse Proxy +
+
+
+
+ + (Authenticating)... + +
+
+ + + + + + + + +
+
+
+ Backend Deployment C +
+
+
+
+ + Backend Deployme... + +
+
+ + + + + + + + +
+
+
+ Backend Deployment B +
+
+
+
+ + Backend Deployme... + +
+
+ + + + + + +
+
+
+ app +
+
+
+
+ + app + +
+
+ + + + + + +
+
+
+ auth +
+
+
+
+ + auth + +
+
+ + + + + + +
+
+
+ catalog +
+
+
+
+ + catalog + +
+
+ + + + + + +
+
+
+ search +
+
+
+
+ + search + +
+
+ + + + + + +
+
+
+ techdocs +
+
+
+
+ + techdocs + +
+
+ + + + + + +
+
+
+ scaffolder +
+
+
+
+ + scaffolder + +
+
+ + + + + + +
+
+
+ proxy +
+
+
+
+ + proxy + +
+
+ + + + +
+
+
+ Plugins +
+
+
+
+ + Plugi... + +
+
+ + + + + + +
+
+
+ /api/{catalog,search}/* +
+
+
+
+ + /api/{catalog,search}/* + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + Horizontally Scaled + +
+ + Deployments + +
+
+
+
+ + Horizontally Scale... + +
+
+ + + + +
+
+
+ Logical Databases +
+
+
+
+ + Logical Databases + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ DBMS Instances +
+
+
+
+ + DBMS Instances + +
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/backend-system/building-backends/01-index.md b/docs/backend-system/building-backends/01-index.md index b1c85aad5d..4caa6fd524 100644 --- a/docs/backend-system/building-backends/01-index.md +++ b/docs/backend-system/building-backends/01-index.md @@ -140,3 +140,13 @@ backend.start(); ``` We've now split the backend into two separate deployments, but we still need to make sure that they can communicate with each other. This is the hard and somewhat tedious part, as Backstage currently doesn't provide an out of the box solution that solves this. You'll need to manually configure the two backends with custom implementations of the `DiscoveryService` and have them return the correct URLs for each other. Likewise, you'll also need to provide a custom implementation of the `DiscoveryApi` in the frontend, unless you surface the two backends via a proxy that handles the routing instead. + +### Split backend deployments architecture example + +Below is an example of a more elaborate setup where we have three different backend deployments, each with their own set of plugins and modules. Between our frontend app and the backend instances we have a reverse proxy that routes the traffic to the appropriate instance. As an option for securing the Backstage deployment the proxy can be set up as an authenticating reverse proxy as well, denying unauthenticated users access to the backend instances. + +![diagram of a backstage deployment with three separate horizontally scaled backend systems](../../assets/backend-system/scaled-deployments.drawio.svg) + +In this example we have split out the Catalog and Search plugins into one backend deployment. The proxy routes all traffic for `/api/catalog/` and `/api/search/` to this instance. With this separation we're able to scale and deploy these two plugins independently, and they are also isolated from both a performance and security perspective. Likewise the TechDocs and Scaffolder plugins are split out as well, and then we route the rest of the traffic to our instance that contains the App, Auth, and Proxy plugins. + +We also see how each of the plugins have their own logical database, but are often set up to share the actual Database Management System (DBMS) instance. This is of course not a requirement, and you can choose to further divide or consolidate the databases as you see fit. diff --git a/docs/backend-system/building-backends/08-migrating.md b/docs/backend-system/building-backends/08-migrating.md index e38b0f8c3a..45478d632e 100644 --- a/docs/backend-system/building-backends/08-migrating.md +++ b/docs/backend-system/building-backends/08-migrating.md @@ -754,3 +754,255 @@ going easily, but feel free to move it out to where it fits best. As you migrate your entire plugin flora to the new backend system, you will probably make more and more of these modules as "first class" things, living right next to the implementations that they represent, and being exported from there. + +### The Auth Plugin + +A basic installation of the auth plugin with a Microsoft provider will look as follows. + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-microsoft-provider')); +/* highlight-add-end */ +``` + +An additional step you'll need to take is to add the resolvers to your configuration, here's an example: + +```yaml title:"app-config.yaml" +auth: + environment: development + providers: + microsoft: + development: + clientId: ${AZURE_CLIENT_ID} + clientSecret: ${AZURE_CLIENT_SECRET} + tenantId: ${AZURE_TENANT_ID} + signIn: + resolvers: + - resolver: emailMatchingUserEntityAnnotation + - resolver: emailMatchingUserEntityProfileEmail + - resolver: emailLocalPartMatchingUserEntityName +``` + +> Note: the resolvers will be tried in order, but will only be skipped if they throw a `NotFoundError`. + +#### Auth Plugin Modules and Their Resolvers + +As you may have noticed in the above example you'll need to import the `auth-backend` and an `auth-backend-module`. The following sections outline each of them and their resolvers. + +All of the following modules include the following common resolvers: + +- [emailMatchingUserEntityProfileEmail](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-node/src/sign-in/commonSignInResolvers.ts#L29) +- [emailLocalPartMatchingUserEntityName](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-node/src/sign-in/commonSignInResolvers.ts#L54) + +##### Atlassian + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-atlassian-provider')); +/* highlight-add-end */ +``` + +Additional resolvers: + +- [usernameMatchingUserEntityName](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-backend-module-atlassian-provider/src/resolvers.ts#L33C16-L33C46) + +##### GCP IAM + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-gcp-iap-provider')); +/* highlight-add-end */ +``` + +Additional resolvers: + +- [emailMatchingUserEntityAnnotation](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-backend-module-gcp-iap-provider/src/resolvers.ts#L32C16-L32C49) + +##### GitHub + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-github-provider')); +/* highlight-add-end */ +``` + +Additional resolvers: + +- [usernameMatchingUserEntityName](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-backend-module-github-provider/src/resolvers.ts#L33C16-L33C46) + +##### GitLab + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-gitlab-provider')); +/* highlight-add-end */ +``` + +Additional resolvers: + +- [usernameMatchingUserEntityName](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-backend-module-gitlab-provider/src/resolvers.ts#L33C16-L33C46) + +##### Google + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-google-provider')); +/* highlight-add-end */ +``` + +Additional resolvers: + +- [emailMatchingUserEntityAnnotation](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-backend-module-google-provider/src/resolvers.ts#L33C16-L33C49) + +##### Microsoft + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-microsoft-provider')); +/* highlight-add-end */ +``` + +Additional resolvers: + +- [emailMatchingUserEntityAnnotation](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-backend-module-microsoft-provider/src/resolvers.ts#L33C16-L33C49) + +##### oauth2 + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-oauth2-provider')); +/* highlight-add-end */ +``` + +Additional resolvers: + +- [usernameMatchingUserEntityName](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-backend-module-oauth2-provider/src/resolvers.ts#L33C16-L33C46) + +##### oauth2 Proxy + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add( + import('@backstage/plugin-auth-backend-module-oauth2-proxy-provider'), +); +/* highlight-add-end */ +``` + +Additional resolvers: + +- [forwardedUserMatchingUserEntityName](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-backend-module-oauth2-proxy-provider/src/resolvers.ts#L27C16-L27C51) + +##### Okta + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-okta-provider')); +/* highlight-add-end */ +``` + +Additional resolvers: + +- [emailMatchingUserEntityAnnotation](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-backend-module-okta-provider/src/resolvers.ts#L34C16-L34C49) + +##### Pinniped + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('@backstage/plugin-auth-backend-module-pinniped-provider')); +/* highlight-add-end */ +``` + +##### VMware Cloud + +Setup: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add( + import('@backstage/plugin-auth-backend-module-vmware-cloud-provider'), +); +/* highlight-add-end */ +``` + +Additional resolvers: + +- [vmwareCloudSignInResolvers](https://github.com/backstage/backstage/blob/5447cffd23cf00772988fb799ced0ec5e54efb2e/plugins/auth-backend-module-vmware-cloud-provider/src/resolvers.ts#L29C18-L29C44) + +#### Custom Resolver + +You may have a case where the common resolvers or the ones that are included with the auth module you use won't work for your needs. In this case you will need to create a custom resolver. Instead of the 2nd import for your auth provider module you would provide your own: + +```ts title="packages/backend/src/index.ts" +/* highlight-add-start */ +export const authModuleGoogleProvider = createBackendModule({ + pluginId: 'auth', + moduleId: 'googleProvider', + register(reg) { + reg.registerInit({ + deps: { providers: authProvidersExtensionPoint }, + async init({ providers }) { + providers.registerProvider({ + providerId: 'google', + factory: createOAuthProviderFactory({ + authenticator: googleAuthenticator, + async signInResolver(info, ctx) { + // custom resolver ... + }, + }), + }); + }, + }); + }, +}); +/* highlight-add-end */ + +const backend = createBackend(); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(authModuleGoogleProvider); +/* highlight-add-end */ +``` diff --git a/docs/features/kubernetes/configuration.md b/docs/features/kubernetes/configuration.md index 494e51320a..331883be35 100644 --- a/docs/features/kubernetes/configuration.md +++ b/docs/features/kubernetes/configuration.md @@ -65,20 +65,72 @@ This is an array used to determine where to retrieve cluster configuration from. Valid cluster locator methods are: - [`catalog`](#catalog) -- [`localKubectlProxy`](#localkubectlproxy) - [`config`](#config) - [`gke`](#gke) +- [`localKubectlProxy`](#localkubectlproxy) - [custom `KubernetesClustersSupplier`](#custom-kubernetesclusterssupplier) #### `catalog` -This cluster locator method will read cluster information from the catalog. +This cluster locator method will gather +[Resources](https://backstage.io/docs/features/software-catalog/system-model#resource) +of +[type](https://backstage.io/docs/features/software-catalog/descriptor-format#spectype-required-4) +`kubernetes-cluster` from the catalog and treat them as clusters for the +purposes of the Kubernetes plugin. In order for a resource to be detected by +this method, it must also have the following +[annotations](https://backstage.io/docs/features/software-catalog/descriptor-format#annotations-optional) +(as seen +[here](https://github.com/backstage/backstage/blob/86baccb2d7d378baed74eaebf017c60b410986e5/plugins/kubernetes-backend/src/cluster-locator/CatalogClusterLocator.ts#L51-L61) +in the code): -#### `localKubectlProxy` +- [`kubernetes.io/api-server`](https://backstage.io/docs/reference/plugin-kubernetes-common.annotation_kubernetes_api_server/), + denoting the base URL of the Kubernetes control plane +- [`kubernetes.io/api-server-certificate-authority`](https://backstage.io/docs/reference/plugin-kubernetes-common.annotation_kubernetes_api_server_ca/), + containing a base64-encoded certificate authority bundle in PEM format; + Backstage will check that the control plane presents a certificate signed by + this authority. +- [`kubernetes.io/auth-provider`](https://backstage.io/docs/reference/plugin-kubernetes-common.annotation_kubernetes_auth_provider/), + denoting the strategy to use to authenticate with the control plane. -This cluster locator method will assume a locally running [`kubectl proxy`](https://kubernetes.io/docs/tasks/extend-kubernetes/http-proxy-access-api/#using-kubectl-to-start-a-proxy-server) process using the default port (8001). +There are many other annotations that can be applied to a cluster resource to +configure the way Backstage communicates, documented +[here](https://backstage.io/docs/reference/plugin-kubernetes-common#variables) +in the API reference. Here is a YAML snippet illustrating an example of a +cluster in the catalog: -NOTE: This cluster locator method is for local development only and should not be used in production. +```yaml +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: my-cluster + annotations: + kubernetes.io/api-server: 'https://127.0.0.1:53725' + kubernetes.io/api-server-certificate-authority: # base64-encoded CA + kubernetes.io/auth-provider: 'oidc' + kubernetes.io/oidc-token-provider: 'microsoft' + kubernetes.io/skip-metrics-lookup: 'true' +spec: + type: kubernetes-cluster + owner: user:guest +``` + +Note that it is insecure to store a Kubernetes service account token in an +annotation on a catalog entity (where it could easily be accidentally revealed +by the catalog API) -- therefore there is no annotation corresponding to the +[`serviceAccountToken` field](#clustersserviceaccounttoken-optional) used by +the [`config`](#config) cluster locator. Accordingly, the catalog cluster +locator does not support the [`serviceAccount`](#clustersauthprovider) auth +strategy. + +This method can be quite helpful when used in combination with an ingestion +procedure like the +[`GkeEntityProvider`](https://backstage.io/docs/reference/plugin-catalog-backend-module-gcp.gkeentityprovider/) +(installation documented +[here](https://github.com/backstage/backstage/tree/master/plugins/catalog-backend-module-gcp#installation)) +or the +[`AwsEKSClusterProcessor`](https://backstage.io/docs/reference/plugin-catalog-backend-module-aws.awseksclusterprocessor/) +to automatically update the set of clusters tracked by Backstage. #### `config` @@ -341,6 +393,7 @@ For example: - type: 'gke' projectId: 'gke-clusters' region: 'europe-west1' # optional + authProvider: 'google' # optional skipTLSVerify: false # optional skipMetricsLookup: false # optional exposeDashboard: false # optional @@ -365,6 +418,18 @@ The Google Cloud project to look for Kubernetes clusters in. The Google Cloud region to look for Kubernetes clusters in. Defaults to all regions. +##### `authProvider` (optional) + +Set the authentication method for discovering clusters and gathering information +about resources. + +Defaults to `google` which leverages the logged in user's Google OAuth credentials. + +Set to `googleServiceAccount` to leverage +Application Default Credentials (https://cloud.google.com/docs/authentication/application-default-credentials). +To use a service account JSON key (not recommended), set the `GOOGLE_APPLICATION_CREDENTIALS` environment variable +on the Backstage backend to the path of the service account key file. + ##### `skipTLSVerify` (optional) This determines whether the Kubernetes client verifies the TLS certificate @@ -388,6 +453,12 @@ Defaults to `false`. Array of key value labels used to filter out clusters which don't have the matching [resource labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels). +#### `localKubectlProxy` + +This cluster locator method will assume a locally running [`kubectl proxy`](https://kubernetes.io/docs/tasks/extend-kubernetes/http-proxy-access-api/#using-kubectl-to-start-a-proxy-server) process using the default port (8001). + +NOTE: This cluster locator method is for local development only and should not be used in production. + #### Custom `KubernetesClustersSupplier` If the configuration-based cluster locators do not work for your use-case, @@ -593,7 +664,7 @@ SingleTenant Cluster: In the example above, we configured the "backstage.io/kubernetes-cluster" annotation on the entity `catalog-info.yaml` file to specify that the current component is running in a single cluster called "dice-cluster", so this cluster must have been specified in the `app-config.yaml`, under the Kubernetes clusters configuration (for more details, see [`Configuring Kubernetes clusters`](#configuring-kubernetes-clusters)). -If you do not specify the annotation by `default Backstage fetches all` defined Kubernetes cluster. +If you do not specify the annotation, by default Backstage fetches from all defined Kubernetes clusters. [1]: https://cloud.google.com/kubernetes-engine [2]: https://cloud.google.com/docs/authentication/production#linux-or-macos diff --git a/docs/features/search/declarative-integration.md b/docs/features/search/declarative-integration.md index f0083e4d4b..c331d810ef 100644 --- a/docs/features/search/declarative-integration.md +++ b/docs/features/search/declarative-integration.md @@ -51,18 +51,19 @@ _Example disabling the search page extension_ # app-config.yaml app: extensions: - - plugin.search.page: false # โœจ + - page:search: false # โœจ + - nav-item:search: false # โœจ ``` -_Example setting the search sidebar item label_ +_Example setting the search sidebar item title_ ```yaml # app-config.yaml app: extensions: - - plugin.search.nav.index: # โœจ + - nav-item:search: # โœจ config: - label: 'Search Page' + title: 'Search Page' ``` > **Known limitations:** diff --git a/docs/features/software-templates/authorizing-parameters-steps-and-actions.md b/docs/features/software-templates/authorizing-parameters-steps-and-actions.md index 1351676c37..27e8d48023 100644 --- a/docs/features/software-templates/authorizing-parameters-steps-and-actions.md +++ b/docs/features/software-templates/authorizing-parameters-steps-and-actions.md @@ -128,10 +128,10 @@ class ExamplePermissionPolicy implements PermissionPolicy { } ``` -With this permission policy, the user `spiderman` won't be able to execute the debug:log action. +With this permission policy, the user `spiderman` won't be able to execute the `debug:log` action. You can also restrict the input provided to the action by combining multiple rules. -In the example below, `spiderman` won't be able to execute debug:log when passing `{ "message": "not-this!" }` as action input: +In the example below, `spiderman` won't be able to execute `debug:log` when passing `{ "message": "not-this!" }` as action input: ```ts title="packages/backend/src/plugins/permission.ts" /* highlight-add-start */ diff --git a/docs/frontend-system/architecture/05-extension-overrides.md b/docs/frontend-system/architecture/05-extension-overrides.md index e722145552..21028627bc 100644 --- a/docs/frontend-system/architecture/05-extension-overrides.md +++ b/docs/frontend-system/architecture/05-extension-overrides.md @@ -10,38 +10,158 @@ description: Frontend extension overrides ## Introduction - +In order to override an app extension, you must create a new extension and add it to the list of overridden features. The steps are: create your extension overrides and use them in Backstage. -## Creating a Extension Override +### Example - +Now we are able to use the overrides in a Backstage app: -## Overriding Existing Extensions +```tsx title="packages/app/src/App.tsx" +import { createApp } from '@backstage/frontend-app-api'; +import themeOverrides from './themes'; - +## Override Plugin Extensions + +To override an extension that is provided by a plugin, you need to provide a new extension that has the same ID as the existing extension. That is, all kind, namespace, and name options must match the extension you want to replace. This means that you typically need to provide an explicit `namespace` when overriding extensions from a plugin. + +:::info +We recommend that plugin developers share the extension IDs in their plugin documentation, but usually you can infer the ID by following the [naming patterns](./08-naming-patterns.md) documentation. +::: + +### Example + +Imagine you have a plugin with the ID `'search'`, and the plugin provides a page extension that you want to fully override with your own custom component. To do so, you need to create your page extension with an explicit `namespace` option that matches that of the plugin that you want to override, in this case `'search'`. If the existing extension also has an explicit `name` you'd need to set the `name` of your override extension to the same value as well. + +```tsx title="packages/app/src/search.ts" +import { createPageExtension } from '@backstage/frontend-plugin-api'; + +// Creating a custom search page extension +const customSearchPage = createPageExtension({ + // highlight-next-line + namespace: 'search', + // Omitting name since it is the index plugin page + defaultPath: '/search', + loader: () => import('./SearchPage').then(m => m.), +}); + +export createExtensionOverrides({ + extensions: [customSearchPage] +}); +``` + +Don't forget to configure your overrides in the `createApp` function: + +```tsx title="packages/app/src/App.tsx" +import { createApp } from '@backstage/frontend-app-api'; +import searchOverrides from './search'; + +const app = createApp({ + // highlight-next-line + features: [searchOverrides], +}); + +export default app.createRoot(); +``` + +Now let's talk about the last override case, orphan extensions. + +## Create Standalone Extensions + +Sometimes you just need to quickly create a new extension and not overwrite an app extension or plugin. You can also use overrides to create extensions, but remember that if you want to make this extension available for installation by other users, we recommend providing it via a plugin in a separate package. + +### Example + +Imagine you want to create a page that is currently only used by your application, like an Institutional page, for example. You can use overrides to extend the Backstage app to render it. To do so, simply create a page extension and pass it to the app as an override: + +```tsx title="packages/app/src/App.ts" +import { createApp } from '@backstage/frontend-app-api'; +import { + createPageExtension, + createExtensionOverrides, +} from '@backstage/frontend-plugin-api'; + +const app = createApp({ + features: [ + createExtensionOverrides({ + extensions: [ + // highlight-start + createPageExtension({ + name: 'institutional', + defaultPath: '/institutional', + loader: () => + import('./institutional').then(m => ), + }), + // highlight-end + ], + }), + ], +}); + +export default app.createRoot(); +``` + +Note that we are omitting `namespace` when creating the page extension. When we omit `namespace`, we are telling the system the new extension is standalone and not an application or plugin extension! diff --git a/docs/frontend-system/architecture/07-routes.md b/docs/frontend-system/architecture/07-routes.md index 1402796077..8351a864ba 100644 --- a/docs/frontend-system/architecture/07-routes.md +++ b/docs/frontend-system/architecture/07-routes.md @@ -8,143 +8,430 @@ description: Frontend routes > **NOTE: The new frontend system is in alpha and is only supported by a small number of plugins.** -See [routing system docs](../../plugins/composability.md#routing-system) - ## Introduction - +The Backstage routing system makes it possible to implement navigation across plugin boundaries, without each individual plugin knowing the concrete path or location of other plugins in the routing hierarchy, or even its own. This is achieved through the concept of route references, which are opaque reference values that can be shared and used to create concrete links to different parts of an app. The route ref paths can be configured both at plugin level (by plugin developers) and at the app level (by integrators). It is up to plugin developers to create route references for any page content in their plugin that they want it to be possible to link to or from. ## Route References - +There are three types of route references: regular route, sub route, and external route, and we will cover both the concept and code definition for each. ### Creating a Route Reference - +// Creates a route reference, which is not yet associated with any plugin page +export const indexRouteRef = createRouteRef(); +``` -### Using a Route Reference +Note that you often want to create the route references themselves in a different file than the one that creates the plugin instance, for example a top-level `routes.ts`. This is to avoid circular imports when you use the route references from other parts of the same plugin. - - -### Route Path Parameters - - +Route refs do not have any behavior themselves. They are an opaque value that represents route targets in an app, which are bound to specific paths at runtime. Their role is to provide a level of indirection to help link together different pages that otherwise wouldn't know how to route to each other. ### Providing Route References to Plugins - +The code snippet in the previous section does not indicate which plugin the route belongs to. To do so, you have to use it in the creation of any kind of routable extension, such as a page extension: -## External Router References +```tsx title="plugins/catalog/src/plugin.tsx" +import React from 'react'; +import { + createPlugin, + createPageExtension, +} from '@backstage/frontend-plugin-api'; +import { indexRouteRef } from './routes'; - +In the example above we associated the `indexRouteRef` with the `catalogIndexPage` extension and provided both the route ref and page via the Catalog plugin. So, When this plugin is installed in the app, the index page will become associated with the newly created `RouteRef`, making it possible to use the route ref to navigate the page extension. + +It may seem unclear why we configure the `routes` option when creating a plugin as the route has already been passed to the extension. We do that to make it possible for other plugins to route to our page, which is explained in detail in the [binding routes](#binding-external-route-references) section. + +### Defining References with Path Parameters + +Route references optionally accept a `params` option, which will require the listed parameter names to be present in the route path. Here is how you create a reference for a route that requires a `kind`, `namespace` and `name` parameters, like in this path `/entities/:kind/:namespace/:name`: + +```tsx title="plugins/catalog/src/routes.ts" +import { createRouteRef } from '@backstage/frontend-plugin-api'; + +export const detailsRouteRef = createRouteRef({ + // The parameters that must be included in the path of this route reference + // highlight-next-line + params: ['kind', 'namespace', 'name'], +}); +``` + +### Using a Route Reference + +Route references can be used to link to page in the same plugin, or to pages in different plugins. In this section we will cover the first scenario. If you are interested in linking to a page of a different plugin, please go to the [external routes](#external-route-references) section below. + +Suppose we are creating a plugin that renders a Catalog index page with a link to a "Foo" component details page. Here is the code for the index page: + +```tsx title="plugins/catalog/src/components/IndexPage.tsx" +import React from 'react'; +import { useRouteRef } from '@backstage/frontend-plugin-api'; +import { detailsRouteRef } from '../routes'; + +export const IndexPage = () => { + // highlight-next-line + const getDetailsPath = useRouteRef(detailsRouteRef); + return ( +
+

Index Page

+ + See "Foo" details + +
+ ); +}; +``` + +We use the `useRouteRef` hook to create a link generator function that returns the details page path. We then call the link generator, passing it an object with the kind, namespace, and name. These parameters are used to construct a concrete path to the "Foo" details page. + +Let's see how the details page can get the parameters from the URL: + +```tsx title="plugins/catalog/src/components/DetailsPage.tsx" +import React from 'react'; +import { useRouteRefParams } from '@backstage/frontend-plugin-api'; +import { detailsRouteRef } from '../routes'; + +export const DetailsPage = () => { + // highlight-next-line + const params = useRouteRefParams(detailsRouteRef); + return ( +
+

Details Page

+
    + {/* highlight-start */} +
  • Kind: {params.kind}
  • +
  • Namespace: {params.namespace}
  • +
  • Name: {params.name}
  • + {/* highlight-end */} +
+
+ ); +}; +``` + +In the code above, we are using the `useRouteRefParams` hook to retrieve the entity-composed id from the URL. The parameter object contains three values: kind, namespace, and name. We can display these values or call an API using them. + +Since we are linking to pages of the same package, we are using a route ref directly. However, in the following sections, you will see how to link to pages of different plugins. + +## External Route References + +External routes are made for linking to a page of an external plugin. +For this section example, let's assume that we want to link from the Catalog entities list page to the Scaffolder create component page. + +We don't want to reference the Scaffolder plugin directly, since that would create an unnecessary dependency. It would also provide little flexibility in allowing the app to tie plugins together, with the links instead being dictated by the plugins themselves. To solve this, we use an `ExternalRouteRef`. Much like regular route references, they can be passed to `useRouteRef` to create concrete URLs, but they can not be used in page extensions and instead have to be associated with a target route using route bindings in the app. + +We create a new `RouteRef` inside the Scaffolder plugin, using a neutral name that describes its role in the plugin rather than a specific plugin page that it might be linking to, allowing the app to decide the final target. If the Catalog entity list page for example wants to link the Scaffolder create component page in the header, it might declare an `ExternalRouteRef` similar to this: + +```tsx title="plugins/catalog/src/routes.ts" +import { createExternalRouteRef } from '@backstage/frontend-plugin-api'; + +export const createComponentExternalRouteRef = createExternalRouteRef(); +``` + +External routes are also used in a similar way as regular routes: + +```tsx title="plugins/catalog/src/components/IndexPage.tsx" +import React from 'react'; +import { useRouteRef } from '@backstage/frontend-plugin-api'; +import { createComponentExternalRouteRef } from '../routes'; + +export const IndexPage = () => { + // highlight-next-line + const getCreateComponentPath = useRouteRef(createComponentExternalRouteRef); + return ( +
+

Index Page

+ {/* highlight-next-line */} + Create Component +
+ ); +}; +``` + +Given the above binding, using `useRouteRef(createComponentExternalRouteRef)` within the Catalog plugin will let us create a link to whatever path the Scaffolder create component page is mounted at. Note that there is no direct dependency between the Catalog plugin and Scaffolder, that is, we are not importing the `createComponentExternalRouteRef` from the Scaffolder package. + +Now the only thing left is to provide the page and external route via a plugin: + +```tsx title="plugins/catalog/src/plugin.tsx" +import React from 'react'; +import { + createPlugin, + createPageExtension, + useRouteRef, +} from '@backstage/frontend-plugin-api'; +import { indexRouteRef, createComponentExternalRouteRef } from './routes'; + +const catalogIndexPage = createPageExtension({ + defaultPath: '/entities', + routeRef: indexRouteRef, + loader: () => import('./components').then(m => ), +}); + +export default createPlugin({ + id: 'catalog', + routes: { + index: indexRouteRef, + }, + // highlight-start + externalRoutes: { + createComponent: createComponentExternalRouteRef, + }, + extensions: [catalogIndexPage], + // highlight-end +}); +``` + +External routes can also have parameters. For example, if you want to link to an entity's details page from Scaffolder, you'll need to create an external route that receives the same parameters the Catalog details page expects: + +```tsx title="plugins/scaffolder/src/routes.ts" +import { createExternalRouteRef } from '@backstage/frontend-plugin-api'; + +export const entityDetailsExternalRouteRef = createExternalRouteRef({ + // highlight-next-line + params: ['kind', 'namespace', 'name'], +}); +``` + +Now let's move on and configure the app to resolve these external routes, so that the Scaffolder links to the Catalog entity page, and the Catalog links to the Scaffolder page. ### Binding External Route References - +```yaml title="app-config.yaml" +app: + routes: + bindings: + # point to the Scaffolder create component page when the Catalog create component ref is used + # highlight-next-line + plugin.catalog.externalRoutes.createComponent: plugin.scaffolder.routes.index + # point to the Catalog details page when the Scaffolder component details ref is used + # highlight-next-line + plugin.scaffolder.externalRoutes.componentDetails: plugin.catalog.routes.details +``` + +We also have the ability to express this in code as an option to `createApp`, but you of course only need to use one of these two methods: + +```tsx title="packages/app/src/App.tsx" +import { createApp } from '@backstage/frontend-app-api'; +import catalog from '@backstage/plugin-catalog'; +import scaffolder from '@backstage/plugin-scaffolder'; + +const app = createApp({ + // highlight-start + bindRoutes({ bind }) { + bind(catalog.externalRoutes, { + createComponent: scaffolder.routes.createComponent, + }); + bind(scaffolder.externalRoutes, { + componentDetails: catalog.routes.details, + }); + }, + // highlight-end +}); + +export default app.createRoot(); +``` + +Note that we are not importing and using the `RouteRef`s directly in the app, and instead rely on the plugin instance to access routes of the plugins. This provides better namespacing and discoverability of routes, as well as reduce the number of separate exports from each plugin package. + +Another thing to note is that this indirection in the routing is particularly useful for open source plugins that need to provide flexibility in how they are integrated. For plugins that you build internally for your own Backstage application, you can choose to use direct imports or even concrete route path strings directly. Although there can be some benefits to using the full routing system even in internal plugins: it can help you structure your routes, and as you will see further down it also helps you manage route parameters. ### Optional External Route References - +```tsx title="plugins/catalog/src/routes.ts" +import { createExternalRouteRef } from '@backstage/frontend-plugin-api'; + +export const createComponentExternalRouteRef = createExternalRouteRef({ + // highlight-next-line + optional: true, +}); +``` + +When calling `useRouteRef` with an optional external route, its return signature is changed to `RouteFunc | undefined`, and the returned value can be used to decide whether a certain link should be displayed or if an action should be taken: + +```tsx title="plugins/catalog/src/components/IndexPage.tsx" +import React from 'react'; +import { useRouteRef } from '@backstage/frontend-plugin-api'; +import { createComponentExternalRouteRef } from '../routes'; + +export const IndexPage = () => { + const getCreateComponentPath = useRouteRef(createComponentExternalRouteRef); + return ( +
+

Index Page

+ {/* Rendering the link only if the getCreateComponentPath is defined */} + {/* highlight-start */} + {getCreateComponentPath && ( + Create Component + )} + {/* highlight-end */} +
+ ); +}; +``` ## Sub Route References - - -```ts -/* - -Some examples - -export const indexPageRouteRef = createRouteRef() - -export const catalogPlugin = createPlugin({ - id: 'catalog, - routes: { - index: indexPageRouteRef, - }, -}) - -// in catalog plugin - -import {indexPageRouteRef} from '../../routes - -const link = useRouteRef(indexPageRouteRef) - -// scaffolder - -export const catalogIndexPageRouteRef = createExternalRouteRef({ - defaultTarget: 'catalog/index', -}) - -export const scaffolderPlugin = createPlugin({ - id: 'scaffolder, - externalRoutes: { - catalogIndex: catalogIndexPageRouteRef, - }, -}) - - -import {catalogIndexPageRouteRef} from '../../routes - -const link = useRouteRef(catalogIndexPageRouteRef) - -// app - -import {catalogPlugin} from '@backstage/plugin-catalog' - -const app = createApp({ - bindRoutes({bind}) { - bind(scaffolderPlugin, { - catalogIndex: catalogPlugin.routes.index, - }) - }, -}) -*/ +export const indexRouteRef = createRouteRef(); +// highlight-start +export const detailsSubRouteRef = createSubRouteRef({ + parent: indexRouteRef, + path: '/details', +}); +// highlight-end +``` + +There are substantial differences between creating subroutes and regular or external routes because subroutes are associated with regular routes, and the sub route path must be specified. The path string must include the parameters if this sub route has them: + +```tsx title ="plugins/catalog/src/routes.ts" +// Omitting rest of the previous example file +export const detailsSubRouteRef = createSubRouteRef({ + parent: indexRouteRef, + // highlight-next-line + path: '/:name/:namespace/:kind', +}); +``` + +Using subroutes in a page extension is as simple as this: + +```tsx title="plugins/catalog/src/components/IndexPage.ts" +import React from 'react'; +import { Routes, Route, useLocation } from 'react-router-dom'; +import { useRouteRef } from '@backstage/frontend-plugin-api'; +import { indexRouteRef, detailsSubRouteRef } from '../routes'; +import { DetailsPage } from './DetailsPage'; + +export const IndexPage = () => { + const { pathname } = useLocation(); + const getIndexPath = useRouteRef(indexRouteRef); + const getDetailsPath = useRouteRef(detailsSubRouteRef); + return ( +
+

Index Page

+ {/* Linking to the details sub route */} + {pathname === getIndexPath() ? ( + // highlight-start + + Show details + + // highlight-end + ) : ( + // highlight-next-line + Hide details + )} + {/* Registering the details sub route */} + + } /> + +
+ ); +}; +``` + +This is how you can get the parameters of a sub route URL: + +```tsx title="plugins/catalog/src/components/DetailsPage.ts" +import React from 'react'; +import { useParams } from 'react-router-dom'; + +export const DetailsPage = () => { + // highlight-next-line + const params = useParams(); + return ( +
+

Details Sub Page

+
    + {/* highlight-start */} +
  • Kind: {params.kind}
  • +
  • Namespace: {params.namespace}
  • +
  • Name: {params.name}
  • + {/* highlight-end */} +
+
+ ); +}; +``` + +Finally, see how a plugin can provide subroutes: + +```tsx title="plugins/catalog/src/plugin.ts" +import React from 'react'; +import { + createPlugin, + createPageExtension, +} from '@backstage/frontend-plugin-api'; +import { indexRouteRef, detailsSubRouteRef } from './routes'; + +const catalogIndexPage = createPageExtension({ + defaultPath: '/entities', + routeRef: indexRouteRef, + loader: () => import('./components').then(m => ), +}); + +export default createPlugin({ + id: 'catalog', + routes: { + index: indexRouteRef, + // highlight-next-line + details: detailsSubRouteRef, + }, + extensions: [catalogIndexPage], +}); ``` diff --git a/docs/frontend-system/building-plugins/01-index.md b/docs/frontend-system/building-plugins/01-index.md new file mode 100644 index 0000000000..f8d80f9382 --- /dev/null +++ b/docs/frontend-system/building-plugins/01-index.md @@ -0,0 +1,222 @@ +--- +id: index +title: Building Frontend Plugins +sidebar_label: Overview +# prettier-ignore +description: Building frontend plugins using the new frontend system +--- + +> **NOTE: The new frontend system is in alpha and is only supported by a small number of plugins.** + +This section covers how to build your own frontend [plugins](../architecture/04-plugins.md) and +[overrides](../architecture/05-extension-overrides.md). They are sometimes collectively referred to as +frontend _features_, and what you install to build up a Backstage frontend [app](../architecture/02-app.md). + +## Creating a new plugin + +This guide assumes that you already have a Backstage project set up. Even if you only want to develop a single plugin for publishing, we still recommend that you do so in a standard Backstage monorepo project, as you often end up needing multiple packages. For instructions on how to set up a new project, see our [getting started](../../getting-started/index.md#prerequisites) documentation. + +To create a frontend plugin, run `yarn new`, select `plugin`, and fill out the rest of the prompts. This will create a new package at `plugins/`, which will be the main entrypoint for your plugin. + +:::info +The created plugin will currently be templated for use in the legacy frontend system, and you will need to replace the existing plugin wiring code. +::: + +## The plugin instance + +The starting point of a frontend plugin is the `createPlugin` function, which accepts a single options object as its only parameter. It is imported from `@backstage/frontend-plugin-api`, which is where you will find most of the common APIs for building plugins. + +This is how to create a minimal plugin: + +```tsx title="in src/plugin.ts" +import { createPlugin } from '@backstage/frontend-plugin-api'; + +export const examplePlugin = createPlugin({ + id: 'example', + extensions: [], +}); +``` + +```tsx title="in src/index.ts" +export { examplePlugin as default } from './plugin'; +``` + +Note that we export the plugin as the default export of our package from `src/index.ts`. This is important, as it is how users of our plugin are able to seamlessly install the plugin package in a Backstage app without having to reference the plugin instance through code. + +The plugin ID should be a lowercase dash-separated string, while the plugin instance variable should be the camel case version of the ID with a `Plugin` suffix. For more details on naming patterns within the frontend system, see [the article on naming patterns](../architecture/08-naming-patterns.md). By sticking to these naming patterns you ensure that users of your plugin more easily recognize the exports and features provided by your plugin. + +## Adding extensions + +The plugin that we created above is empty, and doesn't provide any actual functionality. To add functionality to a plugin you need to create and provide it with one or more [extensions](../architecture/03-extensions.md). Let's continue by adding a standalone page to our plugin, as well as a navigation item that allows users to navigate to the page. + +To create a new extension you typically use pre-defined [extension creators](../architecture/03-extensions.md#extension-creators), provided either by the framework itself or by other plugins. In this case we'll need to use `createPageExtension` and `createNavItemExtension`, both from `@backstage/frontend-plugin-api`. We will also need to [create a route reference](../architecture/07-routes.md#creating-a-route-reference) to use as a reference for out page, allowing us to dynamically create URLs that link to our page. + +```tsx title="in src/routes.ts" +import { createRouteRef } from '@backstage/frontend-plugin-api'; + +// Typically all routes are defined in src/routes.ts, in order to avoid circular imports. + +// This will be the route reference for our example page. If you want to link +// to the page from somewhere else, you can use this reference to generate the target path. +export const rootRouteRef = createRouteRef(); +``` + +```tsx title="in src/plugin.ts" +import { + createPlugin, + createPageExtension, + createNavItemExtension, +} from '@backstage/frontend-plugin-api'; +import { rootRouteRef } from './routes'; + +// Note that these extensions aren't exported, only the plugin itself is. +// You can export it locally for testing purposes, but don't export it from the plugin package. +const examplePage = createPageExtension({ + routeRef: rootRouteRef, + + // This is the default path of this page, but integrators are free to override it + defaultPath: '/example', + + // Page extensions are always dynamically loaded using React.lazy(). + // All of the functionality of this page is implemented in the + // ExamplePage component, which is a regular React component. + // highlight-next-line + loader: () => import('./components/ExamplePage').then(m => ), +}); + +// This nav item is provided to the app.nav extension, and will by default be rendered as a sidebar item +const exampleNavItem = createNavItemExtension({ + routeRef: rootRouteRef, + title: 'Example', + icon: ExampleIcon, // Custom SvgIcon, or one from the Material UI icon library +}); + +// The same plugin as above, now with the extensions added +export const examplePlugin = createPlugin({ + id: 'example', + extensions: [examplePage, exampleNavItem], + // We can also make routes available to other plugins. + // highlight-start + routes: { + root: rootRouteRef, + }, + // highlight-end +}); +``` + +What we've built here is a very common type of plugin. It's a top-level tool that provides a single page, along with a method for navigating to that page. The implementation of the page component, in this case the highlighted `ExamplePage`, can be arbitrarily complex. It can be anything from a single simple information page, to a full-blown application with multiple sub-pages. + +We have also provided external access to our route reference by passing it to the plugin `routes` option. This makes it possible for app integrators to bind an external link from a different plugin to our plugin page. You can read more about how this works in the [External Route References](../architecture/07-routes.md#external-route-references) section. + +## Utility APIs + +Another type of extensions that is commonly used are [Utility APIs](../utility-apis/01-index.md). They can encapsulate shared pieces of functionality of your plugin, for example an API client for a backend service. You can optionally export your Utility API for other plugins to use, or allow integrators to replace the implementation of your Utility API with their own. For details on how to define and provide your own Utility API in your plugin, see the section on [creating Utility APIs](../utility-apis/02-creating.md). + +What we'll show here is a complete example of a simple Utility API used only within the plugin itself: + +```tsx title="src/api.ts - Defining an interface, API reference, and default implementation" +import { createApiRef } from '@backstage/frontend-plugin-api'; + +export interface ExampleApi { + getExample(): { example: string }; +} + +export const exampleApiRef = createApiRef({ + id: 'plugin.example', +}); + +export class DefaultExampleApi implements ExampleApi { + getExample(): { example: string } { + return { example: 'Hello World!' }; + } +} +``` + +```tsx title="src/components/ExamplePage.tsx - Using the API in our page component" +import { useApi } from '@backstage/frontend-plugin-api'; +import { exampleApiRef } from '../api'; + +export function ExamplePage() { + // highlight-next-line + const exampleApi = useApi(exampleApiRef); + + return ( +
+

Example Page

+

Example: {exampleApi.getExample().example}

+
+ ); +} +``` + +```tsx title="in src/plugin.ts - Registering a factory for our API" +import { + createApiFactory, + createApiExtension, +} from '@backstage/frontend-plugin-api'; +import { exampleApiRef, DefaultExampleApi } from './api'; + +// highlight-add-start +const exampleApi = createApiExtension({ + factory: createApiFactory({ + api: exampleApiRef, + deps: {}, + factory: () => new DefaultExampleApi(), + }), +}); +// highlight-add-end + +/* Omitted definitions for examplePage, exampleNavItem, and rootRouteRef. */ + +export const examplePlugin = createPlugin({ + id: 'example', + extensions: [ + // highlight-add-next-line + exampleApi, + examplePage, + exampleNavItem, + ], + routes: { + root: rootRouteRef, + }, +}); +``` + +## Plugin specific extensions + +There are many different plugins that you can extend with additional functionality through extensions. One such plugin is [the catalog plugin](../../features/software-catalog/), one of the core features of Backstage. It lets you catalog the software in your organization, where each item in the catalog has its own page that can be populated with tools and information relating to that catalog entity. In this example we will explore how our plugin can provide such a tool to display on an entity page. + +```tsx title="in src/plugin.ts - An example entity content extension" +import { createEntityContentExtension } from '@backstage/plugin-catalog-react'; + +// Entity content extensions are similar to page extensions in that they are rendered at a route, +// although they also have a title to support in-line navigation between the different content. +// Just like a page extension the content is lazy loaded, and you can also provide a +// route reference if you want to be able to generate a URL that links to the content. +const exampleEntityContent = createEntityContentExtension({ + defaultPath: 'example', + defaultTitle: 'Example', + loader: () => + import('./components/ExampleEntityContent').then(m => ( + + )), +}); + +export const examplePlugin = createPlugin({ + id: 'example', + extensions: [ + // highlight-add-next-line + exampleEntityContent + exampleApi, + examplePage, + exampleNavItem, + ], + routes: { + root: rootRouteRef, + }, +}); +``` + +The `ExampleEntityContent` itself is again a regular React component where you can implement any functionality you want. To access the entity that the content is being rendered for, you can use the `useEntity` hook from `@backstage/plugin-catalog-react`. You can see a full list of APIs provided by the catalog React library in [the API reference](../../reference/plugin-catalog-react.md). + +For a more complete list of the different types of extensions that you can create for your plugin, see the [extension types](./03-extension-types.md) section. diff --git a/docs/frontend-system/building-plugins/testing.md b/docs/frontend-system/building-plugins/02-testing.md similarity index 100% rename from docs/frontend-system/building-plugins/testing.md rename to docs/frontend-system/building-plugins/02-testing.md diff --git a/docs/frontend-system/building-plugins/03-extension-types.md b/docs/frontend-system/building-plugins/03-extension-types.md new file mode 100644 index 0000000000..2bea073ed6 --- /dev/null +++ b/docs/frontend-system/building-plugins/03-extension-types.md @@ -0,0 +1,59 @@ +--- +id: extension-types +title: Frontend System Extension Types +sidebar_label: Extension Types +# prettier-ignore +description: Extension types provided by the frontend system and core features +--- + +> **NOTE: The new frontend system is in alpha and is only supported by a small number of plugins.** + +This section covers many of the [extension types](../architecture/03-extensions.md#extension-creators) available at your disposal when building Backstage frontend plugins. + +## Built-in extension types + +These are the extension types provided by the Backstage frontend framework itself. + +### Api - [Reference](../../reference/frontend-plugin-api.createapiextension.md) + +An API extension is used to add or override [Utility API factories](../utility-apis/01-index.md) in the app. They are commonly used by plugins for both internal and shared APIs. There are also many built-in Api extensions provided by the framework that you are able to override. + +### Component - [Reference](../../reference/frontend-plugin-api.createcomponentextension.md) + +Components extensions are used to override the component associated with a component reference throughout the app. + +### NavItem - [Reference](../../reference/frontend-plugin-api.createnavitemextension.md) + +Navigation item extensions are used to provide menu items that link to different parts of the app. By default nav items are attached to the app nav extension, which by default is rendered as the left sidebar in the app. + +### Page - [Reference](../../reference/frontend-plugin-api.createpageextension.md) + +Page extensions provide content for a particular route in the app. By default pages are attached to the app routes extensions, which renders the root routes. + +### SignInPage - [Reference](../../reference/frontend-plugin-api.createsigninpageextension.md) + +Sign-in page extension have a single purpose - to implement a custom sign-in page. They are always attached to the app root extension and are rendered before the rest of the app until the user is signed in. + +### Theme - [Reference](../../reference/frontend-plugin-api.createthemeextension.md) + +Theme extensions provide custom themes for the app. They are always attached to the app extension and you can have any number of themes extensions installed in an app at once, letting the user choose which theme to use. + +### Translation - [Reference](../../reference/frontend-plugin-api.createtranslationextension.md) + +Translation extension provide custom translation messages for the app. They can be used both to override the default english messages to custom ones, as well as provide translations for additional languages. + +## Core feature extension types + +These are the extension types provided by the Backstage core feature plugins. + +### EntityCard - [Reference](https://github.com/backstage/backstage/blob/master/plugins/catalog-react/api-report-alpha.md) + +Creates entity cards to be displayed on the entity pages of the catalog plugin. + +### EntityContent - [Reference](https://github.com/backstage/backstage/blob/master/plugins/catalog-react/api-report-alpha.md) + +Creates entity content to be displayed on the entity pages of the catalog plugin. + +### SearchResultListItem - [Reference](https://github.com/backstage/backstage/blob/master/plugins/search-react/api-report-alpha.md) + +Creates search result list items for different types of search results, to be displayed in search result lists. diff --git a/docs/frontend-system/index.md b/docs/frontend-system/index.md index 0dda44555c..201718f6d3 100644 --- a/docs/frontend-system/index.md +++ b/docs/frontend-system/index.md @@ -12,4 +12,4 @@ description: The Frontend System The new frontend system is in alpha, and only a few plugins support the system so far. We do not yet recommend migrating any apps to the new system. If you add support for the new system to your plugin, please do so under a `/alpha` sub-path export. -You can find an example app setup in [the `app-next` package](https://github.com/backstage/backstage/tree/master/packages/app-next). +You can find an example app setup in the [`app-next` package](https://github.com/backstage/backstage/tree/master/packages/app-next). diff --git a/docs/local-dev/debugging.md b/docs/local-dev/debugging.md index 17a98b1c1c..39981f2e54 100644 --- a/docs/local-dev/debugging.md +++ b/docs/local-dev/debugging.md @@ -71,3 +71,20 @@ In your `launch.json`, add a new entry with the following, "console": "integratedTerminal" }, ``` + +### WebStorm + +This section describes the process for enabling run configurations for Backstage in WebStorm. +Run configurations enable the use of debugging functionality such as steppers and breakpoints. + +1. Select `Edit Configurations` in the `Run` dropdown menu. Click the plus sign to add a new + configuration, then select `Node.js`. +2. In `Working directory`, input `{PROJECT_DIR}/packages/backend`. + Replace `{PROJECT_DIR}` with the path to your Backstage repo. +3. In `JavaScript file`, input `{PROJECT_DIR}/node_modules/@backstage/cli/bin/backstage-cli`. + Replace `{PROJECT_DIR}` with the path to your Backstage repo. +4. In `Application parameters`, input `package start`. +5. Optionally, for `Environment Variables`, input `LOG_LEVEL=debug`. +6. Click `Apply` to save the changes. +7. With the newly-created configuration selected, use the `Run` or `Debug` icons on the + toolbar to execute the newly created configuration. diff --git a/docs/permissions/custom-rules.md b/docs/permissions/custom-rules.md index 76b0f16cfd..c0f4e3e156 100644 --- a/docs/permissions/custom-rules.md +++ b/docs/permissions/custom-rules.md @@ -8,9 +8,17 @@ For some use cases, you may want to define custom [rules](./concepts.md#resource ## Define a custom rule -Plugins should export a rule factory that provides type-safety that ensures compatibility with the plugin's backend. The catalog plugin exports `createCatalogPermissionRule` from `@backstage/plugin-catalog-backend/alpha` for this purpose. Note: the `/alpha` path segment is temporary until this API is marked as stable. For this example, we'll define the rule in `packages/backend/src/customPermissionRules/isInSystem.ts`, but you can put it anywhere that's accessible by your `backend` package. +Plugins should export a rule factory that provides type-safety that ensures compatibility with the plugin's backend. The catalog plugin exports `createCatalogPermissionRule` from `@backstage/plugin-catalog-backend/alpha` for this purpose. Note: the `/alpha` path segment is temporary until this API is marked as stable. For this example, we'll define the rule and create a condition in `packages/backend/src/plugins/permission.ts`. + +We use Zod in our example below. To install, run: + +```bash +yarn workspace backend add zod +``` + +```typescript title="packages/backend/src/plugins/permission.ts" +... -```typescript title="packages/backend/src/customPermissionRules/isInSystem.ts" import type { Entity } from '@backstage/catalog-model'; import { createCatalogPermissionRule } from '@backstage/plugin-catalog-backend/alpha'; import { createConditionFactory } from '@backstage/plugin-permission-node'; @@ -40,43 +48,56 @@ export const isInSystemRule = createCatalogPermissionRule({ }), }); -export const isInSystemRuleFactory = createConditionFactory(isInSystemRule); +const isInSystem = createConditionFactory(isInSystemRule); + +... ``` For a more detailed explanation on defining rules, refer to the [documentation for plugin authors](./plugin-authors/03-adding-a-resource-permission-check.md#adding-support-for-conditional-decisions). -## Provide the rule during plugin setup - -Now that we have a custom rule defined, we need provide it to the catalog plugin. This step is important because the catalog plugin will use the rule's `toQuery` and `apply` methods while evaluating conditional authorize results. There's no guarantee that the catalog and permission backends are running on the same server, so we must explicitly link the rule to ensure that it's available at runtime. - -The api for providing custom rules may differ between plugins, but there should typically be some integration point during the creation of the backend router. For the catalog, this integration point is exposed via `CatalogBuilder.addPermissionRules`. - -```typescript title="packages/backend/src/plugins/catalog.ts" -import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; -import { isInSystemRule } from '../customPermissionRules/isInSystem'; - -... - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = await CatalogBuilder.create(env); - builder.addPermissionRules(isInSystemRule); - ... - return router; -} -``` - -The new rule is now ready for use in a permission policy! - -## Use the rule in a policy - -Let's bring this all together by extending the example policy from the previous section. +Still in the `packages/backend/src/plugins/permission.ts` file, let's use the condition we just created in our `TestPermissionPolicy`. ```ts title="packages/backend/src/plugins/permission.ts" ... +/* highlight-remove-next-line */ +import { createCatalogPermissionRule } from '@backstage/plugin-catalog-backend/alpha'; /* highlight-add-next-line */ -import { isInSystemRuleFactory } from '../customPermissionRules/isInSystem'; +import { catalogConditions, createCatalogConditionalDecision, createCatalogPermissionRule } from '@backstage/plugin-catalog-backend/alpha'; +/* highlight-remove-next-line */ +import { createConditionFactory } from '@backstage/plugin-permission-node'; +/* highlight-add-next-line */ +import { PermissionPolicy, PolicyQuery, createConditionFactory } from '@backstage/plugin-permission-node'; +/* highlight-add-start */ +import { BackstageIdentityResponse } from '@backstage/plugin-auth-node'; +import { AuthorizeResult, PolicyDecision, isResourcePermission } from '@backstage/plugin-permission-common'; +/* highlight-add-end */ +... + +export const isInSystemRule = createCatalogPermissionRule({ + name: 'IS_IN_SYSTEM', + description: 'Checks if an entity is part of the system provided', + resourceType: 'catalog-entity', + paramsSchema: z.object({ + systemRef: z + .string() + .describe('SystemRef to check the resource is part of'), + }), + apply: (resource: Entity, { systemRef }) => { + if (!resource.relations) { + return false; + } + + return resource.relations + .filter(relation => relation.type === 'partOf') + .some(relation => relation.targetRef === systemRef); + }, + toQuery: ({ systemRef }) => ({ + key: 'relations.partOf', + values: [systemRef], + }), +}); + +const isInSystem = createConditionFactory(isInSystemRule); class TestPermissionPolicy implements PermissionPolicy { async handle( @@ -95,11 +116,11 @@ class TestPermissionPolicy implements PermissionPolicy { { anyOf: [ catalogConditions.isEntityOwner({ - claims: user?.identity.ownershipEntityRefs ?? [] + claims: user?.identity.ownershipEntityRefs ?? [], }), - isInSystemRuleFactory({ systemRef: 'interviewing' }), - ] - } + isInSystem({ systemRef: 'interviewing' }), + ], + }, /* highlight-add-end */ ); } @@ -111,7 +132,31 @@ class TestPermissionPolicy implements PermissionPolicy { ... ``` +## Provide the rule during plugin setup + +Now that we have a custom rule defined and added to our policy, we need provide it to the catalog plugin. This step is important because the catalog plugin will use the rule's `toQuery` and `apply` methods while evaluating conditional authorize results. There's no guarantee that the catalog and permission backends are running on the same server, so we must explicitly link the rule to ensure that it's available at runtime. + +The api for providing custom rules may differ between plugins, but there should typically be some integration point during the creation of the backend router. For the catalog, this integration point is exposed via `CatalogBuilder.addPermissionRules`. + +```typescript title="packages/backend/src/plugins/catalog.ts" +import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; +/* highlight-add-next-line */ +import { isInSystemRule } from './permission'; + +... + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const builder = await CatalogBuilder.create(env); + /* highlight-add-next-line */ + builder.addPermissionRules(isInSystemRule); + ... + return router; +} +``` + The updated policy will allow catalog entity resource permissions if any of the following are true: - User owns the target entity -- Target entity is part of the `'interviewing'` system +- Target entity is part of the 'interviewing' system diff --git a/docs/publishing.md b/docs/publishing.md index f8964278b5..15813275de 100644 --- a/docs/publishing.md +++ b/docs/publishing.md @@ -53,6 +53,7 @@ Additional steps for the main line release - Add the release note file as [`/docs/releases/vx.y.0.md`](./releases) - Add an entry to [`/microsite/sidebar.json`](https://github.com/backstage/backstage/blob/master/microsite/sidebars.json) for the release note - Update the navigation bar item in [`/microsite/docusaurus.config.js`](https://github.com/backstage/backstage/blob/master/microsite/docusaurus.config.js) to point to the new release note + - Finally copy the content, without the metadata header, into the description of the [`Version Packages` Pull Request](https://github.com/backstage/backstage/pulls?q=is%3Aopen+is%3Apr+in%3Atitle+%22Version+Packages) Once the release has been published edit the newly created release in the [GitHub repository](https://github.com/backstage/backstage/releases) and replace the text content with the release notes. @@ -134,3 +135,9 @@ process is used to release an emergency fix as version `6.5.1` in the patch rele - [ ] The fix, which you can likely cherry-pick from your patch branch: `git cherry-pick origin/patch/v1.18.0^` - [ ] An updated `CHANGELOG.md` of all patched packages from the tip of the patch branch, `git checkout origin/patch/v1.18.0 -- {packages,plugins}/*/CHANGELOG.md`. Note that if the patch happens after any next-line releases you'll need to restore those entries in the changelog, placing the patch release entry beneath any next-line release entries. - [ ] A changeset with the message "Applied the fix from version `6.5.1` of this package, which is part of the `v1.18.1` release of Backstage." + +## Troubleshooting + +### When the release workflow is not triggered for some reason, such as a GitHub incident + +Ask one of the maintainers to force push master back to a previous commit and then push the release merge commit again. diff --git a/docs/releases/v1.22.0-changelog.md b/docs/releases/v1.22.0-changelog.md new file mode 100644 index 0000000000..399d7e7016 --- /dev/null +++ b/docs/releases/v1.22.0-changelog.md @@ -0,0 +1,3239 @@ +# Release v1.22.0 + +## @backstage/backend-dynamic-feature-service@0.1.0 + +### Minor Changes + +- eb81f42: New `backend-dynamic-feature-service` package, for the discovery of dynamic frontend and backend plugins (and modules) and the loading of the backend ones inside the backend application. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/cli-node@0.2.2 + - @backstage/plugin-events-backend@0.2.18 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-events-node@0.2.18 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/frontend-app-api@0.5.0 + +### Minor Changes + +- d4149bf: **BREAKING**: Renamed the `app/router` extension to `app/root`. +- 074dfe3: Attaching extensions to an input that does not exist is now a warning rather than an error. + +### Patch Changes + +- 7d63b32: Accepts sub route refs on the new `createPlugin` routes map. +- 516fd3e: Updated README to reflect release status +- c97fa1c: Added `elements`, `wrappers`, and `router` inputs to `app/root`, that let you add things to the root of the React tree above the layout. You can use the `createAppRootElementExtension`, `createAppRootWrapperExtension`, and `createRouterExtension` extension creator, respectively, to conveniently create such extensions. These are all optional, and if you do not supply a router a default one will be used (`BrowserRouter` in regular runs, `MemoryRouter` in tests/CI). +- 5fe6600: add oauth dialog and alert display to the root elements +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.3 + - @backstage/errors@1.2.3 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## @backstage/frontend-plugin-api@0.5.0 + +### Minor Changes + +- d4149bf: **BREAKING**: Renamed the `app/router` extension to `app/root`. + +### Patch Changes + +- b2d370e: Exposed `createComponentRef`, and ensured that produced refs and feature bits have a `toString` for easier debugging +- 7d63b32: Accepts sub route refs on the new `createPlugin` routes map. +- 516fd3e: Updated README to reflect release status +- 4016f21: Remove some unused dependencies +- c97fa1c: Added `elements`, `wrappers`, and `router` inputs to `app/root`, that let you add things to the root of the React tree above the layout. You can use the `createAppRootElementExtension`, `createAppRootWrapperExtension`, and `createRouterExtension` extension creator, respectively, to conveniently create such extensions. These are all optional, and if you do not supply a router a default one will be used (`BrowserRouter` in regular runs, `MemoryRouter` in tests/CI). +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## @backstage/plugin-app-visualizer@0.1.0 + +### Minor Changes + +- e57cc9f: Initial release of the app visualizer plugin. + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-scaffolder-backend@1.20.0 + +### Minor Changes + +- a694f71: The Scaffolder builtin actions now contains an action for running pipelines from Bitbucket Cloud Rest API +- 7c522c5: Add `gitlab:repo:push` scaffolder action to push files to arbitrary branch without creating a Merge Request + +### Patch Changes + +- e9ab1c4: Fixed an issue where not passing a `value` to any of the action's permission conditions caused an error. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-backend-module-github@0.1.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.12 + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.1.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-scaffolder-backend-module-azure@0.1.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.1.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + +## @backstage/plugin-user-settings@0.8.0 + +### Minor Changes + +- 56b2fb0: Updated the user settings selector to use a select component that displays native language names instead of language codes if possible. + +### Patch Changes + +- eea0849: add user-settings declarative integration core nav item +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/core-app-api@1.11.3 + - @backstage/errors@1.2.3 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + +## @backstage/app-defaults@1.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + +## @backstage/backend-app-api@0.5.10 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config-loader@1.6.1 + - @backstage/cli-node@0.2.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/backend-common@0.20.1 + +### Patch Changes + +- 3b24eae: Adding support for removing file from git index + +- 454d17c: Do not call fetch directly but rather use `fetchResponse` facility + +- b6b15b2: Use sha256 instead of md5 for hash key calculation in caches + + This can have a side effect of invalidating caches (when cache key was >250 characters) + This improves compliance with FIPS nodejs + +- Updated dependencies + - @backstage/config-loader@1.6.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-dev-utils@0.1.3 + - @backstage/backend-app-api@0.5.10 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/integration-aws-node@0.1.8 + - @backstage/types@1.1.1 + +## @backstage/backend-defaults@0.2.9 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-app-api@0.5.10 + +## @backstage/backend-dev-utils@0.1.3 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status + +## @backstage/backend-openapi-utils@0.1.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/errors@1.2.3 + +## @backstage/backend-plugin-api@0.6.9 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## @backstage/backend-tasks@0.5.14 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/backend-test-utils@0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-app-api@0.5.10 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/catalog-client@1.5.2 + +### Patch Changes + +- 883782e: Fix a bug in `getLocationByRef` that led to invalid backend calls +- Updated dependencies + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/cli@0.25.1 + +### Patch Changes + +- b6b15b2: Use sha256 instead of md5 in build script cache key calculation + + Makes it possible to build on FIPS nodejs. + +- Updated dependencies + - @backstage/config-loader@1.6.1 + - @backstage/cli-node@0.2.2 + - @backstage/catalog-model@1.4.3 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/eslint-plugin@0.1.4 + - @backstage/integration@1.8.0 + - @backstage/release-manifests@0.0.11 + - @backstage/types@1.1.1 + +## @backstage/cli-node@0.2.2 + +### Patch Changes + +- 7acbb5a: Removed `mock-fs` dev dependency. +- Updated dependencies + - @backstage/cli-common@0.1.13 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/config-loader@1.6.1 + +### Patch Changes + +- 7acbb5a: Removed `mock-fs` dev dependency. +- Updated dependencies + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/core-app-api@1.11.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## @backstage/core-compat-api@0.1.1 + +### Patch Changes + +- 4c1f50c: Make `convertLegacyApp` wrap discovered routes with `compatWrapper`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-plugin-api@1.8.2 + - @backstage/core-app-api@1.11.3 + - @backstage/version-bridge@1.0.7 + +## @backstage/core-components@0.13.10 + +### Patch Changes + +- d625f66: Fixed bug in Link where it was possible to select and copy a hidden element into clipboard +- 6878b1d: Removed unnecessary `history` and `immer` dependencies. +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/theme@0.5.0 + - @backstage/version-bridge@1.0.7 + +## @backstage/core-plugin-api@1.8.2 + +### Patch Changes + +- 6878b1d: Removed unnecessary `i18next` dependency. +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## @backstage/create-app@0.5.9 + +### Patch Changes + +- c9f71fb: Bumped create-app version. +- ac277f3: Bumped create-app version. +- 7acbb5a: Removed `mock-fs` dev dependency. +- Updated dependencies + - @backstage/cli-common@0.1.13 + +## @backstage/dev-utils@1.0.26 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/app-defaults@1.4.7 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + +## @backstage/frontend-test-utils@0.1.1 + +### Patch Changes + +- f7566f9: Updates to reflect the `app/router` extension having been renamed to `app/root`. +- 516fd3e: Updated README to reflect release status +- c97fa1c: Added `elements`, `wrappers`, and `router` inputs to `app/root`, that let you add things to the root of the React tree above the layout. You can use the `createAppRootElementExtension`, `createAppRootWrapperExtension`, and `createRouterExtension` extension creator, respectively, to conveniently create such extensions. These are all optional, and if you do not supply a router a default one will be used (`BrowserRouter` in regular runs, `MemoryRouter` in tests/CI). +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/frontend-app-api@0.5.0 + - @backstage/test-utils@1.4.7 + - @backstage/types@1.1.1 + +## @backstage/integration-react@1.1.23 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + +## @backstage/repo-tools@0.5.2 + +### Patch Changes + +- 883782e: Updated the OpenAPI template to export the `TypedResponse` interface so that client code can leverage it +- 7acbb5a: Removed `mock-fs` dev dependency. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/cli-node@0.2.2 + - @backstage/catalog-model@1.4.3 + - @backstage/cli-common@0.1.13 + - @backstage/errors@1.2.3 + +## @techdocs/cli@1.8.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-techdocs-node@1.11.1 + - @backstage/catalog-model@1.4.3 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + +## @backstage/test-utils@1.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + +## @backstage/plugin-adr@0.6.12 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-search-react@1.7.5 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-adr-common@0.2.19 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-adr-backend@0.4.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/plugin-adr-common@0.2.19 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-adr-common@0.2.19 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.3 + - @backstage/integration@1.8.0 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-airbrake@0.3.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/dev-utils@1.0.26 + - @backstage/catalog-model@1.4.3 + - @backstage/test-utils@1.4.7 + +## @backstage/plugin-airbrake-backend@0.3.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + +## @backstage/plugin-allure@0.1.45 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-analytics-module-ga@0.1.37 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + +## @backstage/plugin-analytics-module-ga4@0.1.8 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + +## @backstage/plugin-analytics-module-newrelic-browser@0.0.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + +## @backstage/plugin-apache-airflow@0.2.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-api-docs@0.10.3 + +### Patch Changes + +- 8a69cc9: Fix custom http resolvers for AsyncAPI widget. +- 062b8f2: Add permission check to Register Existing API button +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-apollo-explorer@0.1.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-app-backend@0.3.57 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config-loader@1.6.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-app-node@0.1.9 + +## @backstage/plugin-app-node@0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + +## @backstage/plugin-auth-backend@0.20.3 + +### Patch Changes + +- 004499c: Fixed an issue where some Okta's resolvers were missing +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.1.1 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.1.1 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.2.3 + - @backstage/plugin-auth-backend-module-github-provider@0.1.6 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.6 + - @backstage/plugin-auth-backend-module-google-provider@0.1.6 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.6 + - @backstage/plugin-auth-backend-module-okta-provider@0.0.2 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.1.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.2.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-auth-backend-module-github-provider@0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## @backstage/plugin-auth-backend-module-google-provider@0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.1.4 + +### Patch Changes + +- 928efbc: Deprecated the `authModuleMicrosoftProvider` export. A default export is now available and should be used like this in your backend: `backend.add(import('@backstage/plugin-auth-backend-module-microsoft-provider'));` +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.1.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-auth-backend-module-okta-provider@0.0.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.1.3 + +### Patch Changes + +- 928efbc: Deprecated the `authModulePinnipedProvider` export. A default export is now available and should be used like this in your backend: `backend.add(import('@backstage/plugin-auth-backend-module-pinniped-provider'));` +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.1.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-auth-node@0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-azure-devops@0.3.11 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-azure-devops-common@0.3.2 + +## @backstage/plugin-azure-devops-backend@0.5.1 + +### Patch Changes + +- d076ee4: Updated dependency `azure-devops-node-api` to `^12.0.0`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-azure-devops-common@0.3.2 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-azure-sites@0.1.18 + +### Patch Changes + +- a31f688: Show Azure site tags in `EntityAzureSitesOverviewWidget`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-azure-sites-common@0.1.1 + +## @backstage/plugin-azure-sites-backend@0.1.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config@1.1.1 + - @backstage/plugin-azure-sites-common@0.1.1 + +## @backstage/plugin-badges@0.2.53 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-badges-backend@0.3.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## @backstage/plugin-bazaar@0.2.21 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-bazaar-backend@0.3.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + +## @backstage/plugin-bitrise@0.1.56 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-catalog@1.16.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-search-react@1.7.5 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-catalog-backend@1.16.1 + +### Patch Changes + +- c3249d6: Parse the URL using a different method rather than `git-url-parse` to support wildcards for URLs which are not VCS providers +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-search-backend-module-catalog@0.1.13 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-openapi-utils@0.1.2 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-catalog-backend-module-aws@0.3.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- 22e88d0: Added status and e-mail as labels to the AWS Account Resource +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/integration-aws-node@0.1.8 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-catalog-backend-module-azure@0.1.28 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-openapi-utils@0.1.2 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.24 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.15 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.24 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.15 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.22 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.25 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-catalog-backend-module-github@0.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-catalog-backend-module-github-org@0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-catalog-backend-module-github@0.4.7 + - @backstage/config@1.1.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.4.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.24 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.16 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.26 + +### Patch Changes + +- 4ebf99b: Add support for the new backend system. + + A new backend module for the catalog backend + was added and exported as `default`. + + You can use it with the new backend system like + + ```ts title="packages/backend/src/index.ts" + backend.add(import('@backstage/plugin-catalog-backend-module-openapi')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-catalog-common@1.0.20 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-catalog-graph@0.3.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-catalog-import@0.10.5 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-catalog-node@1.6.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-catalog-react@1.9.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-catalog-unprocessed-entities@0.1.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-cicd-statistics@0.1.31 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.25 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-cicd-statistics@0.1.31 + +## @backstage/plugin-circleci@0.3.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-cloudbuild@0.3.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-code-climate@0.1.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-code-coverage@0.2.22 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-code-coverage-backend@0.2.23 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-codescene@0.1.21 + +### Patch Changes + +- d5eda61: Updated Readme document in codescene plugin +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## @backstage/plugin-config-schema@0.1.49 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-cost-insights@0.12.18 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/theme@0.5.0 + - @backstage/plugin-cost-insights-common@0.1.2 + +## @backstage/plugin-devtools@0.1.8 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/errors@1.2.3 + - @backstage/plugin-devtools-common@0.1.8 + +## @backstage/plugin-devtools-backend@0.2.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config-loader@1.6.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-devtools-common@0.1.8 + +## @backstage/plugin-devtools-common@0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/types@1.1.1 + +## @backstage/plugin-dynatrace@8.0.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-entity-feedback@0.2.12 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-entity-feedback-common@0.1.3 + +## @backstage/plugin-entity-feedback-backend@0.2.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-entity-feedback-common@0.1.3 + +## @backstage/plugin-entity-validation@0.1.14 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-events-backend@0.2.18 + +### Patch Changes + +- 92ea615: Update `README.md` +- d5ddc4e: Add documentation on how to install the plugins with the new backend system. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-events-backend-module-aws-sqs@0.2.12 + +### Patch Changes + +- 7b8e551: Fix errors when deleting SQS messages: + + - If zero messages were received, skip deletion to avoid `EmptyBatchRequest` error from the SQS client. + - If zero failures were returned from the SQS client during deletion, skip error logging. + +- d5ddc4e: Add documentation on how to install the plugins with the new backend system. + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-tasks@0.5.14 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-events-backend-module-azure@0.1.19 + +### Patch Changes + +- af76a95: Add default exports for the new backend system and documentation. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.19 + +### Patch Changes + +- af76a95: Add default exports for the new backend system and documentation. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-events-backend-module-gerrit@0.1.19 + +### Patch Changes + +- af76a95: Add default exports for the new backend system and documentation. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-events-backend-module-github@0.1.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-events-backend-module-gitlab@0.1.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-events-backend-test-utils@0.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.18 + +## @backstage/plugin-events-node@0.2.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + +## @backstage/plugin-explore@0.4.15 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-explore-react@0.0.35 + - @backstage/plugin-search-react@1.7.5 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-explore-backend@0.0.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-search-backend-module-explore@0.1.13 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-explore-common@0.0.2 + +## @backstage/plugin-explore-react@0.0.35 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-explore-common@0.0.2 + +## @backstage/plugin-firehydrant@0.2.13 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-fossa@0.2.61 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-gcalendar@0.3.22 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/errors@1.2.3 + +## @backstage/plugin-gcp-projects@0.3.45 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-git-release-manager@0.3.41 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/integration@1.8.0 + +## @backstage/plugin-github-actions@0.6.10 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-github-deployments@0.1.60 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-github-issues@0.2.18 + +### Patch Changes + +- bf92ae3: Updated dependency `octokit` to `^3.0.0`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-github-pull-requests-board@0.1.23 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-gitops-profiles@0.3.44 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-gocd@0.1.35 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-graphiql@0.3.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-graphql-voyager@0.1.11 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-home@0.6.1 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-home-react@0.1.7 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + +## @backstage/plugin-home-react@0.1.7 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-ilert@0.2.18 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-jenkins@0.9.4 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-jenkins-common@0.1.23 + +## @backstage/plugin-jenkins-backend@0.3.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-jenkins-common@0.1.23 + +## @backstage/plugin-jenkins-common@0.1.23 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-kafka@0.3.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-kafka-backend@0.3.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## @backstage/plugin-kubernetes@0.11.4 + +### Patch Changes + +- d5d2c67: Add `authuser` search parameter to GKE cluster link formatter in k8s plugin + + Thanks to this, people with multiple simultaneously logged-in accounts in their GCP console will automatically view objects with the same email as the one signed in to the Google auth provider in Backstage. + +- 4016f21: Remove some unused dependencies + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-kubernetes-react@0.2.1 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-kubernetes-backend@0.14.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration-aws-node@0.1.8 + - @backstage/types@1.1.1 + - @backstage/plugin-kubernetes-node@0.1.3 + +## @backstage/plugin-kubernetes-cluster@0.0.5 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-kubernetes-react@0.2.1 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-kubernetes-common@0.7.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/catalog-model@1.4.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-kubernetes-node@0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/catalog-model@1.4.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-kubernetes-react@0.2.1 + +### Patch Changes + +- d5d2c67: Add `authuser` search parameter to GKE cluster link formatter in k8s plugin + + Thanks to this, people with multiple simultaneously logged-in accounts in their GCP console will automatically view objects with the same email as the one signed in to the Google auth provider in Backstage. + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-lighthouse@0.4.14 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-lighthouse-common@0.1.4 + +## @backstage/plugin-lighthouse-backend@0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-lighthouse-common@0.1.4 + +## @backstage/plugin-linguist@0.1.14 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- 4f42918: Added alpha support for the New Frontend System (Declarative Integration) +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-linguist-common@0.1.2 + +## @backstage/plugin-linguist-backend@0.5.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-linguist-common@0.1.2 + +## @backstage/plugin-microsoft-calendar@0.1.11 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/errors@1.2.3 + +## @backstage/plugin-newrelic@0.3.44 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-newrelic-dashboard@0.3.4 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-nomad@0.1.10 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-nomad-backend@0.1.11 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## @backstage/plugin-octopus-deploy@0.2.11 + +### Patch Changes + +- 7d96ba8: added install path and fixed import on plugin-octopus-deploy +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-opencost@0.2.4 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-org@0.6.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-org-react@0.1.18 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-pagerduty@0.7.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-home-react@0.1.7 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-periskop@0.1.27 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-periskop-backend@0.2.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + +## @backstage/plugin-permission-backend@0.5.32 + +### Patch Changes + +- b1acd9b: Updated README +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + +## @backstage/plugin-permission-common@0.7.12 + +### Patch Changes + +- b1acd9b: Updated README +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-permission-node@0.7.20 + +### Patch Changes + +- b1acd9b: Updated README +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## @backstage/plugin-permission-react@0.4.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- b1acd9b: Updated README +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/config@1.1.1 + +## @backstage/plugin-playlist@0.2.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-search-react@1.7.5 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-playlist-common@0.1.14 + +## @backstage/plugin-playlist-backend@0.3.13 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-playlist-common@0.1.14 + +## @backstage/plugin-playlist-common@0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + +## @backstage/plugin-proxy-backend@0.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + +## @backstage/plugin-puppetdb@0.1.12 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-rollbar@0.4.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-rollbar-backend@0.1.54 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config@1.1.1 + +## @backstage/plugin-scaffolder@1.17.1 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- 4016f21: Remove some unused dependencies +- df4bc9d: Minor internal refactor +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.7.1 + - @backstage/core-components@0.13.10 + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-scaffolder-backend-module-azure@0.1.1 + +### Patch Changes + +- d076ee4: Updated dependency `azure-devops-node-api` to `^12.0.0`. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.1.1 + +### Patch Changes + +- a694f71: The Scaffolder builtin actions now contains an action for running pipelines from Bitbucket Cloud Rest API +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10 + +### Patch Changes + +- 7acbb5a: Removed `mock-fs` dev dependency. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.33 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-scaffolder-backend-module-github@0.1.1 + +### Patch Changes + +- 5470300: Ensure `teamReviewers` list is unique before calling API +- bf92ae3: Updated dependency `octokit` to `^3.0.0`. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.2.12 + +### Patch Changes + +- 604c9dd: Add Scaffolder custom action that creates GitLab issues called `gitlab:issues:create` +- 7c522c5: Add `gitlab:repo:push` scaffolder action to push files to arbitrary branch without creating a Merge Request +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.26 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.17 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.30 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-common@1.4.5 + +### Patch Changes + +- 178b8d8: Updated Template.v1beta3.schema.json, added a missing "presentation" field +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/catalog-model@1.4.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-node@0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + +## @backstage/plugin-scaffolder-react@1.7.1 + +### Patch Changes + +- c28f281: Scaffolder form now shows a list of errors at the top of the form. +- 0b9ce2b: Fix for a step with no properties +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- 4016f21: Remove some unused dependencies +- d16f85f: Show first scaffolder output text by default +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## @backstage/plugin-search@1.4.5 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-search-react@1.7.5 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-search-backend@1.4.9 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-openapi-utils@0.1.2 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-search-backend-module-catalog@0.1.13 + +### Patch Changes + +- 2e6c56b: Update wording to show that the backend system no longer is in alpha +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-search-backend-module-elasticsearch@1.3.12 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/integration-aws-node@0.1.8 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-search-backend-module-explore@0.1.13 + +### Patch Changes + +- 2e6c56b: Update wording to show that the backend system no longer is in alpha +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-search-backend-module-pg@0.5.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.1.2 + +### Patch Changes + +- 2e6c56b: Update wording to show that the backend system no longer is in alpha +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-search-backend-module-techdocs@0.1.13 + +### Patch Changes + +- 2e6c56b: Update wording to show that the backend system no longer is in alpha +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/plugin-techdocs-node@1.11.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-search-backend-node@1.2.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/backend-tasks@0.5.14 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-search-common@1.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/types@1.1.1 + +## @backstage/plugin-search-react@1.7.5 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-sentry@0.5.14 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-shortcuts@0.3.18 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + +## @backstage/plugin-sonarqube@0.7.11 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-sonarqube-react@0.1.12 + +## @backstage/plugin-sonarqube-backend@0.2.11 + +### Patch Changes + +- 53445cd: Updated README +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## @backstage/plugin-sonarqube-react@0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-splunk-on-call@0.4.18 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## @backstage/plugin-stack-overflow@0.1.24 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-home-react@0.1.7 + - @backstage/plugin-search-react@1.7.5 + - @backstage/config@1.1.1 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-stack-overflow-backend@0.2.13 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/plugin-search-backend-module-stack-overflow-collator@0.1.2 + +## @backstage/plugin-stackstorm@0.1.10 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/errors@1.2.3 + +## @backstage/plugin-tech-insights@0.3.21 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + +## @backstage/plugin-tech-insights-backend@0.5.23 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-tech-insights-node@0.4.15 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-tech-insights-node@0.4.15 + - @backstage/errors@1.2.3 + - @backstage/plugin-tech-insights-common@0.2.12 + +## @backstage/plugin-tech-insights-node@0.4.15 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + +## @backstage/plugin-tech-radar@0.6.12 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @backstage/plugin-techdocs@1.9.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-search-react@1.7.5 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/theme@0.5.0 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.26 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-techdocs@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/plugin-search-react@1.7.5 + - @backstage/integration-react@1.1.23 + - @backstage/core-app-api@1.11.3 + - @backstage/test-utils@1.4.7 + +## @backstage/plugin-techdocs-backend@1.9.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.13 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-techdocs-node@1.11.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-common@1.0.20 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.4 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/integration-react@1.1.23 + - @backstage/integration@1.8.0 + +## @backstage/plugin-techdocs-node@1.11.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/integration-aws-node@0.1.8 + - @backstage/plugin-search-common@1.2.10 + +## @backstage/plugin-techdocs-react@1.1.15 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/version-bridge@1.0.7 + +## @backstage/plugin-todo@0.2.33 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-todo-backend@0.3.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-openapi-utils@0.1.2 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## @backstage/plugin-user-settings-backend@0.2.8 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## @backstage/plugin-vault@0.1.24 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## @backstage/plugin-vault-backend@0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-tasks@0.5.14 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-vault-node@0.1.2 + +## @backstage/plugin-vault-node@0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + +## @backstage/plugin-xcmetrics@0.2.47 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/errors@1.2.3 + +## example-app@0.2.91 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.10.3 + - @backstage/plugin-scaffolder-react@1.7.1 + - @backstage/core-components@0.13.10 + - @backstage/plugin-user-settings@0.8.0 + - @backstage/plugin-azure-sites@0.1.18 + - @backstage/cli@0.25.1 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-octopus-deploy@0.2.11 + - @backstage/frontend-app-api@0.5.0 + - @backstage/plugin-kubernetes@0.11.4 + - @backstage/plugin-home@0.6.1 + - @backstage/plugin-scaffolder@1.17.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7 + - @backstage/plugin-kubernetes-cluster@0.0.5 + - @backstage/plugin-microsoft-calendar@0.1.11 + - @backstage/plugin-newrelic-dashboard@0.3.4 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-entity-feedback@0.2.12 + - @backstage/plugin-apache-airflow@0.2.19 + - @backstage/plugin-github-actions@0.6.10 + - @backstage/plugin-stack-overflow@0.1.24 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-catalog-graph@0.3.3 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-code-coverage@0.2.22 + - @backstage/plugin-cost-insights@0.12.18 + - @backstage/plugin-tech-insights@0.3.21 + - @backstage/plugin-azure-devops@0.3.11 + - @backstage/plugin-gcp-projects@0.3.45 + - @backstage/plugin-cloudbuild@0.3.29 + - @backstage/plugin-lighthouse@0.4.14 + - @backstage/plugin-stackstorm@0.1.10 + - @backstage/plugin-tech-radar@0.6.12 + - @backstage/plugin-dynatrace@8.0.3 + - @backstage/plugin-gcalendar@0.3.22 + - @backstage/plugin-pagerduty@0.7.1 + - @backstage/plugin-shortcuts@0.3.18 + - @backstage/plugin-airbrake@0.3.29 + - @backstage/plugin-devtools@0.1.8 + - @backstage/plugin-graphiql@0.3.2 + - @backstage/plugin-linguist@0.1.14 + - @backstage/plugin-newrelic@0.3.44 + - @backstage/plugin-playlist@0.2.3 + - @backstage/plugin-puppetdb@0.1.12 + - @backstage/plugin-techdocs@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/plugin-explore@0.4.15 + - @backstage/plugin-jenkins@0.9.4 + - @backstage/plugin-rollbar@0.4.29 + - @backstage/plugin-badges@0.2.53 + - @backstage/plugin-search@1.4.5 + - @backstage/plugin-sentry@0.5.14 + - @backstage/plugin-kafka@0.3.29 + - @backstage/plugin-nomad@0.1.10 + - @backstage/plugin-gocd@0.1.35 + - @backstage/plugin-todo@0.2.33 + - @backstage/plugin-adr@0.6.12 + - @backstage/plugin-org@0.6.19 + - @backstage/plugin-catalog-import@0.10.5 + - @backstage/plugin-search-react@1.7.5 + - @backstage/app-defaults@1.4.7 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.10 + +## example-app-next@0.0.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.10.3 + - @backstage/core-compat-api@0.1.1 + - @backstage/plugin-scaffolder-react@1.7.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/plugin-user-settings@0.8.0 + - @backstage/plugin-azure-sites@0.1.18 + - @backstage/cli@0.25.1 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-octopus-deploy@0.2.11 + - @backstage/frontend-app-api@0.5.0 + - @backstage/plugin-kubernetes@0.11.4 + - @backstage/plugin-home@0.6.1 + - @backstage/plugin-scaffolder@1.17.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7 + - @backstage/plugin-microsoft-calendar@0.1.11 + - @backstage/plugin-newrelic-dashboard@0.3.4 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-entity-feedback@0.2.12 + - @backstage/plugin-apache-airflow@0.2.19 + - @backstage/plugin-github-actions@0.6.10 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-catalog-graph@0.3.3 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-code-coverage@0.2.22 + - @backstage/plugin-cost-insights@0.12.18 + - @backstage/plugin-tech-insights@0.3.21 + - @backstage/plugin-azure-devops@0.3.11 + - @backstage/plugin-gcp-projects@0.3.45 + - @backstage/plugin-cloudbuild@0.3.29 + - @backstage/plugin-lighthouse@0.4.14 + - @backstage/plugin-stackstorm@0.1.10 + - @backstage/plugin-tech-radar@0.6.12 + - @backstage/plugin-dynatrace@8.0.3 + - @backstage/plugin-gcalendar@0.3.22 + - @backstage/plugin-pagerduty@0.7.1 + - @backstage/plugin-shortcuts@0.3.18 + - @backstage/plugin-airbrake@0.3.29 + - @backstage/plugin-devtools@0.1.8 + - @backstage/plugin-graphiql@0.3.2 + - @backstage/plugin-linguist@0.1.14 + - @backstage/plugin-newrelic@0.3.44 + - @backstage/plugin-playlist@0.2.3 + - @backstage/plugin-puppetdb@0.1.12 + - @backstage/plugin-techdocs@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/plugin-explore@0.4.15 + - @backstage/plugin-jenkins@0.9.4 + - @backstage/plugin-rollbar@0.4.29 + - @backstage/plugin-badges@0.2.53 + - @backstage/plugin-search@1.4.5 + - @backstage/plugin-sentry@0.5.14 + - @backstage/plugin-kafka@0.3.29 + - @backstage/plugin-gocd@0.1.35 + - @backstage/plugin-todo@0.2.33 + - @backstage/plugin-adr@0.6.12 + - @backstage/plugin-org@0.6.19 + - @backstage/plugin-app-visualizer@0.1.0 + - @backstage/plugin-catalog-import@0.10.5 + - app-next-example-plugin@0.0.5 + - @backstage/plugin-search-react@1.7.5 + - @backstage/app-defaults@1.4.7 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.10 + +## app-next-example-plugin@0.0.5 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + +## example-backend@0.2.91 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.20.3 + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-backend@1.20.0 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10 + - @backstage/plugin-events-backend@0.2.18 + - @backstage/plugin-search-backend-module-techdocs@0.1.13 + - @backstage/plugin-search-backend-module-catalog@0.1.13 + - @backstage/plugin-search-backend-module-explore@0.1.13 + - @backstage/plugin-azure-devops-backend@0.5.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41 + - @backstage/plugin-entity-feedback-backend@0.2.6 + - @backstage/plugin-code-coverage-backend@0.2.23 + - @backstage/plugin-azure-sites-backend@0.1.19 + - @backstage/plugin-tech-insights-node@0.4.15 + - @backstage/plugin-devtools-backend@0.2.6 + - @backstage/plugin-linguist-backend@0.5.6 + - @backstage/plugin-playlist-backend@0.3.13 + - @backstage/plugin-techdocs-backend@1.9.2 + - @backstage/plugin-explore-backend@0.0.19 + - @backstage/plugin-jenkins-backend@0.3.3 + - @backstage/plugin-badges-backend@0.3.6 + - @backstage/plugin-search-backend@1.4.9 + - @backstage/plugin-kafka-backend@0.3.7 + - @backstage/plugin-nomad-backend@0.1.11 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-todo-backend@0.3.7 + - @backstage/plugin-adr-backend@0.4.6 + - @backstage/plugin-app-backend@0.3.57 + - @backstage/plugin-permission-backend@0.5.32 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-catalog-backend@1.16.1 + - example-app@0.2.91 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-kubernetes-backend@0.14.1 + - @backstage/plugin-lighthouse-backend@0.4.1 + - @backstage/plugin-proxy-backend@0.4.7 + - @backstage/plugin-rollbar-backend@0.1.54 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.26 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.12 + - @backstage/plugin-search-backend-module-pg@0.5.18 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/plugin-tech-insights-backend@0.5.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6 + - @backstage/plugin-events-node@0.2.18 + - @backstage/plugin-search-common@1.2.10 + +## example-backend-next@0.0.19 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-sonarqube-backend@0.2.11 + - @backstage/plugin-scaffolder-backend@1.20.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26 + - @backstage/plugin-search-backend-module-techdocs@0.1.13 + - @backstage/plugin-search-backend-module-catalog@0.1.13 + - @backstage/plugin-search-backend-module-explore@0.1.13 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-defaults@0.2.9 + - @backstage/plugin-azure-devops-backend@0.5.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2 + - @backstage/plugin-entity-feedback-backend@0.2.6 + - @backstage/plugin-devtools-backend@0.2.6 + - @backstage/plugin-linguist-backend@0.5.6 + - @backstage/plugin-playlist-backend@0.3.13 + - @backstage/plugin-techdocs-backend@1.9.2 + - @backstage/plugin-jenkins-backend@0.3.3 + - @backstage/plugin-badges-backend@0.3.6 + - @backstage/plugin-search-backend@1.4.9 + - @backstage/plugin-nomad-backend@0.1.11 + - @backstage/plugin-todo-backend@0.3.7 + - @backstage/plugin-adr-backend@0.4.6 + - @backstage/plugin-app-backend@0.3.57 + - @backstage/plugin-permission-backend@0.5.32 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-kubernetes-backend@0.14.1 + - @backstage/plugin-lighthouse-backend@0.4.1 + - @backstage/plugin-proxy-backend@0.4.7 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6 + +## e2e-test@0.2.11 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.9 + - @backstage/cli-common@0.1.13 + - @backstage/errors@1.2.3 + +## techdocs-cli-embedded-app@0.2.90 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/cli@0.25.1 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-techdocs@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/app-defaults@1.4.7 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.3 + - @backstage/test-utils@1.4.7 + - @backstage/theme@0.5.0 + +## @internal/plugin-todo-list@1.0.21 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## @internal/plugin-todo-list-backend@1.0.21 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/errors@1.2.3 + +## @internal/plugin-todo-list-common@1.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 diff --git a/docs/releases/v1.22.0-next.2-changelog.md b/docs/releases/v1.22.0-next.2-changelog.md new file mode 100644 index 0000000000..c9dcfeff98 --- /dev/null +++ b/docs/releases/v1.22.0-next.2-changelog.md @@ -0,0 +1,1835 @@ +# Release v1.22.0-next.2 + +## @backstage/backend-app-api@0.5.10-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/cli-node@0.2.2-next.0 + - @backstage/config-loader@1.6.1-next.0 + +## @backstage/backend-common@0.20.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-dev-utils@0.1.3-next.0 + - @backstage/backend-app-api@0.5.10-next.2 + - @backstage/config-loader@1.6.1-next.0 + +## @backstage/backend-defaults@0.2.9-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-app-api@0.5.10-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/backend-dev-utils@0.1.3-next.0 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status + +## @backstage/backend-openapi-utils@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + +## @backstage/backend-plugin-api@0.6.9-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/backend-tasks@0.5.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/backend-test-utils@0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-app-api@0.5.10-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/core-compat-api@0.1.1-next.2 + +### Patch Changes + +- 4c1f50c: Make `convertLegacyApp` wrap discovered routes with `compatWrapper`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + +## @backstage/create-app@0.5.9-next.2 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/dev-utils@1.0.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/integration-react@1.1.23-next.0 + +## @backstage/frontend-app-api@0.4.1-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + +## @backstage/frontend-plugin-api@0.4.1-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status + +## @backstage/frontend-test-utils@0.1.1-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/frontend-app-api@0.4.1-next.2 + +## @backstage/repo-tools@0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/cli-node@0.2.2-next.0 + +## @techdocs/cli@1.8.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-techdocs-node@1.11.1-next.2 + +## @backstage/plugin-adr@0.6.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/integration-react@1.1.23-next.0 + +## @backstage/plugin-adr-backend@0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-airbrake@0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/dev-utils@1.0.26-next.2 + +## @backstage/plugin-airbrake-backend@0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-allure@0.1.45-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-api-docs@0.10.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-app-backend@0.3.57-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-app-node@0.1.9-next.2 + - @backstage/config-loader@1.6.1-next.0 + +## @backstage/plugin-app-node@0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + +## @backstage/plugin-auth-backend@0.20.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.1.1-next.2 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.1.6-next.2 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.6-next.2 + - @backstage/plugin-auth-backend-module-google-provider@0.1.6-next.2 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.6-next.2 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.1.1-next.2 + - @backstage/plugin-auth-backend-module-okta-provider@0.0.2-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-backend-module-github-provider@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-backend-module-google-provider@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-backend-module-okta-provider@0.0.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-auth-node@0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-azure-devops@0.3.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-azure-devops-backend@0.5.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + +## @backstage/plugin-azure-sites@0.1.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-azure-sites-backend@0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-badges@0.2.53-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-badges-backend@0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-bazaar@0.2.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-bazaar-backend@0.3.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-bitrise@0.1.56-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-catalog@1.16.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/integration-react@1.1.23-next.0 + +## @backstage/plugin-catalog-backend@1.16.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-openapi-utils@0.1.2-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-aws@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-azure@0.1.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-openapi-utils@0.1.2-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-gcp@0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.25-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-github@0.4.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-github-org@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-backend-module-github@0.4.7-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-gitlab@0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.4.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-catalog-graph@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-catalog-import@0.10.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/integration-react@1.1.23-next.0 + +## @backstage/plugin-catalog-node@1.6.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + +## @backstage/plugin-catalog-react@1.9.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/integration-react@1.1.23-next.0 + +## @backstage/plugin-cicd-statistics@0.1.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.25-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cicd-statistics@0.1.31-next.2 + +## @backstage/plugin-circleci@0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-cloudbuild@0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-code-climate@0.1.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-code-coverage@0.2.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-code-coverage-backend@0.2.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-cost-insights@0.12.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-devtools-backend@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/config-loader@1.6.1-next.0 + +## @backstage/plugin-dynatrace@8.0.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-entity-feedback@0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-entity-feedback-backend@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-entity-validation@0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-events-backend@0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + +## @backstage/plugin-events-backend-module-aws-sqs@0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-events-backend-module-azure@0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + +## @backstage/plugin-events-backend-module-gerrit@0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + +## @backstage/plugin-events-backend-module-github@0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + +## @backstage/plugin-events-backend-module-gitlab@0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + +## @backstage/plugin-events-backend-test-utils@0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.18-next.2 + +## @backstage/plugin-events-node@0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + +## @backstage/plugin-explore@0.4.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + +## @backstage/plugin-explore-backend@0.0.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 + +## @backstage/plugin-firehydrant@0.2.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-fossa@0.2.61-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-github-actions@0.6.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/integration-react@1.1.23-next.0 + +## @backstage/plugin-github-deployments@0.1.60-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/integration-react@1.1.23-next.0 + +## @backstage/plugin-github-issues@0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-github-pull-requests-board@0.1.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-gocd@0.1.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-graphiql@0.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + +## @backstage/plugin-home@0.6.1-next.2 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-home-react@0.1.7-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-home-react@0.1.7-next.2 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. + +## @backstage/plugin-ilert@0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-jenkins@0.9.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-jenkins-backend@0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + +## @backstage/plugin-kafka@0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-kafka-backend@0.3.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-kubernetes@0.11.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-kubernetes-backend@0.14.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-kubernetes-node@0.1.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + +## @backstage/plugin-kubernetes-cluster@0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-kubernetes-node@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + +## @backstage/plugin-lighthouse@0.4.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-lighthouse-backend@0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-linguist@0.1.14-next.2 + +### Patch Changes + +- 4f42918: Added alpha support for the New Frontend System (Declarative Integration) +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-linguist-backend@0.5.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-newrelic-dashboard@0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-nomad@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-nomad-backend@0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-octopus-deploy@0.2.11-next.2 + +### Patch Changes + +- 7d96ba8: added install path and fixed import on plugin-octopus-deploy +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-org@0.6.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-org-react@0.1.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-pagerduty@0.7.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home-react@0.1.7-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-periskop@0.1.27-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-periskop-backend@0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-permission-backend@0.5.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + +## @backstage/plugin-permission-node@0.7.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-playlist@0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + +## @backstage/plugin-playlist-backend@0.3.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + +## @backstage/plugin-proxy-backend@0.4.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-puppetdb@0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-rollbar@0.4.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-rollbar-backend@0.1.54-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-scaffolder@1.17.1-next.2 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.7.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/integration-react@1.1.23-next.0 + +## @backstage/plugin-scaffolder-backend@1.19.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/plugin-scaffolder-backend-module-azure@0.1.1-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.1.1-next.2 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.1.1-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.1.1-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.12-next.2 + +## @backstage/plugin-scaffolder-backend-module-azure@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## @backstage/plugin-scaffolder-backend-module-github@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.30-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + +## @backstage/plugin-scaffolder-node@0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-scaffolder-react@1.7.1-next.2 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-search@1.4.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + +## @backstage/plugin-search-backend@1.4.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-openapi-utils@0.1.2-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + +## @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-search-backend-module-elasticsearch@1.3.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + +## @backstage/plugin-search-backend-module-explore@0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-search-backend-module-pg@0.5.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/plugin-techdocs-node@1.11.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-search-backend-node@1.2.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-search-react@1.7.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + +## @backstage/plugin-sentry@0.5.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-sonarqube@0.7.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-sonarqube-backend@0.2.11-next.2 + +### Patch Changes + +- 53445cd: Updated README +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-splunk-on-call@0.4.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-stack-overflow@0.1.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-home-react@0.1.7-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + +## @backstage/plugin-stack-overflow-backend@0.2.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-stack-overflow-collator@0.1.2-next.2 + +## @backstage/plugin-tech-insights@0.3.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-tech-insights-backend@0.5.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/plugin-tech-insights-node@0.4.15-next.2 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-tech-insights-node@0.4.15-next.2 + +## @backstage/plugin-tech-insights-node@0.4.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-tech-radar@0.6.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + +## @backstage/plugin-techdocs@1.9.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/integration-react@1.1.23-next.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-techdocs@1.9.3-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/integration-react@1.1.23-next.0 + +## @backstage/plugin-techdocs-backend@1.9.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 + - @backstage/plugin-techdocs-node@1.11.1-next.2 + +## @backstage/plugin-techdocs-node@1.11.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## @backstage/plugin-todo@0.2.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-todo-backend@0.3.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-openapi-utils@0.1.2-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + +## @backstage/plugin-user-settings@0.8.0-next.2 + +### Patch Changes + +- eea0849: add user-settings declarative integration core nav item +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-user-settings-backend@0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-vault@0.1.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## @backstage/plugin-vault-backend@0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-vault-node@0.1.2-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + +## @backstage/plugin-vault-node@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + +## example-app@0.2.91-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-user-settings@0.8.0-next.2 + - @backstage/plugin-octopus-deploy@0.2.11-next.2 + - @backstage/frontend-app-api@0.4.1-next.2 + - @backstage/plugin-home@0.6.1-next.2 + - @backstage/plugin-scaffolder-react@1.7.1-next.2 + - @backstage/plugin-scaffolder@1.17.1-next.2 + - @backstage/plugin-linguist@0.1.14-next.2 + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-catalog-import@0.10.5-next.2 + - @backstage/plugin-graphiql@0.3.2-next.2 + - @backstage/plugin-search@1.4.5-next.2 + - @backstage/plugin-tech-radar@0.6.12-next.2 + - @backstage/plugin-techdocs@1.9.3-next.2 + - @backstage/plugin-adr@0.6.12-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-explore@0.4.15-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/plugin-stack-overflow@0.1.24-next.2 + - @backstage/cli@0.25.1-next.1 + - @backstage/plugin-pagerduty@0.7.1-next.2 + - @backstage/plugin-api-docs@0.10.3-next.2 + - @backstage/plugin-catalog-graph@0.3.3-next.2 + - @backstage/plugin-org@0.6.19-next.2 + - @backstage/plugin-airbrake@0.3.29-next.2 + - @backstage/plugin-azure-devops@0.3.11-next.2 + - @backstage/plugin-azure-sites@0.1.18-next.2 + - @backstage/plugin-badges@0.2.53-next.2 + - @backstage/plugin-cloudbuild@0.3.29-next.2 + - @backstage/plugin-code-coverage@0.2.22-next.2 + - @backstage/plugin-cost-insights@0.12.18-next.2 + - @backstage/plugin-dynatrace@8.0.3-next.2 + - @backstage/plugin-entity-feedback@0.2.12-next.2 + - @backstage/plugin-github-actions@0.6.10-next.2 + - @backstage/plugin-gocd@0.1.35-next.2 + - @backstage/plugin-jenkins@0.9.4-next.2 + - @backstage/plugin-kafka@0.3.29-next.2 + - @backstage/plugin-kubernetes@0.11.4-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.5-next.2 + - @backstage/plugin-lighthouse@0.4.14-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.4-next.2 + - @backstage/plugin-nomad@0.1.10-next.2 + - @backstage/plugin-playlist@0.2.3-next.2 + - @backstage/plugin-puppetdb@0.1.12-next.2 + - @backstage/plugin-rollbar@0.4.29-next.2 + - @backstage/plugin-sentry@0.5.14-next.2 + - @backstage/plugin-tech-insights@0.3.21-next.2 + - @backstage/plugin-todo@0.2.33-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4-next.1 + - @backstage/integration-react@1.1.23-next.0 + - @backstage/plugin-apache-airflow@0.2.19-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7-next.1 + - @backstage/plugin-devtools@0.1.8-next.1 + - @backstage/plugin-gcalendar@0.3.22-next.1 + - @backstage/plugin-gcp-projects@0.3.45-next.1 + - @backstage/plugin-microsoft-calendar@0.1.11-next.1 + - @backstage/plugin-newrelic@0.3.44-next.1 + - @backstage/plugin-shortcuts@0.3.18-next.1 + - @backstage/plugin-stackstorm@0.1.10-next.1 + +## example-app-next@0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/plugin-user-settings@0.8.0-next.2 + - @backstage/plugin-octopus-deploy@0.2.11-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/frontend-app-api@0.4.1-next.2 + - @backstage/plugin-home@0.6.1-next.2 + - @backstage/plugin-scaffolder-react@1.7.1-next.2 + - @backstage/plugin-scaffolder@1.17.1-next.2 + - @backstage/plugin-linguist@0.1.14-next.2 + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-catalog-import@0.10.5-next.2 + - @backstage/plugin-graphiql@0.3.2-next.2 + - @backstage/plugin-search@1.4.5-next.2 + - @backstage/plugin-tech-radar@0.6.12-next.2 + - @backstage/plugin-techdocs@1.9.3-next.2 + - app-next-example-plugin@0.0.5-next.2 + - @backstage/plugin-adr@0.6.12-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-explore@0.4.15-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/plugin-visualizer@0.0.2-next.2 + - @backstage/cli@0.25.1-next.1 + - @backstage/plugin-pagerduty@0.7.1-next.2 + - @backstage/plugin-api-docs@0.10.3-next.2 + - @backstage/plugin-catalog-graph@0.3.3-next.2 + - @backstage/plugin-org@0.6.19-next.2 + - @backstage/plugin-airbrake@0.3.29-next.2 + - @backstage/plugin-azure-devops@0.3.11-next.2 + - @backstage/plugin-azure-sites@0.1.18-next.2 + - @backstage/plugin-badges@0.2.53-next.2 + - @backstage/plugin-cloudbuild@0.3.29-next.2 + - @backstage/plugin-code-coverage@0.2.22-next.2 + - @backstage/plugin-cost-insights@0.12.18-next.2 + - @backstage/plugin-dynatrace@8.0.3-next.2 + - @backstage/plugin-entity-feedback@0.2.12-next.2 + - @backstage/plugin-github-actions@0.6.10-next.2 + - @backstage/plugin-gocd@0.1.35-next.2 + - @backstage/plugin-jenkins@0.9.4-next.2 + - @backstage/plugin-kafka@0.3.29-next.2 + - @backstage/plugin-kubernetes@0.11.4-next.2 + - @backstage/plugin-lighthouse@0.4.14-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.4-next.2 + - @backstage/plugin-playlist@0.2.3-next.2 + - @backstage/plugin-puppetdb@0.1.12-next.2 + - @backstage/plugin-rollbar@0.4.29-next.2 + - @backstage/plugin-sentry@0.5.14-next.2 + - @backstage/plugin-tech-insights@0.3.21-next.2 + - @backstage/plugin-todo@0.2.33-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4-next.1 + - @backstage/integration-react@1.1.23-next.0 + - @backstage/plugin-apache-airflow@0.2.19-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7-next.1 + - @backstage/plugin-devtools@0.1.8-next.1 + - @backstage/plugin-gcalendar@0.3.22-next.1 + - @backstage/plugin-gcp-projects@0.3.45-next.1 + - @backstage/plugin-microsoft-calendar@0.1.11-next.1 + - @backstage/plugin-newrelic@0.3.44-next.1 + - @backstage/plugin-shortcuts@0.3.18-next.1 + - @backstage/plugin-stackstorm@0.1.10-next.1 + +## app-next-example-plugin@0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + +## example-backend@0.2.91-next.2 + +### Patch Changes + +- Updated dependencies + - example-app@0.2.91-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-adr-backend@0.4.6-next.2 + - @backstage/plugin-app-backend@0.3.57-next.2 + - @backstage/plugin-auth-backend@0.20.3-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-azure-devops-backend@0.5.1-next.2 + - @backstage/plugin-badges-backend@0.3.6-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-code-coverage-backend@0.2.23-next.2 + - @backstage/plugin-devtools-backend@0.2.6-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.6-next.2 + - @backstage/plugin-events-backend@0.2.18-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/plugin-jenkins-backend@0.3.3-next.2 + - @backstage/plugin-kafka-backend@0.3.7-next.2 + - @backstage/plugin-kubernetes-backend@0.14.1-next.2 + - @backstage/plugin-lighthouse-backend@0.4.1-next.2 + - @backstage/plugin-linguist-backend@0.5.6-next.2 + - @backstage/plugin-nomad-backend@0.1.11-next.2 + - @backstage/plugin-permission-backend@0.5.32-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-playlist-backend@0.3.13-next.2 + - @backstage/plugin-proxy-backend@0.4.7-next.2 + - @backstage/plugin-scaffolder-backend@1.19.3-next.2 + - @backstage/plugin-search-backend@1.4.9-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.12-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.18-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/plugin-techdocs-backend@1.9.2-next.2 + - @backstage/plugin-todo-backend@0.3.7-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/plugin-azure-sites-backend@0.1.19-next.2 + - @backstage/plugin-explore-backend@0.0.19-next.2 + - @backstage/plugin-rollbar-backend@0.1.54-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.26-next.2 + - @backstage/plugin-tech-insights-backend@0.5.23-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41-next.2 + - @backstage/plugin-tech-insights-node@0.4.15-next.2 + +## example-backend-next@0.0.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-sonarqube-backend@0.2.11-next.2 + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-defaults@0.2.9-next.2 + - @backstage/plugin-adr-backend@0.4.6-next.2 + - @backstage/plugin-app-backend@0.3.57-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-azure-devops-backend@0.5.1-next.2 + - @backstage/plugin-badges-backend@0.3.6-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.2 + - @backstage/plugin-devtools-backend@0.2.6-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.6-next.2 + - @backstage/plugin-jenkins-backend@0.3.3-next.2 + - @backstage/plugin-kubernetes-backend@0.14.1-next.2 + - @backstage/plugin-lighthouse-backend@0.4.1-next.2 + - @backstage/plugin-linguist-backend@0.5.6-next.2 + - @backstage/plugin-nomad-backend@0.1.11-next.2 + - @backstage/plugin-permission-backend@0.5.32-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-playlist-backend@0.3.13-next.2 + - @backstage/plugin-proxy-backend@0.4.7-next.2 + - @backstage/plugin-scaffolder-backend@1.19.3-next.2 + - @backstage/plugin-search-backend@1.4.9-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/plugin-techdocs-backend@1.9.2-next.2 + - @backstage/plugin-todo-backend@0.3.7-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.2 + +## @backstage/backend-plugin-manager@0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-events-backend@0.2.18-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/cli-node@0.2.2-next.0 + +## e2e-test@0.2.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.9-next.2 + +## techdocs-cli-embedded-app@0.2.90-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-techdocs@1.9.3-next.2 + - @backstage/cli@0.25.1-next.1 + - @backstage/integration-react@1.1.23-next.0 + +## @internal/plugin-todo-list-backend@1.0.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## @backstage/plugin-visualizer@0.0.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 diff --git a/docs/releases/v1.22.0.md b/docs/releases/v1.22.0.md new file mode 100644 index 0000000000..e5ce345ccc --- /dev/null +++ b/docs/releases/v1.22.0.md @@ -0,0 +1,69 @@ +--- +id: v1.22.0 +title: v1.22.0 +description: Backstage Release v1.22.0 +--- + +These are the release notes for the v1.22.0 release of [Backstage](https://backstage.io/). + +A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done. + +## Highlights + +### Updates to new frontend system + +There have been several updates to alpha packages in the new frontend system including a breaking change where the `app/router` extension was renamed to `app/root`. Furthermore `elements`, `wrappers`, and `router` were added as inputs to `app/root` making it possible to pass extensions into the root of the app. + +### Plugins and modules migrated to the New Backend System + +Some more features have been migrated to the new backend system: + +- `@backstage/plugin-auth-backend-module-microsoft-provider` +- `@backstage/plugin-auth-backend-module-pinniped-provider` +- `@backstage/plugin-catalog-backend-module-openapi` +- `@backstage/plugin-events-backend-module-azure` +- `@backstage/plugin-events-backend-module-bitbucket-cloud` +- `@backstage/plugin-events-backend-module-gerrit` +- `@backstage/plugin-linguist` + +### New plugin: App Visualizer + +This release includes the new `@backstage/plugin-app-visualizer` package. This plugin for the new frontend system lets you browse and view the extension structure of your app as a graph, detailed list, or in text form. + +### New feature: Dynamic Feature Service + +This release includes the new `@backstage/backend-dynamic-feature-service` package. +It is a new and experimental service that lets you dynamically detect and load local plugins and modules in your Backstage instance. + +Contributed by [@davidfestal](https://github.com/davidfestal) in [#18862](https://github.com/backstage/backstage/pull/18862) + +### New Scaffolder action `gitlab:issues:create` + +You can now create GitHub issues in your scaffolder flows! Contributed by [@elaine-mattos](https://github.com/elaine-mattos) in [#21929](https://github.com/backstage/backstage/pull/21929) + +### New Scaffolder action `gitlab:repo:push` + +You can now push raw branches to GitLab in your scaffolder flows! Contributed by [@gavlyukovskiy](https://github.com/gavlyukovskiy) in [#21977](https://github.com/backstage/backstage/pull/21977) + +## Security Fixes + +This release does not contain any security fixes. + +However, some updates were made to the build facilities in the CLI and the caches in the backend system, such that you can now perform builds on FIPS compliant systems. This may lead to some internal cache invalidation happening, since the hashing algorithms used were updated. This should not pose a problem unless caches were being used as reliable persistent storage systems. Please let us know if you encounter any issues that may be related to this. + +## Upgrade path + +We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for [keeping Backstage updated](https://backstage.io/docs/getting-started/keeping-backstage-updated). + +## Links and References + +Below you can find a list of links and references to help you learn about and start using this new release. + +- [Backstage official website](https://backstage.io/), [documentation](https://backstage.io/docs/), and [getting started guide](https://backstage.io/docs/getting-started/) +- [GitHub repository](https://github.com/backstage/backstage) +- Backstage's [versioning and support policy](https://backstage.io/docs/overview/versioning-policy) +- [Community Discord](https://discord.gg/backstage-687207715902193673) for discussions and support +- [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.22.0-changelog.md) +- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) + +Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/tutorials/migrate-to-mui5.md b/docs/tutorials/migrate-to-mui5.md index 96129ceb8a..aaf8cff7f5 100644 --- a/docs/tutorials/migrate-to-mui5.md +++ b/docs/tutorials/migrate-to-mui5.md @@ -56,7 +56,7 @@ For current known issues with the Material UI v5 migration, follow our [Mileston To migrate your plugin to Material UI v5, you can build on the resources available. -1. Manually fix the imports from named to default imports to match the new [linting rules for minimizing bundle size](https://mui.com/material-ui/guides/minimizing-bundle-size). +1. Manually fix the imports from named to default imports to match the new [linting rules for minimizing bundle size](https://mui.com/material-ui/guides/minimizing-bundle-size). Note: you can use the [new `@backstage/no-top-level-material-ui-4-imports` ESLint](https://github.com/backstage/backstage/blob/master/packages/eslint-plugin/docs/rules/no-top-level-material-ui-4-imports.md) rule to help with this. 2. Run the migration `codemod` for the path of the specific plugin: `npx @mui/codemod v5.0.0/preset-safe plugins/`. 3. Take a look at possible `TODO:` items the `codemod` could not fix. 4. Remove types & methods from `@backstage/theme` which are marked as `@deprecated`. diff --git a/docs/tutorials/react18-migration.md b/docs/tutorials/react18-migration.md new file mode 100644 index 0000000000..2d3b3a961a --- /dev/null +++ b/docs/tutorials/react18-migration.md @@ -0,0 +1,117 @@ +--- +id: react18-migration +title: Migrating to React 18 +description: Additional resources for the Material UI v5 migration guide specifically for Backstage +--- + +The Backstage core libraries and plugins are compatible with all versions of React from v16.8 to v18. This means that you can migrate projects at your own pace. We do however encourage you to do so sooner rather than later, both to keep up with the evolving ecosystem, but also because React 18 brings performance improvements, in particular in tests. + +## Migration + +_Before diving in, this is a heads-up that for large projects this can be a tricky migration due to the fact that it is hard to break down into a gradual migration. In practice the difficult part of this migration is switching to the new version of the `@testing-library/react` package for tests, since there is no overlapping support across major React versions, more on that later._ + +### Switching to React 18 + +To switch a project to React 18, there are generally three changes that need to be made. + +1. Update the resolutions in your root `package.json` to the new versions of `@types/react` and `@types/react-dom`: + +```json title="package.json" + "resolutions": { + // highlight-remove-next-line + "@types/react": "^17", + // highlight-remove-next-line + "@types/react": "^17", + // highlight-add-next-line + "@types/react-dom": "^18", + // highlight-add-next-line + "@types/react-dom": "^18", + }, +``` + +2. Update the `react` and `react-dom` dependencies in your `packages/app/package.json` to the new versions: + +```json title="packages/app/package.json" + "dependencies": { + ... + // highlight-remove-next-line + "react": "^17.0.2", + // highlight-remove-next-line + "react-dom": "^17.0.2", + // highlight-add-next-line + "react": "^18.0.2", + // highlight-add-next-line + "react-dom": "^18.0.2", + ... + }, +``` + +3. Update `packages/app/src/index.tsx` to use the new `react-dom/client` API to render the app: + +```tsx title="packages/app/src/index.tsx" +import '@backstage/cli/asset-types'; +import React from 'react'; +// highlight-remove-next-line +import ReactDOM from 'react-dom'; +// highlight-add-next-line +import ReactDOM from 'react-dom/client'; +import App from './App'; + +// highlight-remove-next-line +ReactDOM.render(, document.getElementById('root')); +// highlight-add-next-line +ReactDOM.createRoot(document.getElementById('root')!).render(); +``` + +Once these steps are done you should be able to run your app and see it working as before, except now using React 18. + +### TypeScript Errors + +When upgrading to React 18 you are likely to see a fair number of TypeScript type errors. A summary of the breaking changes can be found in the [Pull Request that introduced them](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/56210). A codemod is also provided to help with the migration. + +Run `yarn tsc:full` to asses the damage. + +The good news is that these errors can be fixed while still staying on React 17. If you have a large number of errors to fix you can address as few or many is you like at a time and merge them into your main branch **without** the version bumps from step 1. This lets you gradually migrate the types in your project while not yet fully moving over to React 18. Once all type breakages are fixed you can move on to the next step of migrating tests. + +### Migrating Tests + +At this point the app hopefully works and you have no type errors, but if you run your tests you may see that a lot of them are failing. This is because the current version of the `@testing-library/react` package does not support React 18. Unfortunately the new version that we will be moving to does not support React 17, which is why we need to do this all at once. + +:::info +If migrating your entire project at once is not feasible, you can try to add `devDependencies` for `react` and `react-dom` v17 to individual plugins to be migrated later. This is not something we have tried ourselves in practice, so let us know in the community Discord if you attempt this and how it goes. +::: + +#### Dependency Upgrades + +To get the tests working again we need to update `@testing-library/react` to at least v13, although while at it is sensible to move at least all the way to v14 since the additional breaking changes have low impact. For more information on the changes in v13, see the [release notes](https://github.com/testing-library/react-testing-library/releases/tag/v13.0.0). + +In addition to bumping `@testing-library/react` you also need to remove the `@testing-library/react-hooks` package, since it is now included in `@testing-library/react` itself. You can find more information on this change in the `@testing-library/react-hooks` [README.md](https://github.com/testing-library/react-hooks-testing-library?tab=readme-ov-file#a-note-about-react-18-support). + +The following search-and-replace RegEx patterns may by helpful in updating your `package.json` files: + +Find: `"@testing-library/react": ".*"`
+Replace: `"@testing-library/react": "^14.0.0"` + +Find: `"@testing-library/react-hooks": ".*",?`
+Replace: `` + +#### Test Updates + +Once you have installed the new versions of the dependencies this turns into a fairly mechanical process of updating the tests. Use your own favorite method for this, running all tests once to find the breakages and then focusing on one test file at a time was fairly smooth. + +When updating the tests in the Backstage project we found the following patterns to be useful: + +- Many existing `act(...)` calls can be removed, it is built into most testing utilities like `waitFor`, `.findBy*`, and `@testing-library/user-event`. +- Use `.findBy*` to wait for elements to appear. +- Use `waitFor(...)` to wait for any other expected state changes or multiple elements. +- Use `@testing-library/user-event` for user interactions. +- The `renderHook` API has changes in several ways: + - It no longer returns `waitForValueToChange` or `waitForNextUpdate`, you'll likely want to use `waitFor` instead. + - It now throws errors rather than returns them as part of the result. + - It no longer forwards `initialProps` to the `wrapper`, a workaround for this is provided in the [docs](https://testing-library.com/docs/react-testing-library/api/#renderhook-options-initialprops). +- Waiting for mock functions to be called by a component and then expecting render state to be updated is no longer reliable. +- Rendered components often don't immediately update on user input, it's more common to need to use `waitFor` or other utilities to wait for the expected state to be reached. + +You can also refer to the test changes in this [PR](https://github.com/backstage/backstage/pull/20598/files?file-filters%5B%5D=.ts&file-filters%5B%5D=.tsx), which was the migration to React 18 for the Backstage project itself. + +Best of luck! For question please join the [community Discord](https://discord.gg/backstage-687207715902193673). If you think this documentation could be improved we welcome you to [open an issue](https://github.com/backstage/backstage/issues/new/choose) or submit a pull request. diff --git a/microsite/data/plugins/snyk-security.yaml b/microsite/data/plugins/snyk-security.yaml index 4abd068247..8c22d44510 100644 --- a/microsite/data/plugins/snyk-security.yaml +++ b/microsite/data/plugins/snyk-security.yaml @@ -5,6 +5,6 @@ authorUrl: https://snyk.io category: Security description: View Snyk scanned vulnerabilities and license compliance of your components directly in Backstage. documentation: https://github.com/snyk-tech-services/backstage-plugin-snyk/blob/main/README.md -iconUrl: https://storage.googleapis.com/snyk-technical-services.appspot.com/snyk-logo-vertical-black.png +iconUrl: https://github.com/snyk-tech-services/backstage-plugin-snyk/assets/109112986/95eb1b06-b3e8-4910-9233-11926e02fa18 npmPackageName: 'backstage-plugin-snyk' addedDate: '2021-01-22' diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js index 85ffacd39d..3d175fb892 100644 --- a/microsite/docusaurus.config.js +++ b/microsite/docusaurus.config.js @@ -182,7 +182,7 @@ module.exports = { position: 'left', }, { - to: 'docs/releases/v1.21.0', + to: 'docs/releases/v1.22.0', label: 'Releases', position: 'left', }, @@ -204,7 +204,10 @@ module.exports = { { items: [ { - html: '', + html: ` + + + `, }, ], }, diff --git a/microsite/package.json b/microsite/package.json index eb4d6bccb2..53309fb358 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -6,6 +6,7 @@ "scripts": { "start": "node scripts/pre-build.js && docusaurus start", "build": "node scripts/pre-build.js && docusaurus build", + "prettier:fix": "prettier --write .", "prettier:check": "prettier --check .", "publish-gh-pages": "docusaurus-publish", "write-translations": "docusaurus-write-translations", diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 5dd5ce93f8..187c41ad75 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -1,6 +1,7 @@ { "releases": { "Release Notes": [ + "releases/v1.22.0", "releases/v1.21.0", "releases/v1.20.0", "releases/v1.19.0", @@ -410,7 +411,11 @@ { "type": "category", "label": "Building Plugins", - "items": ["frontend-system/building-plugins/testing"] + "items": [ + "frontend-system/building-plugins/index", + "frontend-system/building-plugins/testing", + "frontend-system/building-plugins/extension-types" + ] }, { "type": "category", @@ -447,6 +452,7 @@ "tutorials/journey", "tutorials/quickstart-app-plugin", "tutorials/react-router-stable-migration", + "tutorials/react18-migration", "tutorials/package-role-migration", "tutorials/migrating-away-from-core", "tutorials/configuring-plugin-databases", diff --git a/microsite/src/pages/home/_home.tsx b/microsite/src/pages/home/_home.tsx index ddcfed7d03..5cf0f85072 100644 --- a/microsite/src/pages/home/_home.tsx +++ b/microsite/src/pages/home/_home.tsx @@ -95,10 +95,12 @@ const HomePage = () => { Illustration of a laptop Animated Backstage Logo diff --git a/microsite/src/pages/home/hubSpotNewAdoptersForm.module.scss b/microsite/src/pages/home/hubSpotNewAdoptersForm.module.scss index 77e1a87a53..9533890660 100644 --- a/microsite/src/pages/home/hubSpotNewAdoptersForm.module.scss +++ b/microsite/src/pages/home/hubSpotNewAdoptersForm.module.scss @@ -1,9 +1,13 @@ +$page-header-height: 44px; + .hubSpotNewAdopterFormContainer { top: 50%; right: 0; display: flex; position: fixed; transform: translateY(-50%); + margin-top: $page-header-height; + max-height: calc(100% - $page-header-height); transition: all 250ms ease-in-out; @@ -22,9 +26,7 @@ } .hubSpotNewAdopterFormContent { - height: 600px; max-width: 500px; - overflow-y: hidden; border-radius: 8px 0 0 8px; background-color: var(--ifm-color-white); diff --git a/microsite/src/pages/plugins/index.tsx b/microsite/src/pages/plugins/index.tsx index 006b7d4807..2abdbabf4b 100644 --- a/microsite/src/pages/plugins/index.tsx +++ b/microsite/src/pages/plugins/index.tsx @@ -151,6 +151,12 @@ const Plugins = () => { {showOtherPlugins && (

All Plugins

+

+ Friendly reminder: While we love the variety and contributions of + our open source plugins, they haven't been fully vetted by the + core Backstage team. We encourage you to exercise caution and do + your due diligence before installing. Happy exploring! +

{plugins.otherPlugins .filter( diff --git a/microsite/src/pages/plugins/plugins.module.scss b/microsite/src/pages/plugins/plugins.module.scss index 80ac60cf98..dbd0c62c75 100644 --- a/microsite/src/pages/plugins/plugins.module.scss +++ b/microsite/src/pages/plugins/plugins.module.scss @@ -78,6 +78,8 @@ :global(.dropdown) { float: right; margin-bottom: 1rem; + text-overflow: ellipsis; + white-space: nowrap; } :global(.button--info) { diff --git a/microsite/src/theme/customTheme.scss b/microsite/src/theme/customTheme.scss index f216762418..57e1f8828e 100644 --- a/microsite/src/theme/customTheme.scss +++ b/microsite/src/theme/customTheme.scss @@ -8,6 +8,14 @@ --ifm-color-primary-darkest: #268271; } +#__docusaurus { + .theme-doc-markdown { + a { + text-decoration: underline; + } + } +} + .footerLogo { background-image: url(/img/logo.svg); background-repeat: no-repeat; diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 7fb45745ca..a2489da001 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -2701,90 +2701,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-darwin-arm64@npm:1.3.102" +"@swc/core-darwin-arm64@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-darwin-arm64@npm:1.3.104" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-darwin-x64@npm:1.3.102" +"@swc/core-darwin-x64@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-darwin-x64@npm:1.3.104" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.102" +"@swc/core-linux-arm-gnueabihf@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.104" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.102" +"@swc/core-linux-arm64-gnu@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.104" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.102" +"@swc/core-linux-arm64-musl@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.104" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.102" +"@swc/core-linux-x64-gnu@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.104" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-x64-musl@npm:1.3.102" +"@swc/core-linux-x64-musl@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-x64-musl@npm:1.3.104" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.102" +"@swc/core-win32-arm64-msvc@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.104" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.102" +"@swc/core-win32-ia32-msvc@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.104" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.102" +"@swc/core-win32-x64-msvc@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.104" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.3.102 - resolution: "@swc/core@npm:1.3.102" + version: 1.3.104 + resolution: "@swc/core@npm:1.3.104" dependencies: - "@swc/core-darwin-arm64": 1.3.102 - "@swc/core-darwin-x64": 1.3.102 - "@swc/core-linux-arm-gnueabihf": 1.3.102 - "@swc/core-linux-arm64-gnu": 1.3.102 - "@swc/core-linux-arm64-musl": 1.3.102 - "@swc/core-linux-x64-gnu": 1.3.102 - "@swc/core-linux-x64-musl": 1.3.102 - "@swc/core-win32-arm64-msvc": 1.3.102 - "@swc/core-win32-ia32-msvc": 1.3.102 - "@swc/core-win32-x64-msvc": 1.3.102 + "@swc/core-darwin-arm64": 1.3.104 + "@swc/core-darwin-x64": 1.3.104 + "@swc/core-linux-arm-gnueabihf": 1.3.104 + "@swc/core-linux-arm64-gnu": 1.3.104 + "@swc/core-linux-arm64-musl": 1.3.104 + "@swc/core-linux-x64-gnu": 1.3.104 + "@swc/core-linux-x64-musl": 1.3.104 + "@swc/core-win32-arm64-msvc": 1.3.104 + "@swc/core-win32-ia32-msvc": 1.3.104 + "@swc/core-win32-x64-msvc": 1.3.104 "@swc/counter": ^0.1.1 "@swc/types": ^0.1.5 peerDependencies: @@ -2813,7 +2813,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 45c0edb06f87a811e28fb3ed587fbe6b7ca67ff2440fe15666d43729788903a4af61e3b57842aecc0b2b70e3c9981b698d8233746ba94dfb5a19e1c62eea33ad + checksum: 95fbf1412c8685d311cf2d7efbfa43e082d2d9e84ece48c4d8d96d6c67c5923569bfb26352451eb3e4d98adcb556dcfac65271c0fba77f078bb755fe2f64b295 languageName: node linkType: hard @@ -4383,9 +4383,9 @@ __metadata: linkType: hard "clsx@npm:^2.0.0": - version: 2.0.0 - resolution: "clsx@npm:2.0.0" - checksum: a2cfb2351b254611acf92faa0daf15220f4cd648bdf96ce369d729813b85336993871a4bf6978ddea2b81b5a130478339c20d9d0b5c6fc287e5147f0c059276e + version: 2.1.0 + resolution: "clsx@npm:2.1.0" + checksum: 43fefc29b6b49c9476fbce4f8b1cc75c27b67747738e598e6651dd40d63692135dc60b18fa1c5b78a2a9ba8ae6fd2055a068924b94e20b42039bd53b78b98e1d languageName: node linkType: hard @@ -5874,12 +5874,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.9": - version: 1.15.2 - resolution: "follow-redirects@npm:1.15.2" + version: 1.15.4 + resolution: "follow-redirects@npm:1.15.4" peerDependenciesMeta: debug: optional: true - checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 + checksum: e178d1deff8b23d5d24ec3f7a94cde6e47d74d0dc649c35fc9857041267c12ec5d44650a0c5597ef83056ada9ea6ca0c30e7c4f97dbf07d035086be9e6a5b7b6 languageName: node linkType: hard @@ -10817,15 +10817,15 @@ __metadata: linkType: hard "sass@npm:^1.57.1": - version: 1.69.7 - resolution: "sass@npm:1.69.7" + version: 1.70.0 + resolution: "sass@npm:1.70.0" dependencies: chokidar: ">=3.0.0 <4.0.0" immutable: ^4.0.0 source-map-js: ">=0.6.2 <2.0.0" bin: sass: sass.js - checksum: c67cd32b69fb26a50e4535353e4145de8cbc8187db07c467cc335157fd56d03cae98754f86efe43b880b29f20c0a168ab972c7f74ebfe234e2bd2dfb868890cb + checksum: fd1b622cf9b7fa699a03ec634611997552ece45eb98ac365fef22f42bdcb8ed63b326b64173379c966830c8551ae801e44e4a00d2de16fdadda2dc8f35400bbb languageName: node linkType: hard diff --git a/package.json b/package.json index 35f58dd467..483e02fdb5 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,11 @@ }, "scripts": { "dev": "concurrently 'yarn start' 'yarn start-backend'", + "dev:next": "concurrently 'yarn start:next' 'yarn start-backend:next'", "start": "yarn workspace example-app start", "start-backend": "yarn workspace example-backend start", + "start:next": "yarn workspace example-app-next start", + "start-backend:next": "yarn workspace example-backend-next start", "build:backend": "yarn workspace example-backend build", "build:all": "backstage-cli repo build --all", "build:api-reports": "yarn build:api-reports:only --tsc", @@ -53,7 +56,7 @@ "@material-ui/pickers@^3.3.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch", "@material-ui/pickers@^3.2.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch" }, - "version": "1.22.0-next.1", + "version": "1.22.0", "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 443c5fe4c6..5f815f4b0e 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/app-defaults +## 1.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + ## 1.4.7-next.1 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 8634a73d47..bf7b56f8c2 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.7-next.1", + "version": "1.4.7", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app-next-example-plugin/CHANGELOG.md b/packages/app-next-example-plugin/CHANGELOG.md index 2dc7ea82ee..6f0545a801 100644 --- a/packages/app-next-example-plugin/CHANGELOG.md +++ b/packages/app-next-example-plugin/CHANGELOG.md @@ -1,5 +1,20 @@ # app-next-example-plugin +## 0.0.5 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + +## 0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + ## 0.0.5-next.1 ### Patch Changes diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index 31ba60cc78..c7669d93cb 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-next-example-plugin/package.json @@ -1,7 +1,7 @@ { "name": "app-next-example-plugin", "description": "Backstage internal example plugin", - "version": "0.0.5-next.1", + "version": "0.0.5", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index 01536945cb..6272ef11df 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,146 @@ # example-app-next +## 0.0.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.10.3 + - @backstage/core-compat-api@0.1.1 + - @backstage/plugin-scaffolder-react@1.7.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/plugin-user-settings@0.8.0 + - @backstage/plugin-azure-sites@0.1.18 + - @backstage/cli@0.25.1 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-octopus-deploy@0.2.11 + - @backstage/frontend-app-api@0.5.0 + - @backstage/plugin-kubernetes@0.11.4 + - @backstage/plugin-home@0.6.1 + - @backstage/plugin-scaffolder@1.17.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7 + - @backstage/plugin-microsoft-calendar@0.1.11 + - @backstage/plugin-newrelic-dashboard@0.3.4 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-entity-feedback@0.2.12 + - @backstage/plugin-apache-airflow@0.2.19 + - @backstage/plugin-github-actions@0.6.10 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-catalog-graph@0.3.3 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-code-coverage@0.2.22 + - @backstage/plugin-cost-insights@0.12.18 + - @backstage/plugin-tech-insights@0.3.21 + - @backstage/plugin-azure-devops@0.3.11 + - @backstage/plugin-gcp-projects@0.3.45 + - @backstage/plugin-cloudbuild@0.3.29 + - @backstage/plugin-lighthouse@0.4.14 + - @backstage/plugin-stackstorm@0.1.10 + - @backstage/plugin-tech-radar@0.6.12 + - @backstage/plugin-dynatrace@8.0.3 + - @backstage/plugin-gcalendar@0.3.22 + - @backstage/plugin-pagerduty@0.7.1 + - @backstage/plugin-shortcuts@0.3.18 + - @backstage/plugin-airbrake@0.3.29 + - @backstage/plugin-devtools@0.1.8 + - @backstage/plugin-graphiql@0.3.2 + - @backstage/plugin-linguist@0.1.14 + - @backstage/plugin-newrelic@0.3.44 + - @backstage/plugin-playlist@0.2.3 + - @backstage/plugin-puppetdb@0.1.12 + - @backstage/plugin-techdocs@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/plugin-explore@0.4.15 + - @backstage/plugin-jenkins@0.9.4 + - @backstage/plugin-rollbar@0.4.29 + - @backstage/plugin-badges@0.2.53 + - @backstage/plugin-search@1.4.5 + - @backstage/plugin-sentry@0.5.14 + - @backstage/plugin-kafka@0.3.29 + - @backstage/plugin-gocd@0.1.35 + - @backstage/plugin-todo@0.2.33 + - @backstage/plugin-adr@0.6.12 + - @backstage/plugin-org@0.6.19 + - @backstage/plugin-app-visualizer@0.1.0 + - @backstage/plugin-catalog-import@0.10.5 + - app-next-example-plugin@0.0.5 + - @backstage/plugin-search-react@1.7.5 + - @backstage/app-defaults@1.4.7 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.10 + +## 0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/plugin-user-settings@0.8.0-next.2 + - @backstage/plugin-octopus-deploy@0.2.11-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/frontend-app-api@0.4.1-next.2 + - @backstage/plugin-home@0.6.1-next.2 + - @backstage/plugin-scaffolder-react@1.7.1-next.2 + - @backstage/plugin-scaffolder@1.17.1-next.2 + - @backstage/plugin-linguist@0.1.14-next.2 + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-catalog-import@0.10.5-next.2 + - @backstage/plugin-graphiql@0.3.2-next.2 + - @backstage/plugin-search@1.4.5-next.2 + - @backstage/plugin-tech-radar@0.6.12-next.2 + - @backstage/plugin-techdocs@1.9.3-next.2 + - app-next-example-plugin@0.0.5-next.2 + - @backstage/plugin-adr@0.6.12-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-explore@0.4.15-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/plugin-visualizer@0.0.2-next.2 + - @backstage/cli@0.25.1-next.1 + - @backstage/plugin-pagerduty@0.7.1-next.2 + - @backstage/plugin-api-docs@0.10.3-next.2 + - @backstage/plugin-catalog-graph@0.3.3-next.2 + - @backstage/plugin-org@0.6.19-next.2 + - @backstage/plugin-airbrake@0.3.29-next.2 + - @backstage/plugin-azure-devops@0.3.11-next.2 + - @backstage/plugin-azure-sites@0.1.18-next.2 + - @backstage/plugin-badges@0.2.53-next.2 + - @backstage/plugin-cloudbuild@0.3.29-next.2 + - @backstage/plugin-code-coverage@0.2.22-next.2 + - @backstage/plugin-cost-insights@0.12.18-next.2 + - @backstage/plugin-dynatrace@8.0.3-next.2 + - @backstage/plugin-entity-feedback@0.2.12-next.2 + - @backstage/plugin-github-actions@0.6.10-next.2 + - @backstage/plugin-gocd@0.1.35-next.2 + - @backstage/plugin-jenkins@0.9.4-next.2 + - @backstage/plugin-kafka@0.3.29-next.2 + - @backstage/plugin-kubernetes@0.11.4-next.2 + - @backstage/plugin-lighthouse@0.4.14-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.4-next.2 + - @backstage/plugin-playlist@0.2.3-next.2 + - @backstage/plugin-puppetdb@0.1.12-next.2 + - @backstage/plugin-rollbar@0.4.29-next.2 + - @backstage/plugin-sentry@0.5.14-next.2 + - @backstage/plugin-tech-insights@0.3.21-next.2 + - @backstage/plugin-todo@0.2.33-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4-next.1 + - @backstage/integration-react@1.1.23-next.0 + - @backstage/plugin-apache-airflow@0.2.19-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7-next.1 + - @backstage/plugin-devtools@0.1.8-next.1 + - @backstage/plugin-gcalendar@0.3.22-next.1 + - @backstage/plugin-gcp-projects@0.3.45-next.1 + - @backstage/plugin-microsoft-calendar@0.1.11-next.1 + - @backstage/plugin-newrelic@0.3.44-next.1 + - @backstage/plugin-shortcuts@0.3.18-next.1 + - @backstage/plugin-stackstorm@0.1.10-next.1 + ## 0.0.5-next.1 ### Patch Changes diff --git a/packages/app-next/app-config.yaml b/packages/app-next/app-config.yaml index 77f4284455..1b77205d5e 100644 --- a/packages/app-next/app-config.yaml +++ b/packages/app-next/app-config.yaml @@ -5,6 +5,7 @@ app: bindings: plugin.pages.externalRoutes.pageX: plugin.pages.routes.pageX plugin.catalog.externalRoutes.viewTechDoc: plugin.techdocs.routes.docRoot + plugin.catalog.externalRoutes.createComponent: plugin.catalog-import.routes.importPage extensions: # - apis.plugin.graphiql.browse.gitlab: true diff --git a/packages/app-next/package.json b/packages/app-next/package.json index c19b9c71cb..c51631aaa3 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.5-next.1", + "version": "0.0.5", "private": true, "backstage": { "role": "frontend" @@ -21,6 +21,7 @@ "@backstage/plugin-airbrake": "workspace:^", "@backstage/plugin-apache-airflow": "workspace:^", "@backstage/plugin-api-docs": "workspace:^", + "@backstage/plugin-app-visualizer": "workspace:^", "@backstage/plugin-azure-devops": "workspace:^", "@backstage/plugin-azure-sites": "workspace:^", "@backstage/plugin-badges": "workspace:^", @@ -74,7 +75,6 @@ "@backstage/plugin-techdocs-react": "workspace:^", "@backstage/plugin-todo": "workspace:^", "@backstage/plugin-user-settings": "workspace:^", - "@backstage/plugin-visualizer": "workspace:^", "@backstage/theme": "workspace:^", "@circleci/backstage-plugin": "^0.1.1", "@material-ui/core": "^4.12.2", diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index 747576533a..ec333ce38f 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -32,7 +32,7 @@ import { createExtensionOverrides, } from '@backstage/frontend-plugin-api'; import techdocsPlugin from '@backstage/plugin-techdocs/alpha'; -import appVisualizerPlugin from '@backstage/plugin-visualizer'; +import appVisualizerPlugin from '@backstage/plugin-app-visualizer'; import { homePage } from './HomePage'; import { convertLegacyApp } from '@backstage/core-compat-api'; import { FlatRoutes } from '@backstage/core-app-api'; diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 1f554fae68..6cf62774c1 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,145 @@ # example-app +## 0.2.91 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.10.3 + - @backstage/plugin-scaffolder-react@1.7.1 + - @backstage/core-components@0.13.10 + - @backstage/plugin-user-settings@0.8.0 + - @backstage/plugin-azure-sites@0.1.18 + - @backstage/cli@0.25.1 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-octopus-deploy@0.2.11 + - @backstage/frontend-app-api@0.5.0 + - @backstage/plugin-kubernetes@0.11.4 + - @backstage/plugin-home@0.6.1 + - @backstage/plugin-scaffolder@1.17.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7 + - @backstage/plugin-kubernetes-cluster@0.0.5 + - @backstage/plugin-microsoft-calendar@0.1.11 + - @backstage/plugin-newrelic-dashboard@0.3.4 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-entity-feedback@0.2.12 + - @backstage/plugin-apache-airflow@0.2.19 + - @backstage/plugin-github-actions@0.6.10 + - @backstage/plugin-stack-overflow@0.1.24 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-catalog-graph@0.3.3 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-code-coverage@0.2.22 + - @backstage/plugin-cost-insights@0.12.18 + - @backstage/plugin-tech-insights@0.3.21 + - @backstage/plugin-azure-devops@0.3.11 + - @backstage/plugin-gcp-projects@0.3.45 + - @backstage/plugin-cloudbuild@0.3.29 + - @backstage/plugin-lighthouse@0.4.14 + - @backstage/plugin-stackstorm@0.1.10 + - @backstage/plugin-tech-radar@0.6.12 + - @backstage/plugin-dynatrace@8.0.3 + - @backstage/plugin-gcalendar@0.3.22 + - @backstage/plugin-pagerduty@0.7.1 + - @backstage/plugin-shortcuts@0.3.18 + - @backstage/plugin-airbrake@0.3.29 + - @backstage/plugin-devtools@0.1.8 + - @backstage/plugin-graphiql@0.3.2 + - @backstage/plugin-linguist@0.1.14 + - @backstage/plugin-newrelic@0.3.44 + - @backstage/plugin-playlist@0.2.3 + - @backstage/plugin-puppetdb@0.1.12 + - @backstage/plugin-techdocs@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/plugin-explore@0.4.15 + - @backstage/plugin-jenkins@0.9.4 + - @backstage/plugin-rollbar@0.4.29 + - @backstage/plugin-badges@0.2.53 + - @backstage/plugin-search@1.4.5 + - @backstage/plugin-sentry@0.5.14 + - @backstage/plugin-kafka@0.3.29 + - @backstage/plugin-nomad@0.1.10 + - @backstage/plugin-gocd@0.1.35 + - @backstage/plugin-todo@0.2.33 + - @backstage/plugin-adr@0.6.12 + - @backstage/plugin-org@0.6.19 + - @backstage/plugin-catalog-import@0.10.5 + - @backstage/plugin-search-react@1.7.5 + - @backstage/app-defaults@1.4.7 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.91-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-user-settings@0.8.0-next.2 + - @backstage/plugin-octopus-deploy@0.2.11-next.2 + - @backstage/frontend-app-api@0.4.1-next.2 + - @backstage/plugin-home@0.6.1-next.2 + - @backstage/plugin-scaffolder-react@1.7.1-next.2 + - @backstage/plugin-scaffolder@1.17.1-next.2 + - @backstage/plugin-linguist@0.1.14-next.2 + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-catalog-import@0.10.5-next.2 + - @backstage/plugin-graphiql@0.3.2-next.2 + - @backstage/plugin-search@1.4.5-next.2 + - @backstage/plugin-tech-radar@0.6.12-next.2 + - @backstage/plugin-techdocs@1.9.3-next.2 + - @backstage/plugin-adr@0.6.12-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-explore@0.4.15-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/plugin-stack-overflow@0.1.24-next.2 + - @backstage/cli@0.25.1-next.1 + - @backstage/plugin-pagerduty@0.7.1-next.2 + - @backstage/plugin-api-docs@0.10.3-next.2 + - @backstage/plugin-catalog-graph@0.3.3-next.2 + - @backstage/plugin-org@0.6.19-next.2 + - @backstage/plugin-airbrake@0.3.29-next.2 + - @backstage/plugin-azure-devops@0.3.11-next.2 + - @backstage/plugin-azure-sites@0.1.18-next.2 + - @backstage/plugin-badges@0.2.53-next.2 + - @backstage/plugin-cloudbuild@0.3.29-next.2 + - @backstage/plugin-code-coverage@0.2.22-next.2 + - @backstage/plugin-cost-insights@0.12.18-next.2 + - @backstage/plugin-dynatrace@8.0.3-next.2 + - @backstage/plugin-entity-feedback@0.2.12-next.2 + - @backstage/plugin-github-actions@0.6.10-next.2 + - @backstage/plugin-gocd@0.1.35-next.2 + - @backstage/plugin-jenkins@0.9.4-next.2 + - @backstage/plugin-kafka@0.3.29-next.2 + - @backstage/plugin-kubernetes@0.11.4-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.5-next.2 + - @backstage/plugin-lighthouse@0.4.14-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.4-next.2 + - @backstage/plugin-nomad@0.1.10-next.2 + - @backstage/plugin-playlist@0.2.3-next.2 + - @backstage/plugin-puppetdb@0.1.12-next.2 + - @backstage/plugin-rollbar@0.4.29-next.2 + - @backstage/plugin-sentry@0.5.14-next.2 + - @backstage/plugin-tech-insights@0.3.21-next.2 + - @backstage/plugin-todo@0.2.33-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4-next.1 + - @backstage/integration-react@1.1.23-next.0 + - @backstage/plugin-apache-airflow@0.2.19-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7-next.1 + - @backstage/plugin-devtools@0.1.8-next.1 + - @backstage/plugin-gcalendar@0.3.22-next.1 + - @backstage/plugin-gcp-projects@0.3.45-next.1 + - @backstage/plugin-microsoft-calendar@0.1.11-next.1 + - @backstage/plugin-newrelic@0.3.44-next.1 + - @backstage/plugin-shortcuts@0.3.18-next.1 + - @backstage/plugin-stackstorm@0.1.10-next.1 + ## 0.2.91-next.1 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 7c0cfd4dae..bf2bf74c4c 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.91-next.1", + "version": "0.2.91", "private": true, "backstage": { "role": "frontend" @@ -73,6 +73,7 @@ "@backstage/plugin-search-react": "workspace:^", "@backstage/plugin-sentry": "workspace:^", "@backstage/plugin-shortcuts": "workspace:^", + "@backstage/plugin-signals": "workspace:^", "@backstage/plugin-stack-overflow": "workspace:^", "@backstage/plugin-stackstorm": "workspace:^", "@backstage/plugin-tech-insights": "workspace:^", @@ -102,7 +103,7 @@ "react-use": "^17.2.4", "vite": "^4.4.9", "vite-plugin-html": "^3.2.0", - "vite-plugin-node-polyfills": "^0.17.0", + "vite-plugin-node-polyfills": "^0.19.0", "zen-observable": "^0.10.0" }, "devDependencies": { diff --git a/packages/app/src/App.test.tsx b/packages/app/src/App.test.tsx index 8c7cefeb2c..919a60e53d 100644 --- a/packages/app/src/App.test.tsx +++ b/packages/app/src/App.test.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { renderWithEffects } from '@backstage/test-utils'; +import { render, waitFor } from '@testing-library/react'; import App from './App'; describe('App', () => { @@ -42,7 +42,10 @@ describe('App', () => { ] as any, }; - const rendered = await renderWithEffects(); - expect(rendered.baseElement).toBeInTheDocument(); + const rendered = render(); + + await waitFor(() => { + expect(rendered.baseElement).toBeInTheDocument(); + }); }); }); diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index c2296d01e7..d2dde95f68 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -31,7 +31,6 @@ import { AppRouter, ConfigReader, defaultConfigLoader, - FeatureFlagged, FlatRoutes, } from '@backstage/core-app-api'; import { @@ -64,7 +63,6 @@ import { GcpProjectsPage } from '@backstage/plugin-gcp-projects'; import { HomepageCompositionRoot, VisitListener } from '@backstage/plugin-home'; import { LighthousePage } from '@backstage/plugin-lighthouse'; import { NewRelicPage } from '@backstage/plugin-newrelic'; -import { LegacyScaffolderPage } from '@backstage/plugin-scaffolder/alpha'; import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder'; import { ScaffolderFieldExtensions, @@ -96,10 +94,7 @@ import { apis } from './apis'; import { entityPage } from './components/catalog/EntityPage'; import { homePage } from './components/home/HomePage'; import { Root } from './components/Root'; -import { - DelayingComponentFieldExtension, - LowerCaseValuePickerFieldExtension, -} from './components/scaffolder/customScaffolderExtensions'; +import { DelayingComponentFieldExtension } from './components/scaffolder/customScaffolderExtensions'; import { defaultPreviewTemplate } from './components/scaffolder/defaultPreviewTemplate'; import { searchPage } from './components/search/SearchPage'; import { providers } from './identityProviders'; @@ -236,53 +231,28 @@ const routes = ( - - - entity?.metadata?.tags?.includes('recommended') ?? false, - }, - ]} - /> - } - > - - - - - - - - - - - entity?.metadata?.tags?.includes('recommended') ?? false, - }, - ]} - /> - } - > - - - - - - - - + + entity?.metadata?.tags?.includes('recommended') ?? false, + }, + ]} + /> + } + > + + + + + + + } /> { })(), ); await expect(init.start()).rejects.toThrow( - "Extension point registered for plugin 'test-a' may not be used by module for plugin 'test-b'", + "Illegal dependency: Module 'mod' for plugin 'test-b' attempted to depend on extension point 'a' for plugin 'test-a'. Extension points can only be used within their plugin's scope.", ); }); }); diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 4969f82176..2da3a5a226 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -55,6 +55,7 @@ export class BackendInitializer { async #getInitDeps( deps: { [name: string]: ServiceOrExtensionPoint }, pluginId: string, + moduleId?: string, ) { const result = new Map(); const missingRefs = new Set(); @@ -64,7 +65,7 @@ export class BackendInitializer { if (ep) { if (ep.pluginId !== pluginId) { throw new Error( - `Extension point registered for plugin '${ep.pluginId}' may not be used by module for plugin '${pluginId}'`, + `Illegal dependency: Module '${moduleId}' for plugin '${pluginId}' attempted to depend on extension point '${ref.id}' for plugin '${ep.pluginId}'. Extension points can only be used within their plugin's scope.`, ); } result.set(name, ep.impl); @@ -260,6 +261,7 @@ export class BackendInitializer { const moduleDeps = await this.#getInitDeps( moduleInit.init.deps, pluginId, + moduleId, ); await moduleInit.init.func(moduleDeps).catch(error => { throw new ForwardedError( diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index 9562f887fa..de955b7ca1 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/backend-common +## 0.20.1 + +### Patch Changes + +- 3b24eae: Adding support for removing file from git index +- 454d17c: Do not call fetch directly but rather use `fetchResponse` facility +- b6b15b2: Use sha256 instead of md5 for hash key calculation in caches + + This can have a side effect of invalidating caches (when cache key was >250 characters) + This improves compliance with FIPS nodejs + +- Updated dependencies + - @backstage/config-loader@1.6.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-dev-utils@0.1.3 + - @backstage/backend-app-api@0.5.10 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/integration-aws-node@0.1.8 + - @backstage/types@1.1.1 + +## 0.20.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-dev-utils@0.1.3-next.0 + - @backstage/backend-app-api@0.5.10-next.2 + - @backstage/config-loader@1.6.1-next.0 + ## 0.20.1-next.1 ### Patch Changes diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index e7d89c2aa5..e4a1ecfdf1 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -276,6 +276,12 @@ export class DockerContainerRunner implements ContainerRunner { runContainer(options: RunContainerOptions): Promise; } +// @public +export function dropDatabase( + dbConfig: Config, + ...databases: Array +): Promise; + // @public export function ensureDatabaseExists( dbConfig: Config, @@ -417,6 +423,7 @@ export class Git { force?: boolean; }): Promise; readCommit(options: { dir: string; sha: string }): Promise; + remove(options: { dir: string; filepath: string }): Promise; resolveRef(options: { dir: string; ref: string }): Promise; } diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 72e011f7e2..3d746044b0 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.20.1-next.1", + "version": "0.20.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/src/database/connection.test.ts b/packages/backend-common/src/database/connection.test.ts index caf2fccc30..3028d46cae 100644 --- a/packages/backend-common/src/database/connection.test.ts +++ b/packages/backend-common/src/database/connection.test.ts @@ -19,10 +19,11 @@ import { createDatabaseClient, createNameOverride, createSchemaOverride, + dropDatabase, ensureSchemaExists, parseConnectionString, } from './connection'; -import { pgConnector } from './connectors'; +import { mysqlConnector, pgConnector } from './connectors'; const mocked = (f: Function) => f as jest.Mock; @@ -30,8 +31,13 @@ jest.mock('./connectors', () => { const connectors = jest.requireActual('./connectors'); return { ...connectors, + mysqlConnector: { + ...connectors.mysqlConnector, + dropDatabase: jest.fn(), + }, pgConnector: { ...connectors.pgConnector, + dropDatabase: jest.fn(), ensureSchemaExists: jest.fn(), }, }; @@ -229,4 +235,74 @@ describe('database connection', () => { ).resolves.toBeUndefined(); }); }); + + describe('dropDatabase', () => { + it('returns successfully with pg client', async () => { + await dropDatabase( + new ConfigReader({ + client: 'pg', + schema: 'catalog', + connection: 'postgresql://testuser:testpass@acme:5432/userdbname', + }), + 'backstage_plugin_foobar', + ); + + const mockCalls = mocked( + pgConnector.dropDatabase as Function, + ).mock.calls.splice(-1); + const [baseConfig, databaseName] = mockCalls[0]; + + expect(baseConfig.get()).toMatchObject({ + client: 'pg', + connection: 'postgresql://testuser:testpass@acme:5432/userdbname', + }); + + expect(databaseName).toEqual('backstage_plugin_foobar'); + }); + + it('returns successfully with mysql client', async () => { + await dropDatabase( + new ConfigReader({ + client: 'mysql2', + connection: { + host: '127.0.0.1', + user: 'foo', + password: 'bar', + database: 'dbname', + }, + }), + 'backstage_plugin_foobar', + ); + + const mockCalls = mocked( + mysqlConnector.dropDatabase as Function, + ).mock.calls.splice(-1); + const [baseConfig, databaseName] = mockCalls[0]; + + expect(baseConfig.get()).toMatchObject({ + client: 'mysql2', + connection: { + host: '127.0.0.1', + user: 'foo', + password: 'bar', + database: 'dbname', + }, + }); + + expect(databaseName).toEqual('backstage_plugin_foobar'); + }); + + it('does nothing in other database drivers', () => { + return expect( + dropDatabase( + new ConfigReader({ + client: 'better-sqlite3', + schema: 'catalog', + connection: ':memory:', + }), + 'catalog', + ), + ).resolves.toBeUndefined(); + }); + }); }); diff --git a/packages/backend-common/src/database/connection.ts b/packages/backend-common/src/database/connection.ts index e369323e04..c0e031516f 100644 --- a/packages/backend-common/src/database/connection.ts +++ b/packages/backend-common/src/database/connection.ts @@ -95,6 +95,22 @@ export async function ensureDatabaseExists( ); } +/** + * Drops the given databases. + * + * @public + */ +export async function dropDatabase( + dbConfig: Config, + ...databases: Array +): Promise { + const client: DatabaseClient = dbConfig.getString('client'); + + return await ddlLimiter(() => + ConnectorMapping[client]?.dropDatabase?.(dbConfig, ...databases), + ); +} + /** * Ensures that the given schemas all exist, creating them if they do not. * diff --git a/packages/backend-common/src/database/connectors/mysql.ts b/packages/backend-common/src/database/connectors/mysql.ts index 16610dd920..a4bac3f7e1 100644 --- a/packages/backend-common/src/database/connectors/mysql.ts +++ b/packages/backend-common/src/database/connectors/mysql.ts @@ -183,6 +183,40 @@ export async function ensureMysqlDatabaseExists( } } +/** + * Drops the given mysql databases. + * + * @param dbConfig - The database config + * @param databases - The names of the databases to create + */ +export async function dropMysqlDatabase( + dbConfig: Config, + ...databases: Array +) { + const admin = createMysqlDatabaseClient(dbConfig, { + connection: { + database: null as unknown as string, + }, + pool: { + min: 0, + acquireTimeoutMillis: 10000, + }, + }); + + try { + const dropDatabase = async (database: string) => { + await admin.raw(`DROP DATABASE ??`, [database]); + }; + await Promise.all( + databases.map(async database => { + return await dropDatabase(database); + }), + ); + } finally { + await admin.destroy(); + } +} + /** * MySQL database connector. * @@ -193,4 +227,5 @@ export const mysqlConnector: DatabaseConnector = Object.freeze({ ensureDatabaseExists: ensureMysqlDatabaseExists, createNameOverride: defaultNameOverride, parseConnectionString: parseMysqlConnectionString, + dropDatabase: dropMysqlDatabase, }); diff --git a/packages/backend-common/src/database/connectors/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts index f132488e29..dc9b19f6ad 100644 --- a/packages/backend-common/src/database/connectors/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -199,6 +199,24 @@ export async function ensurePgSchemaExists( } } +/** + * Drops the Postgres databases. + * + * @param dbConfig - The database config + * @param databases - The name of the databases to drop + */ +export async function dropPgDatabase( + dbConfig: Config, + ...databases: Array +) { + const admin = createPgDatabaseClient(dbConfig); + await Promise.all( + databases.map(async database => { + await admin.raw(`DROP DATABASE ??`, [database]); + }), + ); +} + /** * PostgreSQL database connector. * @@ -211,4 +229,5 @@ export const pgConnector: DatabaseConnector = Object.freeze({ createNameOverride: defaultNameOverride, createSchemaOverride: defaultSchemaOverride, parseConnectionString: parsePgConnectionString, + dropDatabase: dropPgDatabase, }); diff --git a/packages/backend-common/src/database/index.ts b/packages/backend-common/src/database/index.ts index 0dde1ec239..330429f0ef 100644 --- a/packages/backend-common/src/database/index.ts +++ b/packages/backend-common/src/database/index.ts @@ -20,7 +20,11 @@ export * from './DatabaseManager'; * Undocumented API surface from connection is being reduced for future deprecation. * Avoid exporting additional symbols. */ -export { createDatabaseClient, ensureDatabaseExists } from './connection'; +export { + createDatabaseClient, + ensureDatabaseExists, + dropDatabase, +} from './connection'; export type { PluginDatabaseManager } from './types'; export { isDatabaseConflictError } from './util'; diff --git a/packages/backend-common/src/database/types.ts b/packages/backend-common/src/database/types.ts index 621bcc676b..3e9832aec5 100644 --- a/packages/backend-common/src/database/types.ts +++ b/packages/backend-common/src/database/types.ts @@ -79,4 +79,6 @@ export interface DatabaseConnector { dbConfig: Config, ...schemas: Array ): Promise; + + dropDatabase?(dbConfig: Config, ...databases: Array): Promise; } diff --git a/packages/backend-common/src/reading/GithubUrlReader.ts b/packages/backend-common/src/reading/GithubUrlReader.ts index 764431386d..67f6a975c1 100644 --- a/packages/backend-common/src/reading/GithubUrlReader.ts +++ b/packages/backend-common/src/reading/GithubUrlReader.ts @@ -105,58 +105,28 @@ export class GithubUrlReader implements UrlReader { credentials, ); - let response: Response; - try { - response = await fetch(ghUrl, { - headers: { - ...credentials?.headers, - ...(options?.etag && { 'If-None-Match': options.etag }), - ...(options?.lastModifiedAfter && { - 'If-Modified-Since': options.lastModifiedAfter.toUTCString(), - }), - Accept: 'application/vnd.github.v3.raw', - }, - // 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 removed after we support ESM for CLI dependencies and migrate to - // version 3 of node-fetch. - // https://github.com/backstage/backstage/issues/8242 - signal: options?.signal as any, - }); - } catch (e) { - throw new Error(`Unable to read ${url}, ${e}`); - } + const response = await this.fetchResponse(ghUrl, { + headers: { + ...credentials?.headers, + ...(options?.etag && { 'If-None-Match': options.etag }), + ...(options?.lastModifiedAfter && { + 'If-Modified-Since': options.lastModifiedAfter.toUTCString(), + }), + Accept: 'application/vnd.github.v3.raw', + }, + // 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 removed after we support ESM for CLI dependencies and migrate to + // version 3 of node-fetch. + // https://github.com/backstage/backstage/issues/8242 + signal: options?.signal as any, + }); - if (response.status === 304) { - throw new NotModifiedError(); - } - - if (response.ok) { - return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { - etag: response.headers.get('ETag') ?? undefined, - lastModifiedAt: parseLastModified( - response.headers.get('Last-Modified'), - ), - }); - } - - let message = `${url} could not be read as ${ghUrl}, ${response.status} ${response.statusText}`; - if (response.status === 404) { - throw new NotFoundError(message); - } - - // GitHub returns a 403 response with a couple of headers indicating rate - // limit status. See more in the GitHub docs: - // https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting - if ( - response.status === 403 && - response.headers.get('X-RateLimit-Remaining') === '0' - ) { - message += ' (rate limit exceeded)'; - } - - throw new Error(message); + return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { + etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified(response.headers.get('Last-Modified')), + }); } async readTree( @@ -350,10 +320,26 @@ export class GithubUrlReader implements UrlReader { const response = await fetch(urlAsString, init); if (!response.ok) { - const message = `Request failed for ${urlAsString}, ${response.status} ${response.statusText}`; + let message = `Request failed for ${urlAsString}, ${response.status} ${response.statusText}`; + + if (response.status === 304) { + throw new NotModifiedError(); + } + if (response.status === 404) { throw new NotFoundError(message); } + + // GitHub returns a 403 response with a couple of headers indicating rate + // limit status. See more in the GitHub docs: + // https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting + if ( + response.status === 403 && + response.headers.get('X-RateLimit-Remaining') === '0' + ) { + message += ' (rate limit exceeded)'; + } + throw new Error(message); } diff --git a/packages/backend-common/src/scm/git.test.ts b/packages/backend-common/src/scm/git.test.ts index 7533c6e2f3..1c07dfb917 100644 --- a/packages/backend-common/src/scm/git.test.ts +++ b/packages/backend-common/src/scm/git.test.ts @@ -63,6 +63,22 @@ describe('Git', () => { }); }); + describe('remove', () => { + it('should call isomorphic-git remove with the correct arguments', async () => { + const git = Git.fromAuth({}); + const dir = 'mockdirectory'; + const filepath = 'mockfile/path'; + + await git.remove({ dir, filepath }); + + expect(isomorphic.remove).toHaveBeenCalledWith({ + fs, + dir, + filepath, + }); + }); + }); + describe('deleteRemote', () => { it('should call isomorphic-git with the correct arguments', async () => { const git = Git.fromAuth({}); diff --git a/packages/backend-common/src/scm/git.ts b/packages/backend-common/src/scm/git.ts index 364e1bacd5..e7bad693fe 100644 --- a/packages/backend-common/src/scm/git.ts +++ b/packages/backend-common/src/scm/git.ts @@ -300,6 +300,15 @@ export class Git { return git.readCommit({ fs, dir, oid: sha }); } + /** https://isomorphic-git.org/docs/en/remove */ + async remove(options: { dir: string; filepath: string }): Promise { + const { dir, filepath } = options; + this.config.logger?.info( + `Removing file from git index {dir=${dir},filepath=${filepath}}`, + ); + return git.remove({ fs, dir, filepath }); + } + /** https://isomorphic-git.org/docs/en/resolveRef */ async resolveRef(options: { dir: string; ref: string }): Promise { const { dir, ref } = options; diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 36690921e2..b8bacd3732 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/backend-defaults +## 0.2.9 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-app-api@0.5.10 + +## 0.2.9-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-app-api@0.5.10-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 0.2.9-next.1 ### Patch Changes diff --git a/packages/backend-defaults/README.md b/packages/backend-defaults/README.md index 2dcc5766df..01e42d42c4 100644 --- a/packages/backend-defaults/README.md +++ b/packages/backend-defaults/README.md @@ -1,7 +1,5 @@ # @backstage/backend-defaults -**This package is EXPERIMENTAL, we recommend against using it for production deployments** - This package provides the default implementations and setup for a standard Backstage backend app. ## Installation diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index ac8fd8a624..73a54720f5 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.2.9-next.1", + "version": "0.2.9", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-dev-utils/CHANGELOG.md b/packages/backend-dev-utils/CHANGELOG.md index f1d1887b78..1c4deba50a 100644 --- a/packages/backend-dev-utils/CHANGELOG.md +++ b/packages/backend-dev-utils/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/backend-dev-utils +## 0.1.3 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status + +## 0.1.3-next.0 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status + ## 0.1.2 ### Patch Changes diff --git a/packages/backend-dev-utils/README.md b/packages/backend-dev-utils/README.md index cebe591d50..744a9d2ca0 100644 --- a/packages/backend-dev-utils/README.md +++ b/packages/backend-dev-utils/README.md @@ -1,7 +1,5 @@ # @backstage/backend-dev-utils -**This package is EXPERIMENTAL, but we encourage use of it to add support for the new backend system in your own plugins** - This package helps set up local development environments for Backstage backend packages. ## Installation diff --git a/packages/backend-dev-utils/package.json b/packages/backend-dev-utils/package.json index b6156e622c..67fd763dcd 100644 --- a/packages/backend-dev-utils/package.json +++ b/packages/backend-dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dev-utils", - "version": "0.1.2", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-plugin-manager/.eslintrc.js b/packages/backend-dynamic-feature-service/.eslintrc.js similarity index 100% rename from packages/backend-plugin-manager/.eslintrc.js rename to packages/backend-dynamic-feature-service/.eslintrc.js diff --git a/packages/backend-plugin-manager/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md similarity index 89% rename from packages/backend-plugin-manager/CHANGELOG.md rename to packages/backend-dynamic-feature-service/CHANGELOG.md index 01fc89b7f3..4b80750865 100644 --- a/packages/backend-plugin-manager/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,4 +1,48 @@ -# @backstage/backend-plugin-manager +# @backstage/backend-dynamic-feature-service + +## 0.1.0 + +### Minor Changes + +- eb81f42: New `backend-dynamic-feature-service` package, for the discovery of dynamic frontend and backend plugins (and modules) and the loading of the backend ones inside the backend application. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/cli-node@0.2.2 + - @backstage/plugin-events-backend@0.2.18 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-events-node@0.2.18 + - @backstage/plugin-search-common@1.2.10 + +## 0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-events-backend@0.2.18-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/cli-node@0.2.2-next.0 ## 0.0.5-next.1 diff --git a/packages/backend-plugin-manager/README.md b/packages/backend-dynamic-feature-service/README.md similarity index 64% rename from packages/backend-plugin-manager/README.md rename to packages/backend-dynamic-feature-service/README.md index c9fd666fb3..211148ee10 100644 --- a/packages/backend-plugin-manager/README.md +++ b/packages/backend-dynamic-feature-service/README.md @@ -1,10 +1,6 @@ -# @backstage/backend-plugin-manager +# @backstage/backend-dynamic-feature-service -This package adds experimental support for **dynamic backend plugins**, according to the content of the proposal in [RFC 18390](https://github.com/backstage/backstage/issues/18390) - -## Status - -**This package is EXPERIMENTAL, and is subject to change according to the discussions and conclusions that happen around the RFC mentioned above.** +This package adds experimental support for **dynamic backend features (plugins and modules)**, according to the content of the proposal in [RFC 18390](https://github.com/backstage/backstage/issues/18390) ## Testing the backend dynamic plugins feature @@ -12,9 +8,9 @@ In order to test the dynamic backend plugins feature provided by this package, e ## How it works -The backend plugin manager is a service that scans a configured root directory (`dynamicPlugins.rootDirectory` in the app config) for dynamic plugin packages, and loads them dynamically. +The dynamic plugin manager is a service that scans a configured root directory (`dynamicPlugins.rootDirectory` in the app config) for dynamic plugin packages, and loads them dynamically. -In the `backend-next` application, it can be enabled by adding the `backend-plugin-manager` as a dependency in the `package.json` and the following lines in the `src/index.ts` file: +In the `backend-next` application, it can be enabled by adding the `backend-dynamic-feature-service` as a dependency in the `package.json` and the following lines in the `src/index.ts` file: ```ts const backend = createBackend(); @@ -36,9 +32,9 @@ Points 2 and 3 can be done by the `export-dynamic-plugin` CLI command used to pe ### About the `export-dynamic-plugin` command -The `export-dynamic-plugin` CLI command, used the dynamic plugin examples provided in the [showcase repository](https://github.com/janus-idp/dynamic-backend-plugins-showcase), is part of a `@backstage/cli` fork (`@dfatwork-pkgs/backstage-cli@0.22.9-next.6`), and can be used to help packaging the dynamic plugins according to the constraints mentioned above, in order to allow straightforward testing of the dynamic plugins feature. +The `export-dynamic-plugin` CLI command, used the dynamic plugin examples provided in the [showcase repository](https://github.com/janus-idp/dynamic-backend-plugins-showcase), is part of the `@janus-idp/cli` package, and can be used to help packaging the dynamic plugins according to the constraints mentioned above, in order to allow straightforward testing of the dynamic plugins feature. -However the `backend-plugin-manager` experimental package does **not** depend on the use of this additional CLI command, and in future steps of this backend dynamic plugin work, the use of such a dedicated command might not even be necessary. +However the `backend-dynamic-feature-service` experimental package does **not** depend on the use of this additional CLI command, and in future steps of this backend dynamic plugin work, the use of such a dedicated command might not even be necessary. ### About the support of the legacy backend system @@ -49,4 +45,4 @@ This is why the API related to the old backend is already marked as deprecated. ### Future work -The current implementation of the backend plugin manager is a first step towards the final implementation of the dynamic backend plugins feature, which will be completed / simplified in future steps, as the status of the backstage codebase allows it. +The current implementation of the dynamic plugin manager is a first step towards the final implementation of the dynamic features loading, which will be completed / simplified in future steps, as the status of the backstage codebase allows it. diff --git a/packages/backend-plugin-manager/api-report.md b/packages/backend-dynamic-feature-service/api-report.md similarity index 98% rename from packages/backend-plugin-manager/api-report.md rename to packages/backend-dynamic-feature-service/api-report.md index dc5973a3ab..caf2cf01ec 100644 --- a/packages/backend-plugin-manager/api-report.md +++ b/packages/backend-dynamic-feature-service/api-report.md @@ -1,4 +1,4 @@ -## API Report File for "@backstage/backend-plugin-manager" +## API Report File for "@backstage/backend-dynamic-feature-service" > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). diff --git a/packages/backend-dynamic-feature-service/catalog-info.yaml b/packages/backend-dynamic-feature-service/catalog-info.yaml new file mode 100644 index 0000000000..1269a5c406 --- /dev/null +++ b/packages/backend-dynamic-feature-service/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-backend-dynamic-feature-service + title: '@backstage/backend-dynamic-feature-service' + description: Backstage backend service to handle dynamic features +spec: + lifecycle: experimental + type: backstage-node-library + owner: maintainers diff --git a/packages/backend-plugin-manager/config.d.ts b/packages/backend-dynamic-feature-service/config.d.ts similarity index 100% rename from packages/backend-plugin-manager/config.d.ts rename to packages/backend-dynamic-feature-service/config.d.ts diff --git a/packages/backend-plugin-manager/package.json b/packages/backend-dynamic-feature-service/package.json similarity index 92% rename from packages/backend-plugin-manager/package.json rename to packages/backend-dynamic-feature-service/package.json index b5351dc3ad..18bbd58550 100644 --- a/packages/backend-plugin-manager/package.json +++ b/packages/backend-dynamic-feature-service/package.json @@ -1,8 +1,7 @@ { - "name": "@backstage/backend-plugin-manager", - "description": "Backstage plugin management backend", - "version": "0.0.5-next.1", - "private": true, + "name": "@backstage/backend-dynamic-feature-service", + "description": "Backstage dynamic feature service", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-plugin-manager/src/__testUtils__/testUtils.ts b/packages/backend-dynamic-feature-service/src/__testUtils__/testUtils.ts similarity index 100% rename from packages/backend-plugin-manager/src/__testUtils__/testUtils.ts rename to packages/backend-dynamic-feature-service/src/__testUtils__/testUtils.ts diff --git a/packages/backend-plugin-manager/src/index.ts b/packages/backend-dynamic-feature-service/src/index.ts similarity index 100% rename from packages/backend-plugin-manager/src/index.ts rename to packages/backend-dynamic-feature-service/src/index.ts diff --git a/packages/backend-plugin-manager/src/loader/CommonJSModuleLoader.ts b/packages/backend-dynamic-feature-service/src/loader/CommonJSModuleLoader.ts similarity index 100% rename from packages/backend-plugin-manager/src/loader/CommonJSModuleLoader.ts rename to packages/backend-dynamic-feature-service/src/loader/CommonJSModuleLoader.ts diff --git a/packages/backend-plugin-manager/src/loader/index.ts b/packages/backend-dynamic-feature-service/src/loader/index.ts similarity index 100% rename from packages/backend-plugin-manager/src/loader/index.ts rename to packages/backend-dynamic-feature-service/src/loader/index.ts diff --git a/packages/backend-plugin-manager/src/loader/types.ts b/packages/backend-dynamic-feature-service/src/loader/types.ts similarity index 100% rename from packages/backend-plugin-manager/src/loader/types.ts rename to packages/backend-dynamic-feature-service/src/loader/types.ts diff --git a/packages/backend-plugin-manager/src/manager/index.ts b/packages/backend-dynamic-feature-service/src/manager/index.ts similarity index 100% rename from packages/backend-plugin-manager/src/manager/index.ts rename to packages/backend-dynamic-feature-service/src/manager/index.ts diff --git a/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts similarity index 99% rename from packages/backend-plugin-manager/src/manager/plugin-manager.test.ts rename to packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts index 405fd629f2..487729687f 100644 --- a/packages/backend-plugin-manager/src/manager/plugin-manager.test.ts +++ b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.test.ts @@ -47,7 +47,7 @@ import { PluginScanner } from '../scanner/plugin-scanner'; import { findPaths } from '@backstage/cli-common'; import { createMockDirectory } from '@backstage/backend-test-utils'; -describe('backend-plugin-manager', () => { +describe('backend-dynamic-feature-service', () => { const mockDir = createMockDirectory(); describe('loadPlugins', () => { diff --git a/packages/backend-plugin-manager/src/manager/plugin-manager.ts b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.ts similarity index 100% rename from packages/backend-plugin-manager/src/manager/plugin-manager.ts rename to packages/backend-dynamic-feature-service/src/manager/plugin-manager.ts diff --git a/packages/backend-plugin-manager/src/manager/types.ts b/packages/backend-dynamic-feature-service/src/manager/types.ts similarity index 100% rename from packages/backend-plugin-manager/src/manager/types.ts rename to packages/backend-dynamic-feature-service/src/manager/types.ts diff --git a/packages/backend-plugin-manager/src/scanner/index.ts b/packages/backend-dynamic-feature-service/src/scanner/index.ts similarity index 100% rename from packages/backend-plugin-manager/src/scanner/index.ts rename to packages/backend-dynamic-feature-service/src/scanner/index.ts diff --git a/packages/backend-plugin-manager/src/scanner/plugin-scanner-watcher.test.ts b/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner-watcher.test.ts similarity index 100% rename from packages/backend-plugin-manager/src/scanner/plugin-scanner-watcher.test.ts rename to packages/backend-dynamic-feature-service/src/scanner/plugin-scanner-watcher.test.ts diff --git a/packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts b/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.test.ts similarity index 100% rename from packages/backend-plugin-manager/src/scanner/plugin-scanner.test.ts rename to packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.test.ts diff --git a/packages/backend-plugin-manager/src/scanner/plugin-scanner.ts b/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.ts similarity index 100% rename from packages/backend-plugin-manager/src/scanner/plugin-scanner.ts rename to packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.ts diff --git a/packages/backend-plugin-manager/src/scanner/types.ts b/packages/backend-dynamic-feature-service/src/scanner/types.ts similarity index 100% rename from packages/backend-plugin-manager/src/scanner/types.ts rename to packages/backend-dynamic-feature-service/src/scanner/types.ts diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index 8058f77313..96cb73808f 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,86 @@ # example-backend-next +## 0.0.19 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-sonarqube-backend@0.2.11 + - @backstage/plugin-scaffolder-backend@1.20.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26 + - @backstage/plugin-search-backend-module-techdocs@0.1.13 + - @backstage/plugin-search-backend-module-catalog@0.1.13 + - @backstage/plugin-search-backend-module-explore@0.1.13 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-defaults@0.2.9 + - @backstage/plugin-azure-devops-backend@0.5.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2 + - @backstage/plugin-entity-feedback-backend@0.2.6 + - @backstage/plugin-devtools-backend@0.2.6 + - @backstage/plugin-linguist-backend@0.5.6 + - @backstage/plugin-playlist-backend@0.3.13 + - @backstage/plugin-techdocs-backend@1.9.2 + - @backstage/plugin-jenkins-backend@0.3.3 + - @backstage/plugin-badges-backend@0.3.6 + - @backstage/plugin-search-backend@1.4.9 + - @backstage/plugin-nomad-backend@0.1.11 + - @backstage/plugin-todo-backend@0.3.7 + - @backstage/plugin-adr-backend@0.4.6 + - @backstage/plugin-app-backend@0.3.57 + - @backstage/plugin-permission-backend@0.5.32 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-kubernetes-backend@0.14.1 + - @backstage/plugin-lighthouse-backend@0.4.1 + - @backstage/plugin-proxy-backend@0.4.7 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6 + +## 0.0.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-sonarqube-backend@0.2.11-next.2 + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-defaults@0.2.9-next.2 + - @backstage/plugin-adr-backend@0.4.6-next.2 + - @backstage/plugin-app-backend@0.3.57-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-azure-devops-backend@0.5.1-next.2 + - @backstage/plugin-badges-backend@0.3.6-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.2 + - @backstage/plugin-devtools-backend@0.2.6-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.6-next.2 + - @backstage/plugin-jenkins-backend@0.3.3-next.2 + - @backstage/plugin-kubernetes-backend@0.14.1-next.2 + - @backstage/plugin-lighthouse-backend@0.4.1-next.2 + - @backstage/plugin-linguist-backend@0.5.6-next.2 + - @backstage/plugin-nomad-backend@0.1.11-next.2 + - @backstage/plugin-permission-backend@0.5.32-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-playlist-backend@0.3.13-next.2 + - @backstage/plugin-proxy-backend@0.4.7-next.2 + - @backstage/plugin-scaffolder-backend@1.19.3-next.2 + - @backstage/plugin-search-backend@1.4.9-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/plugin-techdocs-backend@1.9.2-next.2 + - @backstage/plugin-todo-backend@0.3.7-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.2 + ## 0.0.19-next.1 ### Patch Changes diff --git a/packages/backend-next/README.md b/packages/backend-next/README.md index 94fc0767c4..4634e5673f 100644 --- a/packages/backend-next/README.md +++ b/packages/backend-next/README.md @@ -1,5 +1,5 @@ # example-backend-next -This is an example backend for the new **EXPERIMENTAL** Backstage backend system. +This is an example backend for [the new Backstage backend system](https://backstage.io/docs/backend-system/). Do not use this in your own projects. diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 40ae14942f..d6908f6e78 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.19-next.1", + "version": "0.0.19", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md index c40e40fd59..9cbaa84947 100644 --- a/packages/backend-openapi-utils/CHANGELOG.md +++ b/packages/backend-openapi-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/backend-openapi-utils +## 0.1.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/errors@1.2.3 + +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + ## 0.1.2-next.1 ### Patch Changes diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index ea84033d7b..2ca6c3b716 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-openapi-utils", "description": "OpenAPI typescript support.", - "version": "0.1.2-next.1", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 580f3fec11..80f9026e21 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/backend-plugin-api +## 0.6.9 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 0.6.9-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.6.9-next.1 ### Patch Changes diff --git a/packages/backend-plugin-api/README.md b/packages/backend-plugin-api/README.md index a17c8715a7..b827ecc50c 100644 --- a/packages/backend-plugin-api/README.md +++ b/packages/backend-plugin-api/README.md @@ -1,8 +1,6 @@ # @backstage/backend-plugin-api -**This package is EXPERIMENTAL, but we encourage use of it to add support for the new backend system in your own plugins** - -This package provides the core API used by Backstage backend plugins and modules. +This package provides the framework API used by Backstage backend plugins and modules. ## Installation diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index cc66ac562d..618a537bf5 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.6.9-next.1", + "version": "0.6.9", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index 0f64a7643c..d107e5b51d 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/backend-tasks +## 0.5.14 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.5.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + ## 0.5.14-next.1 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index 0e6103f06f..4af6a3462a 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.14-next.1", + "version": "0.5.14", "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 86e28f5413..66870f7f01 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/backend-test-utils +## 0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-app-api@0.5.10 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-app-api@0.5.10-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.2.10-next.1 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index c6f4924be4..8fcaff66ae 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.2.10-next.1", + "version": "0.2.10", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-test-utils/src/database/TestDatabases.ts b/packages/backend-test-utils/src/database/TestDatabases.ts index 1913075b1f..4ea8fe05d7 100644 --- a/packages/backend-test-utils/src/database/TestDatabases.ts +++ b/packages/backend-test-utils/src/database/TestDatabases.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { DatabaseManager } from '@backstage/backend-common'; +import { DatabaseManager, dropDatabase } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { randomBytes } from 'crypto'; import { Knex } from 'knex'; @@ -157,11 +157,13 @@ export class TestDatabases { } // Ensure that a unique logical database is created in the instance + const databaseName = `db${randomBytes(16).toString('hex')}`; const connection = await instance.databaseManager - .forPlugin(`db${randomBytes(16).toString('hex')}`) + .forPlugin(databaseName) .getClient(); instance.connections.push(connection); + instance.databaseNames.push(databaseName); return connection; } @@ -173,21 +175,30 @@ export class TestDatabases { if (envVarName) { const connectionString = process.env[envVarName]; if (connectionString) { - const databaseManager = DatabaseManager.fromConfig( - new ConfigReader({ - backend: { - database: { - knexConfig: properties.driver.includes('sqlite') - ? {} - : LARGER_POOL_CONFIG, - client: properties.driver, - connection: connectionString, - }, + const config = new ConfigReader({ + backend: { + database: { + knexConfig: properties.driver.includes('sqlite') + ? {} + : LARGER_POOL_CONFIG, + client: properties.driver, + connection: connectionString, }, - }), - ); + }, + }); + const databaseManager = DatabaseManager.fromConfig(config); + const databaseNames: Array = []; return { + dropDatabases: async () => { + await dropDatabase( + config.getConfig('backend.database'), + ...databaseNames.map( + databaseName => `backstage_plugin_${databaseName}`, + ), + ); + }, databaseManager, + databaseNames, connections: [], }; } @@ -226,10 +237,10 @@ export class TestDatabases { }, }), ); - return { stopContainer: stop, databaseManager, + databaseNames: [], connections: [], }; } @@ -256,6 +267,7 @@ export class TestDatabases { return { stopContainer: stop, databaseManager, + databaseNames: [], connections: [], }; } @@ -273,9 +285,9 @@ export class TestDatabases { }, }), ); - return { databaseManager, + databaseNames: [], connections: [], }; } @@ -284,7 +296,12 @@ export class TestDatabases { const instances = [...this.instanceById.values()]; this.instanceById.clear(); - for (const { stopContainer, connections, databaseManager } of instances) { + for (const { + stopContainer, + dropDatabases, + connections, + databaseManager, + } of instances) { for (const connection of connections) { try { await connection.destroy(); @@ -296,6 +313,15 @@ export class TestDatabases { } } + // If the database is not running in docker then drop the databases + try { + await dropDatabases?.(); + } catch (error) { + console.warn(`TestDatabases: Failed to drop databases`, { + error, + }); + } + try { await stopContainer?.(); } catch (error) { diff --git a/packages/backend-test-utils/src/database/types.ts b/packages/backend-test-utils/src/database/types.ts index 75c24dc725..77a0c4e960 100644 --- a/packages/backend-test-utils/src/database/types.ts +++ b/packages/backend-test-utils/src/database/types.ts @@ -43,8 +43,10 @@ export type TestDatabaseProperties = { export type Instance = { stopContainer?: () => Promise; + dropDatabases?: () => Promise; databaseManager: DatabaseManager; connections: Array; + databaseNames: Array; }; export const allDatabases: Record = diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts index d71c774dd9..968237f11d 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts @@ -307,7 +307,7 @@ describe('TestBackend', () => { ], }), ).rejects.toThrow( - "Extension point registered for plugin 'testA' may not be used by module for plugin 'testB'", + "Illegal dependency: Module 'test' for plugin 'testB' attempted to depend on extension point 'a' for plugin 'testA'. Extension points can only be used within their plugin's scope.", ); }); diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 52aaafe2df..838b69f5ab 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,115 @@ # example-backend +## 0.2.91 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.20.3 + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-backend@1.20.0 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10 + - @backstage/plugin-events-backend@0.2.18 + - @backstage/plugin-search-backend-module-techdocs@0.1.13 + - @backstage/plugin-search-backend-module-catalog@0.1.13 + - @backstage/plugin-search-backend-module-explore@0.1.13 + - @backstage/plugin-azure-devops-backend@0.5.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41 + - @backstage/plugin-entity-feedback-backend@0.2.6 + - @backstage/plugin-code-coverage-backend@0.2.23 + - @backstage/plugin-azure-sites-backend@0.1.19 + - @backstage/plugin-tech-insights-node@0.4.15 + - @backstage/plugin-devtools-backend@0.2.6 + - @backstage/plugin-linguist-backend@0.5.6 + - @backstage/plugin-playlist-backend@0.3.13 + - @backstage/plugin-techdocs-backend@1.9.2 + - @backstage/plugin-explore-backend@0.0.19 + - @backstage/plugin-jenkins-backend@0.3.3 + - @backstage/plugin-badges-backend@0.3.6 + - @backstage/plugin-search-backend@1.4.9 + - @backstage/plugin-kafka-backend@0.3.7 + - @backstage/plugin-nomad-backend@0.1.11 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-todo-backend@0.3.7 + - @backstage/plugin-adr-backend@0.4.6 + - @backstage/plugin-app-backend@0.3.57 + - @backstage/plugin-permission-backend@0.5.32 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-catalog-backend@1.16.1 + - example-app@0.2.91 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-kubernetes-backend@0.14.1 + - @backstage/plugin-lighthouse-backend@0.4.1 + - @backstage/plugin-proxy-backend@0.4.7 + - @backstage/plugin-rollbar-backend@0.1.54 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.26 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.12 + - @backstage/plugin-search-backend-module-pg@0.5.18 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/plugin-tech-insights-backend@0.5.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6 + - @backstage/plugin-events-node@0.2.18 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.91-next.2 + +### Patch Changes + +- Updated dependencies + - example-app@0.2.91-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-adr-backend@0.4.6-next.2 + - @backstage/plugin-app-backend@0.3.57-next.2 + - @backstage/plugin-auth-backend@0.20.3-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-azure-devops-backend@0.5.1-next.2 + - @backstage/plugin-badges-backend@0.3.6-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-code-coverage-backend@0.2.23-next.2 + - @backstage/plugin-devtools-backend@0.2.6-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.6-next.2 + - @backstage/plugin-events-backend@0.2.18-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/plugin-jenkins-backend@0.3.3-next.2 + - @backstage/plugin-kafka-backend@0.3.7-next.2 + - @backstage/plugin-kubernetes-backend@0.14.1-next.2 + - @backstage/plugin-lighthouse-backend@0.4.1-next.2 + - @backstage/plugin-linguist-backend@0.5.6-next.2 + - @backstage/plugin-nomad-backend@0.1.11-next.2 + - @backstage/plugin-permission-backend@0.5.32-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-playlist-backend@0.3.13-next.2 + - @backstage/plugin-proxy-backend@0.4.7-next.2 + - @backstage/plugin-scaffolder-backend@1.19.3-next.2 + - @backstage/plugin-search-backend@1.4.9-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.12-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.18-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/plugin-techdocs-backend@1.9.2-next.2 + - @backstage/plugin-todo-backend@0.3.7-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/plugin-azure-sites-backend@0.1.19-next.2 + - @backstage/plugin-explore-backend@0.0.19-next.2 + - @backstage/plugin-rollbar-backend@0.1.54-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.26-next.2 + - @backstage/plugin-tech-insights-backend@0.5.23-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41-next.2 + - @backstage/plugin-tech-insights-node@0.4.15-next.2 + ## 0.2.91-next.1 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index c3959d63b5..cdd0a548c8 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.91-next.1", + "version": "0.2.91", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", @@ -72,6 +72,8 @@ "@backstage/plugin-search-backend-module-techdocs": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-search-common": "workspace:^", + "@backstage/plugin-signals-backend": "workspace:^", + "@backstage/plugin-signals-node": "workspace:^", "@backstage/plugin-tech-insights-backend": "workspace:^", "@backstage/plugin-tech-insights-backend-module-jsonfc": "workspace:^", "@backstage/plugin-tech-insights-node": "workspace:^", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 8df01b050e..bade028597 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -26,19 +26,19 @@ import Router from 'express-promise-router'; import { CacheManager, createServiceBuilder, + DatabaseManager, getRootLogger, + HostDiscovery, loadBackendConfig, notFoundHandler, - DatabaseManager, - HostDiscovery, + ServerTokenManager, UrlReaders, useHotMemoize, - ServerTokenManager, } from '@backstage/backend-common'; import { TaskScheduler } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; import healthcheck from './plugins/healthcheck'; -import { metricsInit, metricsHandler } from './metrics'; +import { metricsHandler, metricsInit } from './metrics'; import auth from './plugins/auth'; import azureDevOps from './plugins/azure-devops'; import catalog from './plugins/catalog'; @@ -65,6 +65,7 @@ import lighthouse from './plugins/lighthouse'; import linguist from './plugins/linguist'; import devTools from './plugins/devtools'; import nomad from './plugins/nomad'; +import signals from './plugins/signals'; import { PluginEnvironment } from './types'; import { ServerPermissionClient } from '@backstage/plugin-permission-node'; import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; @@ -72,6 +73,7 @@ import { DefaultEventBroker } from '@backstage/plugin-events-backend'; import { PrometheusExporter } from '@opentelemetry/exporter-prometheus'; import { MeterProvider } from '@opentelemetry/sdk-metrics'; import { metrics } from '@opentelemetry/api'; +import { DefaultSignalService } from '@backstage/plugin-signals-node'; // Expose opentelemetry metrics using a Prometheus exporter on // http://localhost:9464/metrics . See prometheus.yml in packages/backend for @@ -98,6 +100,9 @@ function makeCreateEnv(config: Config) { }); const eventBroker = new DefaultEventBroker(root.child({ type: 'plugin' })); + const signalService = DefaultSignalService.create({ + eventBroker, + }); root.info(`Created UrlReader ${reader}`); @@ -119,6 +124,7 @@ function makeCreateEnv(config: Config) { permissions, scheduler, identity, + signalService, }; }; } @@ -172,6 +178,7 @@ async function main() { const linguistEnv = useHotMemoize(module, () => createEnv('linguist')); const devToolsEnv = useHotMemoize(module, () => createEnv('devtools')); const nomadEnv = useHotMemoize(module, () => createEnv('nomad')); + const signalsEnv = useHotMemoize(module, () => createEnv('signals')); const apiRouter = Router(); apiRouter.use('/catalog', await catalog(catalogEnv)); @@ -198,6 +205,7 @@ async function main() { apiRouter.use('/linguist', await linguist(linguistEnv)); apiRouter.use('/devtools', await devTools(devToolsEnv)); apiRouter.use('/nomad', await nomad(nomadEnv)); + apiRouter.use('/signals', await signals(signalsEnv)); apiRouter.use(notFoundHandler()); await lighthouse(lighthouseEnv); diff --git a/packages/backend/src/plugins/signals.ts b/packages/backend/src/plugins/signals.ts new file mode 100644 index 0000000000..477cea1938 --- /dev/null +++ b/packages/backend/src/plugins/signals.ts @@ -0,0 +1,28 @@ +/* + * 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 { Router } from 'express'; +import { createRouter } from '@backstage/plugin-signals-backend'; +import { PluginEnvironment } from '../types'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + return await createRouter({ + logger: env.logger, + eventBroker: env.eventBroker, + identity: env.identity, + }); +} diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts index ab1baf0c95..3dad2f739b 100644 --- a/packages/backend/src/types.ts +++ b/packages/backend/src/types.ts @@ -27,6 +27,7 @@ import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { IdentityApi } from '@backstage/plugin-auth-node'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; import { EventBroker } from '@backstage/plugin-events-node'; +import { DefaultSignalService } from '@backstage/plugin-signals-node'; export type PluginEnvironment = { logger: Logger; @@ -40,4 +41,5 @@ export type PluginEnvironment = { scheduler: PluginTaskScheduler; identity: IdentityApi; eventBroker: EventBroker; + signalService: DefaultSignalService; }; diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index b3e04958f9..78d126445e 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/catalog-client +## 1.5.2 + +### Patch Changes + +- 883782e: Fix a bug in `getLocationByRef` that led to invalid backend calls +- Updated dependencies + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + ## 1.5.2-next.0 ### Patch Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index f87d5aa221..cfa9399d97 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.5.2-next.0", + "version": "1.5.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index e7a70042c1..176785b2db 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/cli-node +## 0.2.2 + +### Patch Changes + +- 7acbb5a: Removed `mock-fs` dev dependency. +- Updated dependencies + - @backstage/cli-common@0.1.13 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + ## 0.2.2-next.0 ### Patch Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index 5d3fde9839..60ba687ddc 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.2.2-next.0", + "version": "0.2.2", "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 13aa1c9a97..0c686ea8c4 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/cli +## 0.25.1 + +### Patch Changes + +- b6b15b2: Use sha256 instead of md5 in build script cache key calculation + + Makes it possible to build on FIPS nodejs. + +- Updated dependencies + - @backstage/config-loader@1.6.1 + - @backstage/cli-node@0.2.2 + - @backstage/catalog-model@1.4.3 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/eslint-plugin@0.1.4 + - @backstage/integration@1.8.0 + - @backstage/release-manifests@0.0.11 + - @backstage/types@1.1.1 + ## 0.25.1-next.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 85de89c92a..1c7447b7c3 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.25.1-next.1", + "version": "0.25.1", "publishConfig": { "access": "public" }, @@ -177,7 +177,7 @@ "@vitejs/plugin-react": "^4.0.4", "vite": "^4.4.9", "vite-plugin-html": "^3.2.0", - "vite-plugin-node-polyfills": "^0.17.0" + "vite-plugin-node-polyfills": "^0.19.0" }, "peerDependenciesMeta": { "@vitejs/plugin-react": { diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index 7e2228f5a5..24f7a3addc 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/config-loader +## 1.6.1 + +### Patch Changes + +- 7acbb5a: Removed `mock-fs` dev dependency. +- Updated dependencies + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + ## 1.6.1-next.0 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 17df3b1357..e26a54559c 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.6.1-next.0", + "version": "1.6.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 7341335318..9e32db5016 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/core-app-api +## 1.11.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + ## 1.11.3-next.0 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 05770f3eee..f0654f7596 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.11.3-next.0", + "version": "1.11.3", "publishConfig": { "access": "public" }, diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md index 48977a4c4f..21c7782627 100644 --- a/packages/core-compat-api/CHANGELOG.md +++ b/packages/core-compat-api/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/core-compat-api +## 0.1.1 + +### Patch Changes + +- 4c1f50c: Make `convertLegacyApp` wrap discovered routes with `compatWrapper`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-plugin-api@1.8.2 + - @backstage/core-app-api@1.11.3 + - @backstage/version-bridge@1.0.7 + +## 0.1.1-next.2 + +### Patch Changes + +- 4c1f50c: Make `convertLegacyApp` wrap discovered routes with `compatWrapper`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/packages/core-compat-api/api-report.md b/packages/core-compat-api/api-report.md index 494747be60..a7aae2b5b9 100644 --- a/packages/core-compat-api/api-report.md +++ b/packages/core-compat-api/api-report.md @@ -40,5 +40,26 @@ export function convertLegacyRouteRef< ref: ExternalRouteRef, ): ExternalRouteRef_2; +// @public +export function convertLegacyRouteRefs< + TRefs extends { + [name in string]: RouteRef | SubRouteRef | ExternalRouteRef; + }, +>( + refs: TRefs, +): { + [KName in keyof TRefs]: ToNewRouteRef; +}; + +// @public +export type ToNewRouteRef = + T extends RouteRef + ? RouteRef_2 + : T extends SubRouteRef + ? SubRouteRef_2 + : T extends ExternalRouteRef + ? ExternalRouteRef_2 + : never; + // (No @packageDocumentation comment for this package) ``` diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index f5de02c154..99b705bfcf 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-compat-api", - "version": "0.1.1-next.1", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/core-compat-api/src/collectLegacyRoutes.tsx b/packages/core-compat-api/src/collectLegacyRoutes.tsx index 4d560b81d5..7ddb8c4f7e 100644 --- a/packages/core-compat-api/src/collectLegacyRoutes.tsx +++ b/packages/core-compat-api/src/collectLegacyRoutes.tsx @@ -32,7 +32,10 @@ import { } from '@backstage/frontend-plugin-api'; import React, { Children, ReactNode, isValidElement } from 'react'; import { Route, Routes } from 'react-router-dom'; -import { convertLegacyRouteRef } from './convertLegacyRouteRef'; +import { + convertLegacyRouteRef, + convertLegacyRouteRefs, +} from './convertLegacyRouteRef'; import { compatWrapper } from './compatWrapper'; /* @@ -244,6 +247,8 @@ export function collectLegacyRoutes( createApiExtension({ factory }), ), ], + routes: convertLegacyRouteRefs(plugin.routes ?? {}), + externalRoutes: convertLegacyRouteRefs(plugin.externalRoutes ?? {}), }), ); } diff --git a/packages/core-compat-api/src/compatWrapper/BackwardsCompatProvider.tsx b/packages/core-compat-api/src/compatWrapper/BackwardsCompatProvider.tsx index 099993a392..8c6ef1f375 100644 --- a/packages/core-compat-api/src/compatWrapper/BackwardsCompatProvider.tsx +++ b/packages/core-compat-api/src/compatWrapper/BackwardsCompatProvider.tsx @@ -18,14 +18,13 @@ import React, { useMemo } from 'react'; import { ReactNode } from 'react'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { AppContextProvider } from '../../../core-app-api/src/app/AppContext'; -// eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { - components as defaultComponents, - icons as defaultIcons, -} from '../../../app-defaults/src/defaults'; import { + createPlugin as createNewPlugin, BackstagePlugin as NewBackstagePlugin, appTreeApiRef, + componentsApiRef, + coreComponentRefs, + iconsApiRef, useApi, } from '@backstage/frontend-plugin-api'; import { @@ -71,15 +70,35 @@ function toLegacyPlugin(plugin: NewBackstagePlugin): LegacyBackstagePlugin { return legacy; } +// TODO: Currently a very naive implementation, may need some more work +function toNewPlugin(plugin: LegacyBackstagePlugin): NewBackstagePlugin { + return createNewPlugin({ + id: plugin.getId(), + }); +} + // Recreates the old AppContext APIs using the various new APIs that replaced it function LegacyAppContextProvider(props: { children: ReactNode }) { const appTreeApi = useApi(appTreeApiRef); + const componentsApi = useApi(componentsApiRef); + const iconsApi = useApi(iconsApiRef); const appContext = useMemo(() => { const { tree } = appTreeApi.getTree(); let gatheredPlugins: LegacyBackstagePlugin[] | undefined = undefined; + const ErrorBoundaryFallback = componentsApi.getComponent( + coreComponentRefs.errorBoundaryFallback, + ); + const ErrorBoundaryFallbackWrapper: AppComponents['ErrorBoundaryFallback'] = + ({ plugin, ...rest }) => ( + + ); + return { getPlugins(): LegacyBackstagePlugin[] { if (gatheredPlugins) { @@ -98,24 +117,37 @@ function LegacyAppContextProvider(props: { children: ReactNode }) { return gatheredPlugins; }, - // TODO: Grab these from new API once it exists getSystemIcon(key: string): IconComponent | undefined { - return key in defaultIcons - ? defaultIcons[key as keyof typeof defaultIcons] - : undefined; + return iconsApi.getIcon(key); }, - // TODO: Grab these from new API once it exists getSystemIcons(): Record { - return defaultIcons; + return Object.fromEntries( + iconsApi.listIconKeys().map(key => [key, iconsApi.getIcon(key)!]), + ); }, - // TODO: Grab these from new API once it exists getComponents(): AppComponents { - return defaultComponents; + return { + NotFoundErrorPage: componentsApi.getComponent( + coreComponentRefs.notFoundErrorPage, + ), + BootErrorPage() { + throw new Error( + 'The BootErrorPage app component should not be accessed by plugins', + ); + }, + Progress: componentsApi.getComponent(coreComponentRefs.progress), + Router() { + throw new Error( + 'The Router app component should not be accessed by plugins', + ); + }, + ErrorBoundaryFallback: ErrorBoundaryFallbackWrapper, + }; }, }; - }, [appTreeApi]); + }, [appTreeApi, componentsApi, iconsApi]); return ( diff --git a/packages/core-compat-api/src/compatWrapper/compatWrapper.test.tsx b/packages/core-compat-api/src/compatWrapper/compatWrapper.test.tsx index b2ad7f3d0c..2e7dbd9d37 100644 --- a/packages/core-compat-api/src/compatWrapper/compatWrapper.test.tsx +++ b/packages/core-compat-api/src/compatWrapper/compatWrapper.test.tsx @@ -60,7 +60,7 @@ describe('BackwardsCompatProvider', () => { expect(screen.getByTestId('ctx').textContent).toMatchInlineSnapshot(` "plugins: - components: Progress, Router, NotFoundErrorPage, BootErrorPage, ErrorBoundaryFallback + components: NotFoundErrorPage, BootErrorPage, Progress, Router, ErrorBoundaryFallback icons: brokenImage, catalog, scaffolder, techdocs, search, chat, dashboard, docs, email, github, group, help, kind:api, kind:component, kind:domain, kind:group, kind:location, kind:system, kind:user, kind:resource, kind:template, user, warning" `); }); diff --git a/packages/core-compat-api/src/convertLegacyRouteRef.ts b/packages/core-compat-api/src/convertLegacyRouteRef.ts index c5ee603722..36311dc081 100644 --- a/packages/core-compat-api/src/convertLegacyRouteRef.ts +++ b/packages/core-compat-api/src/convertLegacyRouteRef.ts @@ -40,6 +40,43 @@ import { toInternalSubRouteRef } from '../../frontend-plugin-api/src/routing/Sub // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { toInternalExternalRouteRef } from '../../frontend-plugin-api/src/routing/ExternalRouteRef'; +/** + * Converts a legacy route ref type to the new system. + * + * @public + */ +export type ToNewRouteRef< + T extends LegacyRouteRef | LegacySubRouteRef | LegacyExternalRouteRef, +> = T extends LegacyRouteRef + ? RouteRef + : T extends LegacySubRouteRef + ? SubRouteRef + : T extends LegacyExternalRouteRef + ? ExternalRouteRef + : never; + +/** + * Converts a collection of legacy route refs to the new system. + * This is particularly useful when defining plugin `routes` and `externalRoutes`. + * + * @public + */ +export function convertLegacyRouteRefs< + TRefs extends { + [name in string]: + | LegacyRouteRef + | LegacySubRouteRef + | LegacyExternalRouteRef; + }, +>(refs: TRefs): { [KName in keyof TRefs]: ToNewRouteRef } { + return Object.fromEntries( + Object.entries(refs).map(([name, ref]) => [ + name, + convertLegacyRouteRef(ref as LegacyRouteRef), + ]), + ) as { [KName in keyof TRefs]: ToNewRouteRef }; +} + /** * A temporary helper to convert a legacy route ref to the new system. * diff --git a/packages/core-compat-api/src/index.ts b/packages/core-compat-api/src/index.ts index 68e5d9cf19..b632bf8a57 100644 --- a/packages/core-compat-api/src/index.ts +++ b/packages/core-compat-api/src/index.ts @@ -16,4 +16,8 @@ export * from './compatWrapper'; export { convertLegacyApp } from './convertLegacyApp'; -export { convertLegacyRouteRef } from './convertLegacyRouteRef'; +export { + convertLegacyRouteRef, + convertLegacyRouteRefs, + type ToNewRouteRef, +} from './convertLegacyRouteRef'; diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 2a84f778cb..c6ffec5679 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/core-components +## 0.13.10 + +### Patch Changes + +- d625f66: Fixed bug in Link where it was possible to select and copy a hidden element into clipboard +- 6878b1d: Removed unnecessary `history` and `immer` dependencies. +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/theme@0.5.0 + - @backstage/version-bridge@1.0.7 + ## 0.13.10-next.1 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 25d7fe111c..9dc3e8cb8f 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.10-next.1", + "version": "0.13.10", "publishConfig": { "access": "public" }, @@ -92,6 +92,7 @@ "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { + "@backstage/app-defaults": "workspace:^", "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/test-utils": "workspace:^", diff --git a/packages/core-components/src/layout/ProxiedSignInPage/ProxiedSignInPage.test.tsx b/packages/core-components/src/layout/ProxiedSignInPage/ProxiedSignInPage.test.tsx new file mode 100644 index 0000000000..3f0c01b56b --- /dev/null +++ b/packages/core-components/src/layout/ProxiedSignInPage/ProxiedSignInPage.test.tsx @@ -0,0 +1,103 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { + TestApiProvider, + setupRequestMockHandlers, + wrapInTestApp, +} from '@backstage/test-utils'; +import { ProxiedSignInPage } from './ProxiedSignInPage'; +import { discoveryApiRef } from '@backstage/core-plugin-api'; + +describe('ProxiedSignInPage', () => { + const worker = setupServer(); + setupRequestMockHandlers(worker); + + const Subject = wrapInTestApp(
authenticated
, { + components: { + SignInPage: props => ( + 'http://example.com/api/auth', + }, + ], + ]} + > + + + ), + }, + }); + + it('should sign in a user', async () => { + worker.use( + rest.get('http://example.com/api/auth/test/refresh', (_, res, ctx) => + res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + profile: { + email: 'e', + displayName: 'd', + picture: 'p', + }, + backstageIdentity: { + token: 'a.e30.c', + identity: { + type: 'user', + userEntityRef: 'k:ns/ue', + ownershipEntityRefs: ['k:ns/oe'], + }, + }, + }), + ), + ), + ); + + render(Subject); + + await expect( + screen.findByText('authenticated'), + ).resolves.toBeInTheDocument(); + }); + + it('should forward error', async () => { + worker.use( + rest.get('http://example.com/api/auth/test/refresh', (_, res, ctx) => + res( + ctx.status(401), + ctx.set('Content-Type', 'application/json'), + ctx.json({ + error: { name: 'Error', message: 'not-displayed' }, + }), + ), + ), + ); + + render(Subject); + + await expect( + screen.findByText('Request failed with 401 Error'), + ).resolves.toBeInTheDocument(); + }); +}); diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index bdc94c0f1e..4cb681e4aa 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/core-plugin-api +## 1.8.2 + +### Patch Changes + +- 6878b1d: Removed unnecessary `i18next` dependency. +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + ## 1.8.2-next.0 ### Patch Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index b61bf9991d..d676260227 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.8.2-next.0", + "version": "1.8.2", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index da3bb217a3..3008a3a03d 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/create-app +## 0.5.9 + +### Patch Changes + +- c9f71fb: Bumped create-app version. +- ac277f3: Bumped create-app version. +- 7acbb5a: Removed `mock-fs` dev dependency. +- Updated dependencies + - @backstage/cli-common@0.1.13 + +## 0.5.9-next.2 + +### Patch Changes + +- Bumped create-app version. + ## 0.5.9-next.1 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index d41322422c..e9f73d6e1f 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.9-next.1", + "version": "0.5.9", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index b74957dd56..40cc8282d9 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -42,8 +42,8 @@ "typescript": "~5.2.0" }, "resolutions": { - "@types/react": "^17", - "@types/react-dom": "^17" + "@types/react": "^18", + "@types/react-dom": "^18" }, "prettier": "@spotify/prettier-config", "lint-staged": { diff --git a/packages/create-app/templates/default-app/packages/app/package.json.hbs b/packages/create-app/templates/default-app/packages/app/package.json.hbs index 598f049a4c..b403295b09 100644 --- a/packages/create-app/templates/default-app/packages/app/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/app/package.json.hbs @@ -42,8 +42,8 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "history": "^5.0.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.0.2", + "react-dom": "^18.0.2", "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-use": "^17.2.4" @@ -51,10 +51,10 @@ "devDependencies": { "@backstage/test-utils": "^{{version '@backstage/test-utils'}}", "@playwright/test": "^1.32.3", - "@testing-library/jest-dom": "^5.10.1", - "@testing-library/react": "^12.1.3", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.0.0", - "@testing-library/dom": "^8.0.0", + "@testing-library/dom": "^9.0.0", "@types/react-dom": "*", "cross-env": "^7.0.0" }, diff --git a/packages/create-app/templates/default-app/packages/app/src/App.test.tsx b/packages/create-app/templates/default-app/packages/app/src/App.test.tsx index b94cac73b3..ec8ba1d714 100644 --- a/packages/create-app/templates/default-app/packages/app/src/App.test.tsx +++ b/packages/create-app/templates/default-app/packages/app/src/App.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { renderWithEffects } from '@backstage/test-utils'; +import { render, waitFor } from '@testing-library/react'; import App from './App'; describe('App', () => { @@ -20,7 +20,10 @@ describe('App', () => { ] as any, }; - const rendered = await renderWithEffects(); - expect(rendered.baseElement).toBeInTheDocument(); + const rendered = render(); + + await waitFor(() => { + expect(rendered.baseElement).toBeInTheDocument(); + }); }); }); diff --git a/packages/create-app/templates/default-app/packages/app/src/index.tsx b/packages/create-app/templates/default-app/packages/app/src/index.tsx index b16aaf7cd2..d875c774c8 100644 --- a/packages/create-app/templates/default-app/packages/app/src/index.tsx +++ b/packages/create-app/templates/default-app/packages/app/src/index.tsx @@ -1,6 +1,6 @@ import '@backstage/cli/asset-types'; import React from 'react'; -import ReactDOM from 'react-dom'; +import ReactDOM from 'react-dom/client'; import App from './App'; -ReactDOM.render(, document.getElementById('root')); +ReactDOM.createRoot(document.getElementById('root')!).render(); diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 202e1021db..602f2b563e 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/dev-utils +## 1.0.26 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/app-defaults@1.4.7 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + +## 1.0.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/integration-react@1.1.23-next.0 + ## 1.0.26-next.1 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 2100ce95f0..40537c1a98 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.26-next.1", + "version": "1.0.26", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index c25142ff82..f130de43d4 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,21 @@ # e2e-test +## 0.2.11 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.9 + - @backstage/cli-common@0.1.13 + - @backstage/errors@1.2.3 + +## 0.2.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.9-next.2 + ## 0.2.11-next.1 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 033b7d2a5f..40699588e2 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.11-next.1", + "version": "0.2.11", "private": true, "backstage": { "role": "cli" diff --git a/packages/e2e-test/src/index.ts b/packages/e2e-test/src/index.ts index 92adc24b1e..f3c63ae175 100644 --- a/packages/e2e-test/src/index.ts +++ b/packages/e2e-test/src/index.ts @@ -36,23 +36,4 @@ async function main(argv: string[]) { program.parse(argv); } -process.on('unhandledRejection', (rejection: unknown) => { - // Try to avoid exiting if the unhandled error is coming from jsdom, i.e. zombie. - // Those are typically errors on the page that should be benign, at least in the - // context of this test. We have other ways of asserting that the page is being - // rendered correctly. - if ( - rejection instanceof Error && - rejection?.stack?.includes('node_modules/jsdom/lib') - ) { - console.log(`Ignored error inside jsdom, ${rejection?.stack ?? rejection}`); - } else { - if (rejection instanceof Error) { - exitWithError(rejection); - } else { - exitWithError(new Error(`Unknown rejection: '${rejection}'`)); - } - } -}); - main(process.argv).catch(exitWithError); diff --git a/packages/eslint-plugin/README.md b/packages/eslint-plugin/README.md index c311670603..600b3268e1 100644 --- a/packages/eslint-plugin/README.md +++ b/packages/eslint-plugin/README.md @@ -35,8 +35,9 @@ rules: { The following rules are provided by this plugin: -| Rule | Description | -| --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| [@backstage/no-forbidden-package-imports](./docs/rules/no-forbidden-package-imports.md) | Disallow internal monorepo imports from package subpaths that are not exported. | -| [@backstage/no-relative-monorepo-imports](./docs/rules/no-relative-monorepo-imports.md) | Forbid relative imports that reach outside of the package in a monorepo. | -| [@backstage/no-undeclared-imports](./docs/rules/no-undeclared-imports.md) | Forbid imports of external packages that have not been declared in the appropriate dependencies field in `package.json`. | +| Rule | Description | +| --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| [@backstage/no-forbidden-package-imports](./docs/rules/no-forbidden-package-imports.md) | Disallow internal monorepo imports from package subpaths that are not exported. | +| [@backstage/no-relative-monorepo-imports](./docs/rules/no-relative-monorepo-imports.md) | Forbid relative imports that reach outside of the package in a monorepo. | +| [@backstage/no-undeclared-imports](./docs/rules/no-undeclared-imports.md) | Forbid imports of external packages that have not been declared in the appropriate dependencies field in `package.json`. | +| [@backstage/no-top-level-material-ui-4-imports](./docs/rules/no-top-level-material-ui-4-imports.md) | Forbid top level import from Material UI v4 packages. | diff --git a/packages/eslint-plugin/docs/rules/no-top-level-material-ui-4-imports.md b/packages/eslint-plugin/docs/rules/no-top-level-material-ui-4-imports.md new file mode 100644 index 0000000000..a105014abc --- /dev/null +++ b/packages/eslint-plugin/docs/rules/no-top-level-material-ui-4-imports.md @@ -0,0 +1,43 @@ +# @backstage/no-top-level-material-ui-4-imports + +Forbid top level import from Material UI v4 packages. + +## Usage + +Add the rules as follows, it has no options: + +```js +'@backstage/no-top-level-material-ui-4-imports': 'error' +``` + +## Rule Details + +Automatically fixes imports from named to default imports. This will help you comply with [Material UI recommendations](https://mui.com/material-ui/guides/minimizing-bundle-size/) and make migrating to Material UI v5 easier. + +### Fail + +```tsx +import { Box, Typography } from '@material-ui/core'; +``` + +```tsx +import Box from '@material-ui/core'; +``` + +```tsx +import { + Box, + DialogActions, + DialogContent, + DialogTitle, + Grid, + makeStyles, +} from '@material-ui/core'; +``` + +### Pass + +```tsx +import Typography from '@material-ui/core/Typography'; +import Box from '@material-ui/core/Box'; +``` diff --git a/packages/eslint-plugin/index.js b/packages/eslint-plugin/index.js index 20a0ff2d18..af1a8891c3 100644 --- a/packages/eslint-plugin/index.js +++ b/packages/eslint-plugin/index.js @@ -29,5 +29,6 @@ module.exports = { 'no-forbidden-package-imports': require('./rules/no-forbidden-package-imports'), 'no-relative-monorepo-imports': require('./rules/no-relative-monorepo-imports'), 'no-undeclared-imports': require('./rules/no-undeclared-imports'), + 'no-top-level-material-ui-4-imports': require('./rules/no-top-level-material-ui-4-imports'), }, }; diff --git a/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js b/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js new file mode 100644 index 0000000000..6a726545fc --- /dev/null +++ b/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js @@ -0,0 +1,156 @@ +/* + * 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. + */ + +// @ts-check + +const KNOWN_STYLES = [ + 'makeStyles', + 'withStyles', + 'createStyles', + 'styled', + 'useTheme', + 'Theme', +]; + +/** @type {import('eslint').Rule.RuleModule} */ +module.exports = { + meta: { + type: 'problem', + fixable: 'code', + messages: { + topLevelImport: 'Top level imports for Material UI are not allowed', + }, + docs: { + description: 'Forbid top level import from Material UI v4 packages.', + url: 'https://github.com/backstage/backstage/blob/master/packages/eslint-plugin/docs/rules/no-top-level-material-ui-4-imports.md', + }, + }, + create: context => ({ + ImportDeclaration: node => { + // Anatomy of a Node + // Example: import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon'; + // Specifiers are the part between the `import` and `from`, in the example that would be `SvgIcon, { SvgIconProps }` + // Source is the part after the `from`, in the example that would be `'@material-ui/core/SvgIcon'` + // Source value gets you `@material-ui/core/SvgIcon` without the quotes, where as Source raw gets it as is + + // Return if empty import + if (node.specifiers.length === 0) return; + // Return if empty source value + if (!node.source.value) return; + // Return if source value not a string + if (typeof node.source.value !== 'string') return; + // Return if import does not start with '@material-ui/' + if (!node.source.value.startsWith('@material-ui/')) return; + // Return if import is from '@material-ui/core/styles', as it's valid already + if (node.source.value === '@material-ui/core/styles') return; + // Return if proper import eg. `import Box from '@material-ui/core/Box'` + // Or if third level or deeper imports + if (node.source.value?.split('/').length >= 3) return; + + // Report all other imports + context.report({ + node, + messageId: 'topLevelImport', + fix: fixer => { + const replacements = []; + const styles = []; + + const specifiers = node.specifiers.filter( + s => s.type === 'ImportSpecifier', + ); + + const specifiersMap = specifiers.map(s => { + const propsMatch = /^([A-Z]\w+)Props$/.exec(s.local.name); + + return { + emitComponent: !(propsMatch !== null), + emitProp: propsMatch !== null, + value: s.local.name, + propValue: propsMatch ? propsMatch[1] : undefined, + }; + }); + + // We have 3 cases: + // 1 - Just Prop: import { TabProps } from '@material-ui/core'; + // 2 - Just Component: import { Box } from '@material-ui/core'; + // 3 - Component and Prop: import { SvgIcon, SvgIconProps } from '@material-ui/core'; + + const components = specifiersMap + .filter(f => { + return f.emitComponent; + }) + .map(m => m.value); + const props = specifiersMap + .filter(f => { + return f.emitProp; + }) + .map(m => m.value); + + if ( + specifiersMap.some(s => s.emitProp) && + !specifiersMap.some(s => s.emitComponent) + ) { + // 1 - Just Prop + const propValue = specifiersMap + .filter(f => { + return f.emitProp; + }) + .map(m => m.propValue); + replacements.push( + `import { ${props.join(', ')} } from '@material-ui/core/${ + propValue[0] + }';`, + ); + } else if ( + !specifiersMap.some(s => s.emitProp) && + specifiersMap.some(s => s.emitComponent) + ) { + // 2 - Just Component + for (const specifier of specifiers) { + if (KNOWN_STYLES.includes(specifier.local.name)) { + styles.push(specifier.local.name); + } else { + const replacement = `import ${specifier.local.name} from '${node.source.value}/${specifier.local.name}';`; + replacements.push(replacement); + } + } + } else if ( + specifiersMap.some(s => s.emitProp) && + specifiersMap.some(s => s.emitComponent) + ) { + // 3 - Component and Prop + replacements.push( + `import ${components[0]}, { ${props.join( + ', ', + )} } from '@material-ui/core/${components[0]}';`, + ); + } + + if (styles.length > 0) { + const stylesReplacement = `import { ${styles.join( + ', ', + )} } from '@material-ui/core/styles';`; + replacements.push(stylesReplacement); + } + + const result = fixer.replaceText(node, replacements.join('\n')); + + return result; + }, + }); + }, + }), +}; diff --git a/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts b/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts new file mode 100644 index 0000000000..568bdb8cc8 --- /dev/null +++ b/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts @@ -0,0 +1,107 @@ +/* + * 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 { RuleTester } from 'eslint'; +import rule from '../rules/no-top-level-material-ui-4-imports'; + +const ruleTester = new RuleTester({ + parserOptions: { + sourceType: 'module', + ecmaVersion: 2021, + }, +}); + +ruleTester.run('path-imports-rule', rule, { + valid: [ + { + code: `import Typography from '@material-ui/core/Typography';`, + }, + { + code: `import Box from '@material-ui/core/Box'`, + }, + { + code: `import { styled, withStyles } from '@material-ui/core/styles';`, + }, + { + code: `import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon';`, + }, + { + code: `import { StyleRules } from '@material-ui/core/styles/withStyles';`, + }, + { + code: `import { CreateCSSProperties, StyledComponentProps } from '@material-ui/core/styles/withStyles';`, + }, + ], + invalid: [ + { + code: `import { Box, Typography } from '@material-ui/core';`, + errors: [{ messageId: 'topLevelImport' }], + output: `import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography';`, + }, + { + code: `import { Box } from '@material-ui/core';`, + errors: [{ messageId: 'topLevelImport' }], + output: `import Box from '@material-ui/core/Box';`, + }, + { + code: `import { + Box, + DialogActions, + DialogContent, + DialogTitle, + Grid, + makeStyles, + } from '@material-ui/core';`, + errors: [{ messageId: 'topLevelImport' }], + output: `import Box from '@material-ui/core/Box'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles } from '@material-ui/core/styles';`, + }, + { + code: `import { Box, Button, makeStyles } from '@material-ui/core';`, + errors: [{ messageId: 'topLevelImport' }], + output: `import Box from '@material-ui/core/Box'; +import Button from '@material-ui/core/Button'; +import { makeStyles } from '@material-ui/core/styles';`, + }, + { + code: `import { Paper, Typography, styled, withStyles } from '@material-ui/core';`, + errors: [{ messageId: 'topLevelImport' }], + output: `import Paper from '@material-ui/core/Paper'; +import Typography from '@material-ui/core/Typography'; +import { styled, withStyles } from '@material-ui/core/styles';`, + }, + { + code: `import { styled } from '@material-ui/core';`, + errors: [{ messageId: 'topLevelImport' }], + output: `import { styled } from '@material-ui/core/styles';`, + }, + { + code: `import { SvgIcon, SvgIconProps } from '@material-ui/core';`, + errors: [{ messageId: 'topLevelImport' }], + output: `import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon';`, + }, + { + code: `import { TabProps } from '@material-ui/core';`, + errors: [{ messageId: 'topLevelImport' }], + output: `import { TabProps } from '@material-ui/core/Tab';`, + }, + ], +}); diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index 106f7172e1..d7c7816449 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/frontend-app-api +## 0.5.0 + +### Minor Changes + +- d4149bf: **BREAKING**: Renamed the `app/router` extension to `app/root`. +- 074dfe3: Attaching extensions to an input that does not exist is now a warning rather than an error. + +### Patch Changes + +- 7d63b32: Accepts sub route refs on the new `createPlugin` routes map. +- 516fd3e: Updated README to reflect release status +- c97fa1c: Added `elements`, `wrappers`, and `router` inputs to `app/root`, that let you add things to the root of the React tree above the layout. You can use the `createAppRootElementExtension`, `createAppRootWrapperExtension`, and `createRouterExtension` extension creator, respectively, to conveniently create such extensions. These are all optional, and if you do not supply a router a default one will be used (`BrowserRouter` in regular runs, `MemoryRouter` in tests/CI). +- 5fe6600: add oauth dialog and alert display to the root elements +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.3 + - @backstage/errors@1.2.3 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 0.4.1-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + ## 0.4.1-next.1 ### Patch Changes diff --git a/packages/frontend-app-api/README.md b/packages/frontend-app-api/README.md index 8b2fe5dc23..256ae99462 100644 --- a/packages/frontend-app-api/README.md +++ b/packages/frontend-app-api/README.md @@ -1,8 +1,8 @@ # @backstage/frontend-app-api -**This package is EXPERIMENTAL, we recommend against using it for production deployments** +**The [new frontend system](https://backstage.io/docs/frontend-system/) that this package is part of is in alpha, and we do not yet recommend using it for production deployments** -This package provides the core API used by Backstage frontend apps. It implements the design outlined in [RFC: Frontend System Evolution](https://github.com/backstage/backstage/issues/18372). +This package provides the framework API used by Backstage frontend apps. It implements the design outlined in [RFC: Frontend System Evolution](https://github.com/backstage/backstage/issues/18372). ## Documentation diff --git a/packages/frontend-app-api/api-report.md b/packages/frontend-app-api/api-report.md index e7dd584734..d0aadb7e8c 100644 --- a/packages/frontend-app-api/api-report.md +++ b/packages/frontend-app-api/api-report.md @@ -8,12 +8,16 @@ import { ConfigApi } from '@backstage/core-plugin-api'; import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; import { ExternalRouteRef } from '@backstage/frontend-plugin-api'; import { FrontendFeature } from '@backstage/frontend-plugin-api'; +import { IconComponent } from '@backstage/core-plugin-api'; import { JSX as JSX_2 } from 'react'; import { RouteRef } from '@backstage/frontend-plugin-api'; import { SubRouteRef } from '@backstage/frontend-plugin-api'; // @public (undocumented) export function createApp(options?: { + icons?: { + [key in string]: IconComponent; + }; features?: (FrontendFeature | CreateAppFeatureLoader)[]; configLoader?: () => Promise<{ config: ConfigApi; @@ -49,6 +53,9 @@ export function createExtensionTree(options: { config: Config }): ExtensionTree; // @public export function createSpecializedApp(options?: { + icons?: { + [key in string]: IconComponent; + }; features?: FrontendFeature[]; config?: ConfigApi; bindRoutes?(context: { bind: CreateAppRouteBinder }): void; diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 620cc19190..440f0cdb3f 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-app-api", - "version": "0.4.1-next.1", + "version": "0.5.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/frontend-app-api/src/apis/implementations/IconsApi/DefaultIconsApi.ts b/packages/frontend-app-api/src/apis/implementations/IconsApi/DefaultIconsApi.ts new file mode 100644 index 0000000000..53a7fa6421 --- /dev/null +++ b/packages/frontend-app-api/src/apis/implementations/IconsApi/DefaultIconsApi.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 { IconComponent, IconsApi } from '@backstage/frontend-plugin-api'; + +/** + * Implementation for the {@link IconsApi} + * + * @internal + */ +export class DefaultIconsApi implements IconsApi { + #icons: Map; + + constructor(icons: { [key in string]: IconComponent }) { + this.#icons = new Map(Object.entries(icons)); + } + + getIcon(key: string): IconComponent | undefined { + return this.#icons.get(key); + } + + listIconKeys(): string[] { + return Array.from(this.#icons.keys()); + } +} diff --git a/plugins/scaffolder/src/legacy/TemplateEditorPage/index.ts b/packages/frontend-app-api/src/apis/implementations/IconsApi/index.ts similarity index 91% rename from plugins/scaffolder/src/legacy/TemplateEditorPage/index.ts rename to packages/frontend-app-api/src/apis/implementations/IconsApi/index.ts index 7de0d3c679..e07f6379ed 100644 --- a/plugins/scaffolder/src/legacy/TemplateEditorPage/index.ts +++ b/packages/frontend-app-api/src/apis/implementations/IconsApi/index.ts @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { TemplateEditorPage } from './TemplateEditorPage'; + +export { DefaultIconsApi } from './DefaultIconsApi'; diff --git a/packages/frontend-app-api/src/extensions/Core.tsx b/packages/frontend-app-api/src/extensions/App.tsx similarity index 97% rename from packages/frontend-app-api/src/extensions/Core.tsx rename to packages/frontend-app-api/src/extensions/App.tsx index ea722ce862..751a255fa7 100644 --- a/packages/frontend-app-api/src/extensions/Core.tsx +++ b/packages/frontend-app-api/src/extensions/App.tsx @@ -24,7 +24,7 @@ import { createTranslationExtension, } from '@backstage/frontend-plugin-api'; -export const Core = createExtension({ +export const App = createExtension({ namespace: 'app', attachTo: { id: 'root', input: 'default' }, // ignored inputs: { diff --git a/packages/frontend-app-api/src/extensions/CoreLayout.tsx b/packages/frontend-app-api/src/extensions/AppLayout.tsx similarity index 93% rename from packages/frontend-app-api/src/extensions/CoreLayout.tsx rename to packages/frontend-app-api/src/extensions/AppLayout.tsx index 2d65dff73a..7be0029c25 100644 --- a/packages/frontend-app-api/src/extensions/CoreLayout.tsx +++ b/packages/frontend-app-api/src/extensions/AppLayout.tsx @@ -22,10 +22,10 @@ import { } from '@backstage/frontend-plugin-api'; import { SidebarPage } from '@backstage/core-components'; -export const CoreLayout = createExtension({ +export const AppLayout = createExtension({ namespace: 'app', name: 'layout', - attachTo: { id: 'app/router', input: 'children' }, + attachTo: { id: 'app/root', input: 'children' }, inputs: { nav: createExtensionInput( { diff --git a/packages/frontend-app-api/src/extensions/CoreNav.tsx b/packages/frontend-app-api/src/extensions/AppNav.tsx similarity index 98% rename from packages/frontend-app-api/src/extensions/CoreNav.tsx rename to packages/frontend-app-api/src/extensions/AppNav.tsx index 9c0ac5e85a..c5bf028ef8 100644 --- a/packages/frontend-app-api/src/extensions/CoreNav.tsx +++ b/packages/frontend-app-api/src/extensions/AppNav.tsx @@ -78,7 +78,7 @@ const SidebarNavItem = ( return ; }; -export const CoreNav = createExtension({ +export const AppNav = createExtension({ namespace: 'app', name: 'nav', attachTo: { id: 'app/layout', input: 'nav' }, diff --git a/packages/frontend-app-api/src/extensions/CoreRouter.tsx b/packages/frontend-app-api/src/extensions/AppRoot.tsx similarity index 73% rename from packages/frontend-app-api/src/extensions/CoreRouter.tsx rename to packages/frontend-app-api/src/extensions/AppRoot.tsx index 5c823c2e60..2b709f4e42 100644 --- a/packages/frontend-app-api/src/extensions/CoreRouter.tsx +++ b/packages/frontend-app-api/src/extensions/AppRoot.tsx @@ -14,11 +14,20 @@ * limitations under the License. */ -import React, { ComponentType, ReactNode, useContext, useState } from 'react'; +import React, { + ComponentType, + Fragment, + PropsWithChildren, + ReactNode, + useContext, + useState, +} from 'react'; import { coreExtensionData, + createAppRootWrapperExtension, createExtension, createExtensionInput, + createRouterExtension, createSignInPageExtension, } from '@backstage/frontend-plugin-api'; import { @@ -34,32 +43,54 @@ import { AppIdentityProxy } from '../../../core-app-api/src/apis/implementations import { BrowserRouter } from 'react-router-dom'; import { RouteTracker } from '../routing/RouteTracker'; -export const CoreRouter = createExtension({ +export const AppRoot = createExtension({ namespace: 'app', - name: 'router', + name: 'root', attachTo: { id: 'app', input: 'root' }, inputs: { + router: createExtensionInput( + { component: createRouterExtension.componentDataRef }, + { singleton: true, optional: true }, + ), signInPage: createExtensionInput( - { - component: createSignInPageExtension.componentDataRef, - }, + { component: createSignInPageExtension.componentDataRef }, { singleton: true, optional: true }, ), children: createExtensionInput( - { - element: coreExtensionData.reactElement, - }, + { element: coreExtensionData.reactElement }, { singleton: true }, ), + elements: createExtensionInput({ + element: coreExtensionData.reactElement, + }), + wrappers: createExtensionInput({ + component: createAppRootWrapperExtension.componentDataRef, + }), }, output: { element: coreExtensionData.reactElement, }, factory({ inputs }) { + let content: React.ReactNode = ( + <> + {inputs.elements.map(el => ( + {el.output.element} + ))} + {inputs.children.output.element} + + ); + + for (const wrapper of inputs.wrappers) { + content = {content}; + } + return { element: ( - - {inputs.children.output.element} + + {content} ), }; @@ -111,12 +142,18 @@ function SignInPageWrapper({ export interface AppRouterProps { children?: ReactNode; SignInPageComponent?: ComponentType; + RouterComponent?: ComponentType>; +} + +function DefaultRouter(props: PropsWithChildren<{}>) { + const configApi = useApi(configApiRef); + const basePath = getBasePath(configApi); + return {props.children}; } /** * App router and sign-in page wrapper. * - * @public * @remarks * * The AppRouter provides the routing context and renders the sign-in page. @@ -125,7 +162,11 @@ export interface AppRouterProps { * the app, while providing routing and route tracking for the app. */ export function AppRouter(props: AppRouterProps) { - const { children, SignInPageComponent } = props; + const { + children, + SignInPageComponent, + RouterComponent = DefaultRouter, + } = props; const configApi = useApi(configApiRef); const basePath = getBasePath(configApi); @@ -161,15 +202,15 @@ export function AppRouter(props: AppRouterProps) { ); return ( - + {children} - + ); } return ( - + {children} - + ); } diff --git a/packages/frontend-app-api/src/extensions/CoreRoutes.tsx b/packages/frontend-app-api/src/extensions/AppRoutes.tsx similarity index 97% rename from packages/frontend-app-api/src/extensions/CoreRoutes.tsx rename to packages/frontend-app-api/src/extensions/AppRoutes.tsx index d66c857f3b..38a9291755 100644 --- a/packages/frontend-app-api/src/extensions/CoreRoutes.tsx +++ b/packages/frontend-app-api/src/extensions/AppRoutes.tsx @@ -24,7 +24,7 @@ import { } from '@backstage/frontend-plugin-api'; import { useRoutes } from 'react-router-dom'; -export const CoreRoutes = createExtension({ +export const AppRoutes = createExtension({ namespace: 'app', name: 'routes', attachTo: { id: 'app/layout', input: 'content' }, @@ -57,6 +57,7 @@ export const CoreRoutes = createExtension({ return element; }; + return { element: , }; diff --git a/packages/frontend-app-api/src/extensions/elements.tsx b/packages/frontend-app-api/src/extensions/elements.tsx new file mode 100644 index 0000000000..0a764583bb --- /dev/null +++ b/packages/frontend-app-api/src/extensions/elements.tsx @@ -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 { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components'; +import { + createAppRootElementExtension, + createSchemaFromZod, +} from '@backstage/frontend-plugin-api'; +import React from 'react'; + +export const oauthRequestDialogAppRootElement = createAppRootElementExtension({ + namespace: 'app', + name: 'oauth-request-dialog', + element: , +}); + +export const alertDisplayAppRootElement = createAppRootElementExtension({ + namespace: 'app', + name: 'alert-display', + configSchema: createSchemaFromZod(z => + z.object({ + transientTimeoutMs: z.number().default(5000), + anchorOrigin: z + .object({ + vertical: z.enum(['top', 'bottom']).default('top'), + horizontal: z.enum(['left', 'center', 'right']).default('center'), + }) + .default({}), + }), + ), + element: ({ config }) => , +}); diff --git a/packages/frontend-app-api/src/routing/collectRouteIds.ts b/packages/frontend-app-api/src/routing/collectRouteIds.ts index 1d6aa14e5d..2fbb8b6791 100644 --- a/packages/frontend-app-api/src/routing/collectRouteIds.ts +++ b/packages/frontend-app-api/src/routing/collectRouteIds.ts @@ -21,9 +21,14 @@ import { FrontendFeature, } from '@backstage/frontend-plugin-api'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { toInternalRouteRef } from '../../../frontend-plugin-api/src/routing/RouteRef'; +import { + isRouteRef, + toInternalRouteRef, +} from '../../../frontend-plugin-api/src/routing/RouteRef'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { toInternalExternalRouteRef } from '../../../frontend-plugin-api/src/routing/ExternalRouteRef'; +// eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { toInternalSubRouteRef } from '../../../frontend-plugin-api/src/routing/SubRouteRef'; /** @internal */ export interface RouteRefsById { @@ -47,9 +52,14 @@ export function collectRouteIds(features: FrontendFeature[]): RouteRefsById { throw new Error(`Unexpected duplicate route '${refId}'`); } - const internalRef = toInternalRouteRef(ref); - internalRef.setId(refId); - routesById.set(refId, ref); + if (isRouteRef(ref)) { + const internalRef = toInternalRouteRef(ref); + internalRef.setId(refId); + routesById.set(refId, ref); + } else { + const internalRef = toInternalSubRouteRef(ref); + routesById.set(refId, internalRef); + } } for (const [name, ref] of Object.entries(feature.externalRoutes)) { const refId = `plugin.${feature.id}.externalRoutes.${name}`; diff --git a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts index 7855b87df2..766cb4804e 100644 --- a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts +++ b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts @@ -30,6 +30,7 @@ import { AppNodeSpec } from '@backstage/frontend-plugin-api'; import { resolveAppTree } from './resolveAppTree'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { resolveExtensionDefinition } from '../../../frontend-plugin-api/src/wiring/resolveExtensionDefinition'; +import { withLogCollector } from '@backstage/test-utils'; const testDataRef = createExtensionDataRef('test'); const otherDataRef = createExtensionDataRef('other'); @@ -433,8 +434,8 @@ describe('createAppNodeInstance', () => { ); }); - it('should refuse to create an instance with undeclared inputs', () => { - expect(() => + it('should warn when creating an instance with undeclared inputs', () => { + const { warn } = withLogCollector(['warn'], () => createAppNodeInstance({ attachments: new Map([ [ @@ -458,7 +459,7 @@ describe('createAppNodeInstance', () => { resolveExtensionDefinition( createExtension({ namespace: 'app', - name: 'test', + name: 'parent', attachTo: { id: 'ignored', input: 'ignored' }, inputs: { declared: createExtensionInput({ @@ -471,13 +472,15 @@ describe('createAppNodeInstance', () => { ), ), }), - ).toThrow( - "Failed to instantiate extension 'app/test', received undeclared input 'undeclared' from extension 'app/test'", ); + + expect(warn).toEqual([ + "The extension 'app/test' is attached to the input 'undeclared' of the extension 'app/parent', but it has no such input (candidates are 'declared')", + ]); }); it('should refuse to create an instance with multiple undeclared inputs', () => { - expect(() => + const { warn } = withLogCollector(['warn'], () => createAppNodeInstance({ attachments: new Map([ [ @@ -496,7 +499,7 @@ describe('createAppNodeInstance', () => { resolveExtensionDefinition( createExtension({ namespace: 'app', - name: 'test', + name: 'parent', attachTo: { id: 'ignored', input: 'ignored' }, output: {}, factory: () => ({}), @@ -504,9 +507,12 @@ describe('createAppNodeInstance', () => { ), ), }), - ).toThrow( - "Failed to instantiate extension 'app/test', received undeclared inputs 'undeclared1' from extension 'app/test' and 'undeclared2' from extensions 'app/test', 'app/test'", ); + + expect(warn).toEqual([ + "The extension 'app/test' is attached to the input 'undeclared1' of the extension 'app/parent', but it has no inputs", + "The extensions 'app/test', 'app/test' are attached to the input 'undeclared2' of the extension 'app/parent', but it has no inputs", + ]); }); it('should refuse to create an instance with multiple inputs for required singleton', () => { diff --git a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts index f72fcdd0cb..90a256fea6 100644 --- a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts +++ b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts @@ -46,26 +46,32 @@ function resolveInputData( } function resolveInputs( + id: string, inputMap: AnyExtensionInputMap, attachments: ReadonlyMap, ): ResolvedExtensionInputs { const undeclaredAttachments = Array.from(attachments.entries()).filter( ([inputName]) => inputMap[inputName] === undefined, ); - // TODO: Make this a warning rather than an error - if (undeclaredAttachments.length > 0) { - throw new Error( - `received undeclared input${ - undeclaredAttachments.length > 1 ? 's' : '' - } ${undeclaredAttachments - .map( - ([k, exts]) => - `'${k}' from extension${exts.length > 1 ? 's' : ''} '${exts - .map(e => e.spec.id) - .join("', '")}'`, - ) - .join(' and ')}`, - ); + + if (process.env.NODE_ENV !== 'production') { + const inputNames = Object.keys(inputMap); + + for (const [name, nodes] of undeclaredAttachments) { + const pl = nodes.length > 1; + // eslint-disable-next-line no-console + console.warn( + [ + `The extension${pl ? 's' : ''} '${nodes + .map(n => n.spec.id) + .join("', '")}' ${pl ? 'are' : 'is'}`, + `attached to the input '${name}' of the extension '${id}', but it`, + inputNames.length === 0 + ? 'has no inputs' + : `has no such input (candidates are '${inputNames.join("', '")}')`, + ].join(' '), + ); + } } return mapValues(inputMap, (input, inputName) => { @@ -129,7 +135,7 @@ export function createAppNodeInstance(options: { const namedOutputs = internalExtension.factory({ node, config: parsedConfig, - inputs: resolveInputs(internalExtension.inputs, attachments), + inputs: resolveInputs(id, internalExtension.inputs, attachments), }); for (const [name, output] of Object.entries(namedOutputs)) { diff --git a/packages/frontend-app-api/src/tree/readAppExtensionsConfig.test.ts b/packages/frontend-app-api/src/tree/readAppExtensionsConfig.test.ts index 4531947f9a..440407549e 100644 --- a/packages/frontend-app-api/src/tree/readAppExtensionsConfig.test.ts +++ b/packages/frontend-app-api/src/tree/readAppExtensionsConfig.test.ts @@ -25,18 +25,18 @@ describe('readAppExtensionsConfig', () => { it('should disable extension with shorthand notation', () => { expect( readAppExtensionsConfig( - new ConfigReader({ app: { extensions: [{ 'app/router': false }] } }), + new ConfigReader({ app: { extensions: [{ 'app/root': false }] } }), ), ).toEqual([ { - id: 'app/router', + id: 'app/root', disabled: true, }, ]); expect( readAppExtensionsConfig( new ConfigReader({ - app: { extensions: [{ 'app/router': { disabled: true } }] }, + app: { extensions: [{ 'app/root': { disabled: true } }] }, }), ), ).toEqual([ @@ -44,7 +44,7 @@ describe('readAppExtensionsConfig', () => { at: undefined, config: undefined, disabled: true, - id: 'app/router', + id: 'app/root', }, ]); }); @@ -52,33 +52,33 @@ describe('readAppExtensionsConfig', () => { it('should enable extension with shorthand notation', () => { expect( readAppExtensionsConfig( - new ConfigReader({ app: { extensions: ['app/router'] } }), + new ConfigReader({ app: { extensions: ['app/root'] } }), ), ).toEqual([ { - id: 'app/router', + id: 'app/root', disabled: false, }, ]); expect( readAppExtensionsConfig( - new ConfigReader({ app: { extensions: [{ 'app/router': true }] } }), + new ConfigReader({ app: { extensions: [{ 'app/root': true }] } }), ), ).toEqual([ { - id: 'app/router', + id: 'app/root', disabled: false, }, ]); expect( readAppExtensionsConfig( new ConfigReader({ - app: { extensions: [{ 'app/router': { disabled: false } }] }, + app: { extensions: [{ 'app/root': { disabled: false } }] }, }), ), ).toEqual([ { - id: 'app/router', + id: 'app/root', disabled: false, }, ]); @@ -89,12 +89,12 @@ describe('readAppExtensionsConfig', () => { readAppExtensionsConfig( new ConfigReader({ app: { - extensions: [{ 'app/router': 'some-string' }], + extensions: [{ 'app/root': 'some-string' }], }, }), ), ).toThrow( - 'Invalid extension configuration at app.extensions[0][app/router], value must be a boolean or object', + 'Invalid extension configuration at app.extensions[0][app/root], value must be a boolean or object', ); }); @@ -156,8 +156,8 @@ describe('expandShorthandExtensionParameters', () => { }); it('supports string key', () => { - expect(run('app/router')).toEqual({ - id: 'app/router', + expect(run('app/root')).toEqual({ + id: 'app/root', disabled: false, }); expect(() => run('')).toThrowErrorMatchingInlineSnapshot( @@ -170,96 +170,96 @@ describe('expandShorthandExtensionParameters', () => { it('supports null value', () => { // this is the result of typing: - // - app/router: + // - app/root: // The missing value is interpreted as null by the yaml parser so we deal with that - expect(run({ 'app/router': null })).toEqual({ - id: 'app/router', + expect(run({ 'app/root': null })).toEqual({ + id: 'app/root', disabled: false, }); }); it('supports boolean value', () => { - expect(run({ 'app/router': true })).toEqual({ - id: 'app/router', + expect(run({ 'app/root': true })).toEqual({ + id: 'app/root', disabled: false, }); - expect(run({ 'app/router': false })).toEqual({ - id: 'app/router', + expect(run({ 'app/root': false })).toEqual({ + id: 'app/root', disabled: true, }); }); it('should not support string values', () => { expect(() => - run({ 'app/router': 'example-package#MyRouter' }), + run({ 'app/root': 'example-package#MyRouter' }), ).toThrowErrorMatchingInlineSnapshot( - `"Invalid extension configuration at app.extensions[1][app/router], value must be a boolean or object"`, + `"Invalid extension configuration at app.extensions[1][app/root], value must be a boolean or object"`, ); }); it('supports object id only in the key', () => { expect(() => - run({ 'app/router': { id: 'some.id' } }), + run({ 'app/root': { id: 'some.id' } }), ).toThrowErrorMatchingInlineSnapshot( - `"Invalid extension configuration at app.extensions[1][app/router].id, unknown parameter; expected one of 'attachTo', 'disabled', 'config'"`, + `"Invalid extension configuration at app.extensions[1][app/root].id, unknown parameter; expected one of 'attachTo', 'disabled', 'config'"`, ); }); it('supports object attachTo', () => { expect( run({ - 'app/router': { attachTo: { id: 'other.root', input: 'inputs' } }, + 'app/root': { attachTo: { id: 'other.root', input: 'inputs' } }, }), ).toEqual({ - id: 'app/router', + id: 'app/root', attachTo: { id: 'other.root', input: 'inputs' }, }); expect(() => run({ - 'app/router': { + 'app/root': { id: 'other-id', }, }), ).toThrowErrorMatchingInlineSnapshot( - `"Invalid extension configuration at app.extensions[1][app/router].id, unknown parameter; expected one of 'attachTo', 'disabled', 'config'"`, + `"Invalid extension configuration at app.extensions[1][app/root].id, unknown parameter; expected one of 'attachTo', 'disabled', 'config'"`, ); }); it('supports object disabled', () => { - expect(run({ 'app/router': { disabled: true } })).toEqual({ - id: 'app/router', + expect(run({ 'app/root': { disabled: true } })).toEqual({ + id: 'app/root', disabled: true, }); - expect(run({ 'app/router': { disabled: false } })).toEqual({ - id: 'app/router', + expect(run({ 'app/root': { disabled: false } })).toEqual({ + id: 'app/root', disabled: false, }); expect(() => - run({ 'app/router': { disabled: 0 } }), + run({ 'app/root': { disabled: 0 } }), ).toThrowErrorMatchingInlineSnapshot( - `"Invalid extension configuration at app.extensions[1][app/router].disabled, must be a boolean"`, + `"Invalid extension configuration at app.extensions[1][app/root].disabled, must be a boolean"`, ); }); it('supports object config', () => { - expect( - run({ 'app/router': { config: { disableRedirects: true } } }), - ).toEqual({ - id: 'app/router', - config: { disableRedirects: true }, - }); + expect(run({ 'app/root': { config: { disableRedirects: true } } })).toEqual( + { + id: 'app/root', + config: { disableRedirects: true }, + }, + ); expect(() => - run({ 'app/router': { config: 0 } }), + run({ 'app/root': { config: 0 } }), ).toThrowErrorMatchingInlineSnapshot( - `"Invalid extension configuration at app.extensions[1][app/router].config, must be an object"`, + `"Invalid extension configuration at app.extensions[1][app/root].config, must be an object"`, ); }); it('rejects unknown object keys', () => { expect(() => - run({ 'app/router': { foo: { settings: true } } }), + run({ 'app/root': { foo: { settings: true } } }), ).toThrowErrorMatchingInlineSnapshot( - `"Invalid extension configuration at app.extensions[1][app/router].foo, unknown parameter; expected one of 'attachTo', 'disabled', 'config'"`, + `"Invalid extension configuration at app.extensions[1][app/root].foo, unknown parameter; expected one of 'attachTo', 'disabled', 'config'"`, ); }); }); diff --git a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts index 8dfa7aeea9..82f274b960 100644 --- a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts +++ b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts @@ -33,6 +33,7 @@ function makeExt( id, attachTo: { id: attachId, input: 'default' }, disabled: status === 'disabled', + toString: expect.any(Function), } as Extension; } diff --git a/packages/frontend-app-api/src/wiring/createApp.test.tsx b/packages/frontend-app-api/src/wiring/createApp.test.tsx index d5a206e7fb..43bb4499b1 100644 --- a/packages/frontend-app-api/src/wiring/createApp.test.tsx +++ b/packages/frontend-app-api/src/wiring/createApp.test.tsx @@ -194,7 +194,7 @@ describe('createApp', () => { extensions: [ createExtension({ namespace: 'app', - name: 'router', + name: 'root', attachTo: { id: 'app', input: 'root' }, disabled: true, output: {}, @@ -244,7 +244,7 @@ describe('createApp', () => { expect(String(tree.root)).toMatchInlineSnapshot(` " root [ - + children [ content [ @@ -259,7 +259,11 @@ describe('createApp', () => { ] ] - + elements [ + + + ] + ] components [ diff --git a/packages/frontend-app-api/src/wiring/createApp.tsx b/packages/frontend-app-api/src/wiring/createApp.tsx index 09a7034ffb..832aa2663b 100644 --- a/packages/frontend-app-api/src/wiring/createApp.tsx +++ b/packages/frontend-app-api/src/wiring/createApp.tsx @@ -29,13 +29,14 @@ import { createTranslationExtension, ExtensionDataRef, FrontendFeature, + iconsApiRef, RouteRef, useRouteRef, } from '@backstage/frontend-plugin-api'; -import { Core } from '../extensions/Core'; -import { CoreRoutes } from '../extensions/CoreRoutes'; -import { CoreLayout } from '../extensions/CoreLayout'; -import { CoreNav } from '../extensions/CoreNav'; +import { App } from '../extensions/App'; +import { AppRoutes } from '../extensions/AppRoutes'; +import { AppLayout } from '../extensions/AppLayout'; +import { AppNav } from '../extensions/AppNav'; import { AnyApiFactory, ApiHolder, @@ -78,6 +79,10 @@ import { apis as defaultApis } from '../../../app-defaults/src/defaults'; import { Route } from 'react-router-dom'; import { SidebarItem } from '@backstage/core-components'; import { DarkTheme, LightTheme } from '../extensions/themes'; +import { + oauthRequestDialogAppRootElement, + alertDisplayAppRootElement, +} from '../extensions/elements'; import { extractRouteInfoFromAppNode } from '../routing/extractRouteInfoFromAppNode'; import { appLanguageApiRef, @@ -95,27 +100,32 @@ import { } from '../extensions/components'; import { AppNode } from '@backstage/frontend-plugin-api'; import { InternalAppContext } from './InternalAppContext'; -import { CoreRouter } from '../extensions/CoreRouter'; +import { AppRoot } from '../extensions/AppRoot'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { toInternalBackstagePlugin } from '../../../frontend-plugin-api/src/wiring/createPlugin'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { toInternalExtensionOverrides } from '../../../frontend-plugin-api/src/wiring/createExtensionOverrides'; import { DefaultComponentsApi } from '../apis/implementations/ComponentsApi'; +import { DefaultIconsApi } from '../apis/implementations/IconsApi'; import { stringifyError } from '@backstage/errors'; +// eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { icons as defaultIcons } from '../../../app-defaults/src/defaults'; const DefaultApis = defaultApis.map(factory => createApiExtension({ factory })); export const builtinExtensions = [ - Core, - CoreRouter, - CoreRoutes, - CoreNav, - CoreLayout, + App, + AppRoot, + AppRoutes, + AppNav, + AppLayout, DefaultProgressComponent, DefaultErrorBoundaryComponent, DefaultNotFoundErrorPageComponent, LightTheme, DarkTheme, + oauthRequestDialogAppRootElement, + alertDisplayAppRootElement, ...DefaultApis, ].map(def => resolveExtensionDefinition(def)); @@ -263,6 +273,7 @@ export interface CreateAppFeatureLoader { /** @public */ export function createApp(options?: { + icons?: { [key in string]: IconComponent }; features?: (FrontendFeature | CreateAppFeatureLoader)[]; configLoader?: () => Promise<{ config: ConfigApi }>; bindRoutes?(context: { bind: CreateAppRouteBinder }): void; @@ -297,6 +308,7 @@ export function createApp(options?: { } const app = createSpecializedApp({ + icons: options?.icons, config, features: [...discoveredFeatures, ...providedFeatures], bindRoutes: options?.bindRoutes, @@ -324,6 +336,7 @@ export function createApp(options?: { * @public */ export function createSpecializedApp(options?: { + icons?: { [key in string]: IconComponent }; features?: FrontendFeature[]; config?: ConfigApi; bindRoutes?(context: { bind: CreateAppRouteBinder }): void; @@ -342,7 +355,12 @@ export function createSpecializedApp(options?: { }); const appIdentityProxy = new AppIdentityProxy(); - const apiHolder = createApiHolder(tree, config, appIdentityProxy); + const apiHolder = createApiHolder( + tree, + config, + appIdentityProxy, + options?.icons, + ); const featureFlagApi = apiHolder.get(featureFlagsApiRef); if (featureFlagApi) { @@ -371,7 +389,7 @@ export function createSpecializedApp(options?: { ); const rootEl = tree.root.instance!.getData(coreExtensionData.reactElement); - const App = () => ( + const AppComponent = () => ( @@ -387,7 +405,7 @@ export function createSpecializedApp(options?: { return { createRoot() { - return ; + return ; }, }; } @@ -396,6 +414,7 @@ function createApiHolder( tree: AppTree, configApi: ConfigApi, appIdentityProxy: AppIdentityProxy, + icons?: { [key in string]: IconComponent }, ): ApiHolder { const factoryRegistry = new ApiFactoryRegistry(); @@ -464,6 +483,12 @@ function createApiHolder( factory: () => new DefaultComponentsApi(componentsMap), }); + factoryRegistry.register('static', { + api: iconsApiRef, + deps: {}, + factory: () => new DefaultIconsApi({ ...defaultIcons, ...icons }), + }); + factoryRegistry.register('static', { api: appThemeApiRef, deps: {}, diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index d79ce6715b..c6ae8056ec 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/frontend-plugin-api +## 0.5.0 + +### Minor Changes + +- d4149bf: **BREAKING**: Renamed the `app/router` extension to `app/root`. + +### Patch Changes + +- b2d370e: Exposed `createComponentRef`, and ensured that produced refs and feature bits have a `toString` for easier debugging +- 7d63b32: Accepts sub route refs on the new `createPlugin` routes map. +- 516fd3e: Updated README to reflect release status +- 4016f21: Remove some unused dependencies +- c97fa1c: Added `elements`, `wrappers`, and `router` inputs to `app/root`, that let you add things to the root of the React tree above the layout. You can use the `createAppRootElementExtension`, `createAppRootWrapperExtension`, and `createRouterExtension` extension creator, respectively, to conveniently create such extensions. These are all optional, and if you do not supply a router a default one will be used (`BrowserRouter` in regular runs, `MemoryRouter` in tests/CI). +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 0.4.1-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status + ## 0.4.1-next.1 ### Patch Changes diff --git a/packages/frontend-plugin-api/README.md b/packages/frontend-plugin-api/README.md index 1fd3da79d8..aedf740840 100644 --- a/packages/frontend-plugin-api/README.md +++ b/packages/frontend-plugin-api/README.md @@ -1,8 +1,8 @@ # @backstage/frontend-plugin-api -**This package is EXPERIMENTAL, we recommend against using it for production deployments** +**The [new frontend system](https://backstage.io/docs/frontend-system/) that this package is part of is in alpha, and we do not yet recommend using it for production deployments** -This package provides the core API used by Backstage frontend plugins. It implements the design outlined in [RFC: Frontend System Evolution](https://github.com/backstage/backstage/issues/18372). +This package provides the framework API used by Backstage frontend plugins. It implements the design outlined in [RFC: Frontend System Evolution](https://github.com/backstage/backstage/issues/18372). ## Documentation diff --git a/packages/frontend-plugin-api/api-report.md b/packages/frontend-plugin-api/api-report.md index 46599bd6c4..3a7a0f3ee6 100644 --- a/packages/frontend-plugin-api/api-report.md +++ b/packages/frontend-plugin-api/api-report.md @@ -67,6 +67,7 @@ import { OpenIdConnectApi } from '@backstage/core-plugin-api'; import { PendingOAuthRequest } from '@backstage/core-plugin-api'; import { ProfileInfo } from '@backstage/core-plugin-api'; import { ProfileInfoApi } from '@backstage/core-plugin-api'; +import { PropsWithChildren } from 'react'; import { default as React_2 } from 'react'; import { ReactNode } from 'react'; import { SessionApi } from '@backstage/core-plugin-api'; @@ -180,7 +181,7 @@ export type AnyRouteRefParams = // @public (undocumented) export type AnyRoutes = { - [name in string]: RouteRef; + [name in string]: RouteRef | SubRouteRef; }; export { ApiFactory }; @@ -390,6 +391,61 @@ export { createApiFactory }; export { createApiRef }; +// @public +export function createAppRootElementExtension< + TConfig extends {}, + TInputs extends AnyExtensionInputMap, +>(options: { + namespace?: string; + name?: string; + attachTo?: { + id: string; + input: string; + }; + configSchema?: PortableSchema; + disabled?: boolean; + inputs?: TInputs; + element: + | JSX_2.Element + | ((options: { + inputs: Expand>; + config: TConfig; + }) => JSX_2.Element); +}): ExtensionDefinition; + +// @public +export function createAppRootWrapperExtension< + TConfig extends {}, + TInputs extends AnyExtensionInputMap, +>(options: { + namespace?: string; + name?: string; + attachTo?: { + id: string; + input: string; + }; + configSchema?: PortableSchema; + disabled?: boolean; + inputs?: TInputs; + Component: ComponentType< + PropsWithChildren<{ + inputs: Expand>; + config: TConfig; + }> + >; +}): ExtensionDefinition; + +// @public (undocumented) +export namespace createAppRootWrapperExtension { + const // (undocumented) + componentDataRef: ConfigurableExtensionDataRef< + React_2.ComponentType<{ + children?: React_2.ReactNode; + }>, + {} + >; +} + // @public (undocumented) export function createComponentExtension< TProps extends {}, @@ -428,6 +484,11 @@ export namespace createComponentExtension { >; } +// @public (undocumented) +export function createComponentRef(options: { + id: string; +}): ComponentRef; + // @public (undocumented) export function createExtension< TOutput extends AnyExtensionDataMap, @@ -626,6 +687,39 @@ export function createRouteRef< } >; +// @public +export function createRouterExtension< + TConfig extends {}, + TInputs extends AnyExtensionInputMap, +>(options: { + namespace?: string; + name?: string; + attachTo?: { + id: string; + input: string; + }; + configSchema?: PortableSchema; + disabled?: boolean; + inputs?: TInputs; + Component: ComponentType< + PropsWithChildren<{ + inputs: Expand>; + config: TConfig; + }> + >; +}): ExtensionDefinition; + +// @public (undocumented) +export namespace createRouterExtension { + const // (undocumented) + componentDataRef: ConfigurableExtensionDataRef< + React_2.ComponentType<{ + children?: React_2.ReactNode; + }>, + {} + >; +} + // @public (undocumented) export function createSchemaFromZod( schemaCreator: (zImpl: typeof z) => ZodSchema, @@ -882,6 +976,17 @@ export type IconComponent = ComponentType< } >; +// @public +export interface IconsApi { + // (undocumented) + getIcon(key: string): IconComponent | undefined; + // (undocumented) + listIconKeys(): string[]; +} + +// @public +export const iconsApiRef: ApiRef; + export { IdentityApi }; export { identityApiRef }; diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index aeb6f0b256..bc92f6f632 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-plugin-api", - "version": "0.4.1-next.1", + "version": "0.5.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -22,6 +22,21 @@ "prepack": "backstage-cli package prepack", "postpack": "backstage-cli package postpack" }, + "dependencies": { + "@backstage/core-components": "workspace:^", + "@backstage/core-plugin-api": "workspace:^", + "@backstage/types": "workspace:^", + "@backstage/version-bridge": "workspace:^", + "@material-ui/core": "^4.12.4", + "@types/react": "^16.13.1 || ^17.0.0", + "lodash": "^4.17.21", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.21.4" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" + }, "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/frontend-app-api": "workspace:^", @@ -33,20 +48,5 @@ }, "files": [ "dist" - ], - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-router-dom": "6.0.0-beta.0 || ^6.3.0" - }, - "dependencies": { - "@backstage/core-components": "workspace:^", - "@backstage/core-plugin-api": "workspace:^", - "@backstage/types": "workspace:^", - "@backstage/version-bridge": "workspace:^", - "@material-ui/core": "^4.12.4", - "@types/react": "^16.13.1 || ^17.0.0", - "lodash": "^4.17.21", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.21.4" - } + ] } diff --git a/packages/frontend-plugin-api/src/apis/definitions/IconsApi.ts b/packages/frontend-plugin-api/src/apis/definitions/IconsApi.ts new file mode 100644 index 0000000000..aa5b7f4fac --- /dev/null +++ b/packages/frontend-plugin-api/src/apis/definitions/IconsApi.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 { createApiRef } from '@backstage/core-plugin-api'; +import { IconComponent } from '../../icons'; + +/** + * API for accessing app icons. + * + * @public + */ +export interface IconsApi { + getIcon(key: string): IconComponent | undefined; + + listIconKeys(): string[]; +} + +/** + * The `ApiRef` of {@link IconsApi}. + * + * @public + */ +export const iconsApiRef = createApiRef({ + id: 'core.icons', +}); diff --git a/packages/frontend-plugin-api/src/apis/definitions/index.ts b/packages/frontend-plugin-api/src/apis/definitions/index.ts index f2496ee61a..c0a2101db0 100644 --- a/packages/frontend-plugin-api/src/apis/definitions/index.ts +++ b/packages/frontend-plugin-api/src/apis/definitions/index.ts @@ -40,6 +40,7 @@ export * from './DiscoveryApi'; export * from './ErrorApi'; export * from './FeatureFlagsApi'; export * from './FetchApi'; +export * from './IconsApi'; export * from './IdentityApi'; export * from './OAuthRequestApi'; export * from './StorageApi'; diff --git a/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx b/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx index d9bd41f2a9..9a8eb5b750 100644 --- a/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx +++ b/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx @@ -25,7 +25,7 @@ import { ErrorBoundary } from './ErrorBoundary'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { routableExtensionRenderedEvent } from '../../../core-plugin-api/src/analytics/Tracker'; import { AppNode, useComponentRef } from '../apis'; -import { coreComponentRefs } from './ComponentRef'; +import { coreComponentRefs } from './coreComponentRefs'; type RouteTrackerProps = PropsWithChildren<{ disableTracking?: boolean; diff --git a/packages/frontend-plugin-api/src/components/ComponentRef.tsx b/packages/frontend-plugin-api/src/components/coreComponentRefs.ts similarity index 82% rename from packages/frontend-plugin-api/src/components/ComponentRef.tsx rename to packages/frontend-plugin-api/src/components/coreComponentRefs.ts index 50df9552ec..64412b8710 100644 --- a/packages/frontend-plugin-api/src/components/ComponentRef.tsx +++ b/packages/frontend-plugin-api/src/components/coreComponentRefs.ts @@ -19,22 +19,7 @@ import { CoreNotFoundErrorPageProps, CoreProgressProps, } from '../types'; - -/** @public */ -export type ComponentRef = { - id: string; - T: T; -}; - -/** @public */ -export function createComponentRef(options: { - id: string; -}): ComponentRef { - const { id } = options; - return { - id, - } as ComponentRef; -} +import { createComponentRef } from './createComponentRef'; const coreProgressComponentRef = createComponentRef({ id: 'core.components.progress', diff --git a/packages/frontend-plugin-api/src/components/createComponentRef.test.tsx b/packages/frontend-plugin-api/src/components/createComponentRef.test.tsx new file mode 100644 index 0000000000..9a84fe08fa --- /dev/null +++ b/packages/frontend-plugin-api/src/components/createComponentRef.test.tsx @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createComponentRef } from './createComponentRef'; + +describe('createComponentRef', () => { + it('can be created and read', () => { + const ref = createComponentRef({ id: 'foo' }); + expect(ref.id).toBe('foo'); + expect(String(ref)).toBe('ComponentRef{id=foo}'); + }); +}); diff --git a/packages/frontend-plugin-api/src/components/createComponentRef.tsx b/packages/frontend-plugin-api/src/components/createComponentRef.tsx new file mode 100644 index 0000000000..88181dd079 --- /dev/null +++ b/packages/frontend-plugin-api/src/components/createComponentRef.tsx @@ -0,0 +1,34 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @public */ +export type ComponentRef = { + id: string; + T: T; +}; + +/** @public */ +export function createComponentRef(options: { + id: string; +}): ComponentRef { + const { id } = options; + return { + id, + toString() { + return `ComponentRef{id=${id}}`; + }, + } as ComponentRef; +} diff --git a/packages/frontend-plugin-api/src/components/index.ts b/packages/frontend-plugin-api/src/components/index.ts index 893918059b..5066144000 100644 --- a/packages/frontend-plugin-api/src/components/index.ts +++ b/packages/frontend-plugin-api/src/components/index.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -export { coreComponentRefs, type ComponentRef } from './ComponentRef'; - export { ExtensionBoundary, type ExtensionBoundaryProps, } from './ExtensionBoundary'; +export { coreComponentRefs } from './coreComponentRefs'; +export { createComponentRef, type ComponentRef } from './createComponentRef'; diff --git a/packages/frontend-plugin-api/src/extensions/createApiExtension.test.ts b/packages/frontend-plugin-api/src/extensions/createApiExtension.test.ts index 0636d0d79d..c4d0239094 100644 --- a/packages/frontend-plugin-api/src/extensions/createApiExtension.test.ts +++ b/packages/frontend-plugin-api/src/extensions/createApiExtension.test.ts @@ -47,6 +47,7 @@ describe('createApiExtension', () => { }), }, factory: expect.any(Function), + toString: expect.any(Function), }); }); @@ -83,6 +84,7 @@ describe('createApiExtension', () => { }), }, factory: expect.any(Function), + toString: expect.any(Function), }); }); }); diff --git a/packages/frontend-plugin-api/src/extensions/createAppRootElementExtension.test.tsx b/packages/frontend-plugin-api/src/extensions/createAppRootElementExtension.test.tsx new file mode 100644 index 0000000000..c8bf6ee355 --- /dev/null +++ b/packages/frontend-plugin-api/src/extensions/createAppRootElementExtension.test.tsx @@ -0,0 +1,107 @@ +/* + * 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 { createExtensionTester } from '@backstage/frontend-test-utils'; +import { screen } from '@testing-library/react'; +import React from 'react'; +import { createSchemaFromZod } from '../schema/createSchemaFromZod'; +import { coreExtensionData } from '../wiring/coreExtensionData'; +import { createExtension } from '../wiring/createExtension'; +import { createExtensionInput } from '../wiring/createExtensionInput'; +import { createAppRootElementExtension } from './createAppRootElementExtension'; + +describe('createAppRootElementExtension', () => { + it('works with simple options and just an element', async () => { + const extension = createAppRootElementExtension({ + element:
Hello
, + }); + + expect(extension).toEqual({ + $$type: '@backstage/ExtensionDefinition', + version: 'v1', + kind: 'app-root-element', + attachTo: { id: 'app/root', input: 'elements' }, + disabled: false, + inputs: {}, + output: { + element: expect.anything(), + }, + factory: expect.any(Function), + toString: expect.any(Function), + }); + + createExtensionTester(extension).render(); + + await expect(screen.findByText('Hello')).resolves.toBeInTheDocument(); + }); + + it('works with complex options and a callback', async () => { + const schema = createSchemaFromZod(z => z.object({ name: z.string() })); + + const extension = createAppRootElementExtension({ + namespace: 'ns', + name: 'test', + configSchema: schema, + attachTo: { id: 'other', input: 'slot' }, + disabled: true, + inputs: { + children: createExtensionInput({ + element: coreExtensionData.reactElement, + }), + }, + element: ({ inputs, config }) => ( +
+ Hello, {config.name}, {inputs.children.length} +
+ ), + }); + + expect(extension).toEqual({ + $$type: '@backstage/ExtensionDefinition', + version: 'v1', + kind: 'app-root-element', + namespace: 'ns', + name: 'test', + attachTo: { id: 'other', input: 'slot' }, + configSchema: schema, + disabled: true, + inputs: { + children: createExtensionInput({ + element: coreExtensionData.reactElement, + }), + }, + output: { + element: expect.anything(), + }, + factory: expect.any(Function), + toString: expect.any(Function), + }); + + createExtensionTester(extension, { config: { name: 'Robin' } }) + .add( + createExtension({ + attachTo: { id: 'app-root-element:ns/test', input: 'children' }, + output: { element: coreExtensionData.reactElement }, + factory: () => ({ element:
}), + }), + ) + .render(); + + await expect( + screen.findByText('Hello, Robin, 1'), + ).resolves.toBeInTheDocument(); + }); +}); diff --git a/packages/frontend-plugin-api/src/extensions/createAppRootElementExtension.ts b/packages/frontend-plugin-api/src/extensions/createAppRootElementExtension.ts new file mode 100644 index 0000000000..8be82d5540 --- /dev/null +++ b/packages/frontend-plugin-api/src/extensions/createAppRootElementExtension.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 { JSX } from 'react'; +import { PortableSchema } from '../schema/types'; +import { Expand } from '../types'; +import { coreExtensionData } from '../wiring/coreExtensionData'; +import { + AnyExtensionInputMap, + ExtensionDefinition, + ResolvedExtensionInputs, + createExtension, +} from '../wiring/createExtension'; + +/** + * Creates an extension that renders a React element at the app root, outside of + * the app layout. This is useful for example for shared popups and similar. + * + * @public + */ +export function createAppRootElementExtension< + TConfig extends {}, + TInputs extends AnyExtensionInputMap, +>(options: { + namespace?: string; + name?: string; + attachTo?: { id: string; input: string }; + configSchema?: PortableSchema; + disabled?: boolean; + inputs?: TInputs; + element: + | JSX.Element + | ((options: { + inputs: Expand>; + config: TConfig; + }) => JSX.Element); +}): ExtensionDefinition { + return createExtension({ + kind: 'app-root-element', + namespace: options.namespace, + name: options.name, + attachTo: options.attachTo ?? { id: 'app/root', input: 'elements' }, + configSchema: options.configSchema, + disabled: options.disabled, + inputs: options.inputs, + output: { + element: coreExtensionData.reactElement, + }, + factory({ inputs, config }) { + return { + element: + typeof options.element === 'function' + ? options.element({ inputs, config }) + : options.element, + }; + }, + }); +} diff --git a/packages/frontend-plugin-api/src/extensions/createAppRootWrapperExtension.test.tsx b/packages/frontend-plugin-api/src/extensions/createAppRootWrapperExtension.test.tsx new file mode 100644 index 0000000000..d21cfa7583 --- /dev/null +++ b/packages/frontend-plugin-api/src/extensions/createAppRootWrapperExtension.test.tsx @@ -0,0 +1,119 @@ +/* + * 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 { createExtensionTester } from '@backstage/frontend-test-utils'; +import { screen } from '@testing-library/react'; +import React from 'react'; +import { createSchemaFromZod } from '../schema/createSchemaFromZod'; +import { coreExtensionData } from '../wiring/coreExtensionData'; +import { createExtension } from '../wiring/createExtension'; +import { createExtensionInput } from '../wiring/createExtensionInput'; +import { createAppRootWrapperExtension } from './createAppRootWrapperExtension'; +import { createPageExtension } from './createPageExtension'; + +describe('createAppRootWrapperExtension', () => { + it('works with simple options and no props', async () => { + const extension = createAppRootWrapperExtension({ + Component: () =>
Hello
, + }); + + expect(extension).toEqual({ + $$type: '@backstage/ExtensionDefinition', + version: 'v1', + kind: 'app-root-wrapper', + attachTo: { id: 'app/root', input: 'wrappers' }, + disabled: false, + inputs: {}, + output: { + component: expect.anything(), + }, + factory: expect.any(Function), + toString: expect.any(Function), + }); + + createExtensionTester( + createPageExtension({ + defaultPath: '/', + loader: async () =>
, + }), + ) + .add(extension) + .render(); + + await expect(screen.findByText('Hello')).resolves.toBeInTheDocument(); + }); + + it('works with complex options and props', async () => { + const schema = createSchemaFromZod(z => z.object({ name: z.string() })); + + const extension = createAppRootWrapperExtension({ + namespace: 'ns', + name: 'test', + configSchema: schema, + disabled: true, + inputs: { + children: createExtensionInput({ + element: coreExtensionData.reactElement, + }), + }, + Component: ({ inputs, config, children }) => ( +
+ {children} +
+ ), + }); + + expect(extension).toEqual({ + $$type: '@backstage/ExtensionDefinition', + version: 'v1', + kind: 'app-root-wrapper', + namespace: 'ns', + name: 'test', + attachTo: { id: 'app/root', input: 'wrappers' }, + configSchema: schema, + disabled: true, + inputs: { + children: createExtensionInput({ + element: coreExtensionData.reactElement, + }), + }, + output: { + component: expect.anything(), + }, + factory: expect.any(Function), + toString: expect.any(Function), + }); + + createExtensionTester( + createPageExtension({ + defaultPath: '/', + loader: async () =>
Hello
, + }), + ) + .add(extension, { config: { name: 'Robin' } }) + .add( + createExtension({ + attachTo: { id: 'app-root-wrapper:ns/test', input: 'children' }, + output: { element: coreExtensionData.reactElement }, + factory: () => ({ element:
}), + }), + ) + .render(); + + await expect(screen.findByText('Hello')).resolves.toBeInTheDocument(); + await expect(screen.findByTestId('Robin-1')).resolves.toBeInTheDocument(); + }); +}); diff --git a/packages/frontend-plugin-api/src/extensions/createAppRootWrapperExtension.tsx b/packages/frontend-plugin-api/src/extensions/createAppRootWrapperExtension.tsx new file mode 100644 index 0000000000..bbc51806af --- /dev/null +++ b/packages/frontend-plugin-api/src/extensions/createAppRootWrapperExtension.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 React, { ComponentType, PropsWithChildren } from 'react'; +import { PortableSchema } from '../schema/types'; +import { + AnyExtensionInputMap, + ExtensionDefinition, + ResolvedExtensionInputs, + createExtension, +} from '../wiring/createExtension'; +import { createExtensionDataRef } from '../wiring/createExtensionDataRef'; +import { Expand } from '../types'; + +/** + * Creates an extension that renders a React wrapper at the app root, enclosing + * the app layout. This is useful for example for adding global React contexts + * and similar. + * + * @public + */ +export function createAppRootWrapperExtension< + TConfig extends {}, + TInputs extends AnyExtensionInputMap, +>(options: { + namespace?: string; + name?: string; + attachTo?: { id: string; input: string }; + configSchema?: PortableSchema; + disabled?: boolean; + inputs?: TInputs; + Component: ComponentType< + PropsWithChildren<{ + inputs: Expand>; + config: TConfig; + }> + >; +}): ExtensionDefinition { + return createExtension({ + kind: 'app-root-wrapper', + namespace: options.namespace, + name: options.name, + attachTo: options.attachTo ?? { id: 'app/root', input: 'wrappers' }, + configSchema: options.configSchema, + disabled: options.disabled, + inputs: options.inputs, + output: { + component: createAppRootWrapperExtension.componentDataRef, + }, + factory({ inputs, config }) { + const Component = (props: PropsWithChildren<{}>) => { + return ( + + {props.children} + + ); + }; + return { + component: Component, + }; + }, + }); +} + +/** @public */ +export namespace createAppRootWrapperExtension { + export const componentDataRef = + createExtensionDataRef>>( + 'app.root.wrapper', + ); +} diff --git a/packages/frontend-plugin-api/src/extensions/createNavLogoExtension.test.tsx b/packages/frontend-plugin-api/src/extensions/createNavLogoExtension.test.tsx index 90e1448448..8c54743f1d 100644 --- a/packages/frontend-plugin-api/src/extensions/createNavLogoExtension.test.tsx +++ b/packages/frontend-plugin-api/src/extensions/createNavLogoExtension.test.tsx @@ -41,6 +41,7 @@ describe('createNavLogoExtension', () => { logos: expect.anything(), }, factory: expect.any(Function), + toString: expect.any(Function), }); }); }); diff --git a/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx b/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx index 2de72296ac..374400fce8 100644 --- a/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx +++ b/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx @@ -55,6 +55,7 @@ describe('createPageExtension', () => { routeRef: expect.anything(), }, factory: expect.any(Function), + toString: expect.any(Function), }); expect( @@ -89,6 +90,7 @@ describe('createPageExtension', () => { routeRef: expect.anything(), }, factory: expect.any(Function), + toString: expect.any(Function), }); expect( @@ -112,6 +114,7 @@ describe('createPageExtension', () => { routeRef: expect.anything(), }, factory: expect.any(Function), + toString: expect.any(Function), }); }); diff --git a/packages/frontend-plugin-api/src/extensions/createRouterExtension.test.tsx b/packages/frontend-plugin-api/src/extensions/createRouterExtension.test.tsx new file mode 100644 index 0000000000..7109e1a8aa --- /dev/null +++ b/packages/frontend-plugin-api/src/extensions/createRouterExtension.test.tsx @@ -0,0 +1,167 @@ +/* + * 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 { createSpecializedApp } from '@backstage/frontend-app-api'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; +import { MockConfigApi } from '@backstage/test-utils'; +import { MemoryRouter } from 'react-router-dom'; +import { createSchemaFromZod } from '../schema/createSchemaFromZod'; +import { coreExtensionData } from '../wiring/coreExtensionData'; +import { createExtension } from '../wiring/createExtension'; +import { createExtensionInput } from '../wiring/createExtensionInput'; +import { createExtensionOverrides } from '../wiring/createExtensionOverrides'; +import { createPageExtension } from './createPageExtension'; +import { createRouterExtension } from './createRouterExtension'; + +describe('createRouterExtension', () => { + it('works with simple options and no props', async () => { + const extension = createRouterExtension({ + namespace: 'test', + Component: ({ children }) => ( + +
{children}
+
+ ), + }); + + expect(extension).toEqual({ + $$type: '@backstage/ExtensionDefinition', + version: 'v1', + kind: 'app-router-component', + namespace: 'test', + attachTo: { id: 'app/root', input: 'router' }, + disabled: false, + inputs: {}, + output: { + component: expect.anything(), + }, + factory: expect.any(Function), + toString: expect.any(Function), + }); + + const app = createSpecializedApp({ + features: [ + createExtensionOverrides({ + extensions: [ + extension, + createPageExtension({ + namespace: 'test', + defaultPath: '/', + loader: async () =>
, + }), + ], + }), + ], + }); + + render(app.createRoot()); + + await expect( + screen.findByTestId('test-contents'), + ).resolves.toBeInTheDocument(); + await expect( + screen.findByTestId('test-router'), + ).resolves.toBeInTheDocument(); + }); + + it('works with complex options and props', async () => { + const schema = createSchemaFromZod(z => z.object({ name: z.string() })); + + const extension = createRouterExtension({ + namespace: 'test', + name: 'test', + configSchema: schema, + inputs: { + children: createExtensionInput({ + element: coreExtensionData.reactElement, + }), + }, + Component: ({ inputs, config, children }) => ( + +
+ {children} +
+
+ ), + }); + + expect(extension).toEqual({ + $$type: '@backstage/ExtensionDefinition', + version: 'v1', + kind: 'app-router-component', + namespace: 'test', + name: 'test', + attachTo: { id: 'app/root', input: 'router' }, + configSchema: schema, + disabled: false, + inputs: { + children: createExtensionInput({ + element: coreExtensionData.reactElement, + }), + }, + output: { + component: expect.anything(), + }, + factory: expect.any(Function), + toString: expect.any(Function), + }); + + const app = createSpecializedApp({ + features: [ + createExtensionOverrides({ + extensions: [ + extension, + createExtension({ + namespace: 'test', + attachTo: { + id: 'app-router-component:test/test', + input: 'children', + }, + output: { element: coreExtensionData.reactElement }, // doesn't matter + factory: () => ({ element:
}), + }), + createPageExtension({ + namespace: 'test', + defaultPath: '/', + loader: async () =>
, + }), + ], + }), + ], + config: new MockConfigApi({ + app: { + extensions: [ + { + 'app-router-component:test/test': { config: { name: 'Robin' } }, + }, + ], + }, + }), + }); + + render(app.createRoot()); + + await expect( + screen.findByTestId('test-contents'), + ).resolves.toBeInTheDocument(); + await expect( + screen.findByTestId('test-router-Robin-1'), + ).resolves.toBeInTheDocument(); + }); +}); diff --git a/packages/frontend-plugin-api/src/extensions/createRouterExtension.tsx b/packages/frontend-plugin-api/src/extensions/createRouterExtension.tsx new file mode 100644 index 0000000000..32d61f7e60 --- /dev/null +++ b/packages/frontend-plugin-api/src/extensions/createRouterExtension.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 React, { ComponentType, PropsWithChildren } from 'react'; +import { PortableSchema } from '../schema/types'; +import { + AnyExtensionInputMap, + ExtensionDefinition, + ResolvedExtensionInputs, + createExtension, +} from '../wiring/createExtension'; +import { createExtensionDataRef } from '../wiring/createExtensionDataRef'; +import { Expand } from '../types'; + +/** + * Creates an extension that replaces the router implementation at the app root. + * This is useful to be able to for example replace the BrowserRouter with a + * MemoryRouter in tests, or to add additional props to a BrowserRouter. + * + * @public + */ +export function createRouterExtension< + TConfig extends {}, + TInputs extends AnyExtensionInputMap, +>(options: { + namespace?: string; + name?: string; + attachTo?: { id: string; input: string }; + configSchema?: PortableSchema; + disabled?: boolean; + inputs?: TInputs; + Component: ComponentType< + PropsWithChildren<{ + inputs: Expand>; + config: TConfig; + }> + >; +}): ExtensionDefinition { + return createExtension({ + kind: 'app-router-component', + namespace: options.namespace, + name: options.name, + attachTo: options.attachTo ?? { id: 'app/root', input: 'router' }, + configSchema: options.configSchema, + disabled: options.disabled, + inputs: options.inputs, + output: { + component: createRouterExtension.componentDataRef, + }, + factory({ inputs, config }) { + const Component = (props: PropsWithChildren<{}>) => { + return ( + + {props.children} + + ); + }; + return { + component: Component, + }; + }, + }); +} + +/** @public */ +export namespace createRouterExtension { + export const componentDataRef = + createExtensionDataRef>>( + 'app.router.wrapper', + ); +} diff --git a/packages/frontend-plugin-api/src/extensions/createSignInPageExtension.tsx b/packages/frontend-plugin-api/src/extensions/createSignInPageExtension.tsx index 543a5447ad..b525cc3a7b 100644 --- a/packages/frontend-plugin-api/src/extensions/createSignInPageExtension.tsx +++ b/packages/frontend-plugin-api/src/extensions/createSignInPageExtension.tsx @@ -50,7 +50,7 @@ export function createSignInPageExtension< kind: 'sign-in-page', namespace: options?.namespace, name: options?.name, - attachTo: options.attachTo ?? { id: 'app/router', input: 'signInPage' }, + attachTo: options.attachTo ?? { id: 'app/root', input: 'signInPage' }, configSchema: options.configSchema, inputs: options.inputs, disabled: options.disabled, diff --git a/packages/frontend-plugin-api/src/extensions/createTranslationExtension.test.ts b/packages/frontend-plugin-api/src/extensions/createTranslationExtension.test.ts index 3712da7185..975901b8e5 100644 --- a/packages/frontend-plugin-api/src/extensions/createTranslationExtension.test.ts +++ b/packages/frontend-plugin-api/src/extensions/createTranslationExtension.test.ts @@ -51,6 +51,7 @@ describe('createTranslationExtension', () => { resource: createTranslationExtension.translationDataRef, }, factory: expect.any(Function), + toString: expect.any(Function), }); expect((extension as any).factory({} as any)).toEqual({ @@ -88,6 +89,7 @@ describe('createTranslationExtension', () => { resource: createTranslationExtension.translationDataRef, }, factory: expect.any(Function), + toString: expect.any(Function), }); expect((extension as any).factory({} as any)).toEqual({ resource }); @@ -126,6 +128,7 @@ describe('createTranslationExtension', () => { resource: createTranslationExtension.translationDataRef, }, factory: expect.any(Function), + toString: expect.any(Function), }); }); }); diff --git a/packages/frontend-plugin-api/src/extensions/index.ts b/packages/frontend-plugin-api/src/extensions/index.ts index fd2e38de49..562cb728cb 100644 --- a/packages/frontend-plugin-api/src/extensions/index.ts +++ b/packages/frontend-plugin-api/src/extensions/index.ts @@ -15,6 +15,9 @@ */ export { createApiExtension } from './createApiExtension'; +export { createAppRootElementExtension } from './createAppRootElementExtension'; +export { createAppRootWrapperExtension } from './createAppRootWrapperExtension'; +export { createRouterExtension } from './createRouterExtension'; export { createPageExtension } from './createPageExtension'; export { createNavItemExtension } from './createNavItemExtension'; export { createNavLogoExtension } from './createNavLogoExtension'; diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.test.ts b/packages/frontend-plugin-api/src/wiring/createExtension.test.ts index 22db95082a..42ab21db80 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.test.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.test.ts @@ -287,5 +287,8 @@ describe('createExtension', () => { }, }); expect(extension.namespace).toBe('test'); + expect(String(extension)).toBe( + 'ExtensionDefinition{namespace=test,attachTo=root@default}', + ); }); }); diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.ts b/packages/frontend-plugin-api/src/wiring/createExtension.ts index 0d6806fe49..be76fbc069 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.ts @@ -166,5 +166,19 @@ export function createExtension< ...rest, }); }, + toString() { + const parts: string[] = []; + if (options.kind) { + parts.push(`kind=${options.kind}`); + } + if (options.namespace) { + parts.push(`namespace=${options.namespace}`); + } + if (options.name) { + parts.push(`name=${options.name}`); + } + parts.push(`attachTo=${options.attachTo.id}@${options.attachTo.input}`); + return `ExtensionDefinition{${parts.join(',')}}`; + }, } as InternalExtensionDefinition; } diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.test.ts b/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.test.ts new file mode 100644 index 0000000000..f7a0dc82d0 --- /dev/null +++ b/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.test.ts @@ -0,0 +1,28 @@ +/* + * 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 { createExtensionDataRef } from './createExtensionDataRef'; + +describe('createExtensionDataRef', () => { + it('can be created and read', () => { + const ref = createExtensionDataRef('foo'); + expect(ref.id).toBe('foo'); + expect(String(ref)).toBe('ExtensionDataRef{id=foo,optional=false}'); + const refOptional = ref.optional(); + expect(refOptional.id).toBe('foo'); + expect(String(refOptional)).toBe('ExtensionDataRef{id=foo,optional=true}'); + }); +}); diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts b/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts index d0d96e85f9..a7f4e4374e 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts @@ -43,7 +43,14 @@ export function createExtensionDataRef( $$type: '@backstage/ExtensionDataRef', config: {}, optional() { - return { ...this, config: { ...this.config, optional: true } }; + return { + ...this, + config: { ...this.config, optional: true }, + }; }, - } as ConfigurableExtensionDataRef; + toString() { + const optional = Boolean(this.config.optional); + return `ExtensionDataRef{id=${id},optional=${optional}}`; + }, + } as ConfigurableExtensionDataRef; } diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionOverrides.test.ts b/packages/frontend-plugin-api/src/wiring/createExtensionOverrides.test.ts index de2d2f9a92..aa00247222 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionOverrides.test.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionOverrides.test.ts @@ -27,6 +27,7 @@ describe('createExtensionOverrides', () => { "$$type": "@backstage/ExtensionOverrides", "extensions": [], "featureFlags": [], + "toString": [Function], "version": "v1", } `); @@ -74,6 +75,7 @@ describe('createExtensionOverrides', () => { "id": "a", "inputs": {}, "output": {}, + "toString": [Function], "version": "v1", }, { @@ -88,6 +90,7 @@ describe('createExtensionOverrides', () => { "id": "b", "inputs": {}, "output": {}, + "toString": [Function], "version": "v1", }, { @@ -102,10 +105,12 @@ describe('createExtensionOverrides', () => { "id": "k:c/n", "inputs": {}, "output": {}, + "toString": [Function], "version": "v1", }, ], "featureFlags": [], + "toString": [Function], "version": "v1", } `); diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionOverrides.ts b/packages/frontend-plugin-api/src/wiring/createExtensionOverrides.ts index 3c14d285b3..1f88038944 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionOverrides.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionOverrides.ts @@ -38,11 +38,20 @@ export interface InternalExtensionOverrides extends ExtensionOverrides { export function createExtensionOverrides( options: ExtensionOverridesOptions, ): ExtensionOverrides { + const extensions = options.extensions.map(def => + resolveExtensionDefinition(def), + ); + const featureFlags = options.featureFlags ?? []; return { $$type: '@backstage/ExtensionOverrides', version: 'v1', - extensions: options.extensions.map(def => resolveExtensionDefinition(def)), - featureFlags: options.featureFlags ?? [], + extensions, + featureFlags, + toString() { + const ex = extensions.map(String).join(','); + const ff = featureFlags.map(f => f.name).join(','); + return `ExtensionOverrides{extensions=[${ex}],featureFlags=[${ff}]}`; + }, } as InternalExtensionOverrides; } diff --git a/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts b/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts index cb02048bdc..c180dc9719 100644 --- a/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts +++ b/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts @@ -138,6 +138,7 @@ describe('createPlugin', () => { const plugin = createPlugin({ id: 'test' }); expect(plugin).toBeDefined(); + expect(String(plugin)).toBe('Plugin{id=test}'); }); it('should create a plugin with extension instances', async () => { @@ -150,7 +151,7 @@ describe('createPlugin', () => { await renderWithEffects( createTestAppRoot({ features: [plugin], - config: { app: { extensions: [{ 'app/router': false }] } }, + config: { app: { extensions: [{ 'app/root': false }] } }, }), ); @@ -172,7 +173,7 @@ describe('createPlugin', () => { config: { app: { extensions: [ - { 'app/router': false }, + { 'app/root': false }, { 'test/2': { config: { name: 'extension-2-renamed' }, @@ -210,7 +211,7 @@ describe('createPlugin', () => { features: [plugin], config: { app: { - extensions: [{ 'app/router': false }], + extensions: [{ 'app/root': false }], }, }, }), diff --git a/packages/frontend-plugin-api/src/wiring/createPlugin.ts b/packages/frontend-plugin-api/src/wiring/createPlugin.ts index 67907e188e..797c46e58e 100644 --- a/packages/frontend-plugin-api/src/wiring/createPlugin.ts +++ b/packages/frontend-plugin-api/src/wiring/createPlugin.ts @@ -82,6 +82,9 @@ export function createPlugin< externalRoutes: options.externalRoutes ?? ({} as ExternalRoutes), featureFlags: options.featureFlags ?? [], extensions, + toString() { + return `Plugin{id=${options.id}}`; + }, } as InternalBackstagePlugin; } diff --git a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts index 9db9539ebb..8970cfe168 100644 --- a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts +++ b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts @@ -37,6 +37,7 @@ describe('resolveExtensionDefinition', () => { ...definition, } as ExtensionDefinition); expect(resolved.id).toBe(expected); + expect(String(resolved)).toBe(`Extension{id=${expected}}`); }); it('should fail to resolve extension ID without namespace', () => { diff --git a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts index d702120447..0a44de4ab4 100644 --- a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts +++ b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts @@ -81,10 +81,15 @@ export function resolveExtensionDefinition( ); } + const id = kind ? `${kind}:${namePart}` : namePart; + return { ...rest, $$type: '@backstage/Extension', version: 'v1', - id: kind ? `${kind}:${namePart}` : namePart, - } as InternalExtension; + id, + toString() { + return `Extension{id=${id}}`; + }, + } as Extension; } diff --git a/packages/frontend-plugin-api/src/wiring/types.ts b/packages/frontend-plugin-api/src/wiring/types.ts index c2a6b09ba7..7e0650e06c 100644 --- a/packages/frontend-plugin-api/src/wiring/types.ts +++ b/packages/frontend-plugin-api/src/wiring/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { ExternalRouteRef, RouteRef } from '../routing'; +import { ExternalRouteRef, RouteRef, SubRouteRef } from '../routing'; /** * Feature flag configuration. @@ -27,7 +27,7 @@ export type FeatureFlagConfig = { }; /** @public */ -export type AnyRoutes = { [name in string]: RouteRef }; +export type AnyRoutes = { [name in string]: RouteRef | SubRouteRef }; /** @public */ export type AnyExternalRoutes = { [name in string]: ExternalRouteRef }; diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index 1569ceaeff..dc3555499e 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/frontend-test-utils +## 0.1.1 + +### Patch Changes + +- f7566f9: Updates to reflect the `app/router` extension having been renamed to `app/root`. +- 516fd3e: Updated README to reflect release status +- c97fa1c: Added `elements`, `wrappers`, and `router` inputs to `app/root`, that let you add things to the root of the React tree above the layout. You can use the `createAppRootElementExtension`, `createAppRootWrapperExtension`, and `createRouterExtension` extension creator, respectively, to conveniently create such extensions. These are all optional, and if you do not supply a router a default one will be used (`BrowserRouter` in regular runs, `MemoryRouter` in tests/CI). +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/frontend-app-api@0.5.0 + - @backstage/test-utils@1.4.7 + - @backstage/types@1.1.1 + +## 0.1.1-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/frontend-app-api@0.4.1-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/packages/frontend-test-utils/README.md b/packages/frontend-test-utils/README.md index 50f853d9ed..455d112773 100644 --- a/packages/frontend-test-utils/README.md +++ b/packages/frontend-test-utils/README.md @@ -1,5 +1,7 @@ # @backstage/frontend-test-utils +**The [new frontend system](https://backstage.io/docs/frontend-system/) that this package is part of is in alpha, and we do not yet recommend using it for production deployments** + Contains utilities that can be used when testing frontend features such as extensions. ## Installation diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index 18bd1a025e..fbe9e3dec6 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-test-utils", - "version": "0.1.1-next.1", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/frontend-test-utils/src/app/createExtensionTester.test.tsx b/packages/frontend-test-utils/src/app/createExtensionTester.test.tsx index 40baaa3ac9..d53344f7fd 100644 --- a/packages/frontend-test-utils/src/app/createExtensionTester.test.tsx +++ b/packages/frontend-test-utils/src/app/createExtensionTester.test.tsx @@ -219,10 +219,14 @@ describe('createExtensionTester', () => { fireEvent.click(await screen.findByRole('button', { name: 'See details' })); await waitFor(() => - expect(analyticsApiMock.getEvents()[0]).toMatchObject({ - action: 'click', - subject: 'See details', - }), + expect(analyticsApiMock.getEvents()).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + action: 'click', + subject: 'See details', + }), + ]), + ), ); }); }); diff --git a/packages/frontend-test-utils/src/app/createExtensionTester.tsx b/packages/frontend-test-utils/src/app/createExtensionTester.tsx index aae2e5ed32..a98879fbba 100644 --- a/packages/frontend-test-utils/src/app/createExtensionTester.tsx +++ b/packages/frontend-test-utils/src/app/createExtensionTester.tsx @@ -14,22 +14,20 @@ * limitations under the License. */ -import React, { ComponentType, ReactNode, useContext, useState } from 'react'; +import React from 'react'; import { MemoryRouter, Link } from 'react-router-dom'; import { RenderResult, render } from '@testing-library/react'; import { createSpecializedApp } from '@backstage/frontend-app-api'; import { ExtensionDefinition, IconComponent, - IdentityApi, RouteRef, - configApiRef, coreExtensionData, createExtension, createExtensionInput, createExtensionOverrides, createNavItemExtension, - useApi, + createRouterExtension, useRouteRef, } from '@backstage/frontend-plugin-api'; import { MockConfigApi } from '@backstage/test-utils'; @@ -37,15 +35,7 @@ import { JsonArray, JsonObject, JsonValue } from '@backstage/types'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { resolveExtensionDefinition } from '../../../frontend-plugin-api/src/wiring/resolveExtensionDefinition'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { createSignInPageExtension } from '../../../frontend-plugin-api/src/extensions/createSignInPageExtension'; -// eslint-disable-next-line @backstage/no-relative-monorepo-imports import { toInternalExtensionDefinition } from '../../../frontend-plugin-api/src/wiring/createExtension'; -// eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { InternalAppContext } from '../../../frontend-app-api/src/wiring/InternalAppContext'; -// eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { SignInPageProps } from '../../../core-plugin-api'; -// eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { getBasePath } from '../../../core-app-api/src/app/AppRouter'; const NavItem = (props: { routeRef: RouteRef; @@ -63,7 +53,7 @@ const NavItem = (props: { ); }; -const TestCoreNavExtension = createExtension({ +const TestAppNavExtension = createExtension({ namespace: 'app', name: 'nav', attachTo: { id: 'app/layout', input: 'nav' }, @@ -95,97 +85,6 @@ const TestCoreNavExtension = createExtension({ }, }); -const AuthenticationProvider = (props: { - signInPage?: ComponentType; - children: ReactNode; -}) => { - const { signInPage: SignInPage, children } = props; - const configApi = useApi(configApiRef); - const signOutTargetUrl = getBasePath(configApi) || '/'; - - const internalAppContext = useContext(InternalAppContext); - if (!internalAppContext) { - throw new Error('AppRouter must be rendered within the AppProvider'); - } - - const { appIdentityProxy } = internalAppContext; - const [identityApi, setIdentityApi] = useState(); - - if (!SignInPage) { - appIdentityProxy.setTarget( - { - getUserId: () => 'guest', - getIdToken: async () => undefined, - getProfile: () => ({ - email: 'guest@example.com', - displayName: 'Guest', - }), - getProfileInfo: async () => ({ - email: 'guest@example.com', - displayName: 'Guest', - }), - getBackstageIdentity: async () => ({ - type: 'user', - userEntityRef: 'user:default/guest', - ownershipEntityRefs: ['user:default/guest'], - }), - getCredentials: async () => ({}), - signOut: async () => {}, - }, - { signOutTargetUrl }, - ); - - return children; - } - - if (!identityApi) { - return ; - } - - appIdentityProxy.setTarget(identityApi, { - signOutTargetUrl, - }); - - return children; -}; - -const TestCoreRouterExtension = createExtension({ - namespace: 'app', - name: 'router', - attachTo: { id: 'app', input: 'root' }, - inputs: { - signInPage: createExtensionInput( - { - component: createSignInPageExtension.componentDataRef, - }, - { singleton: true, optional: true }, - ), - children: createExtensionInput( - { - element: coreExtensionData.reactElement, - }, - { singleton: true }, - ), - }, - output: { - element: coreExtensionData.reactElement, - }, - factory({ inputs }) { - const SignInPage = inputs.signInPage?.output.component; - const children = inputs.children.output.element; - - return { - element: ( - - - {children} - - - ), - }; - }, -}); - /** @public */ export class ExtensionTester { /** @internal */ @@ -278,8 +177,13 @@ export class ExtensionTester { createExtensionOverrides({ extensions: [ ...this.#extensions.map(extension => extension.definition), - TestCoreNavExtension, - TestCoreRouterExtension, + TestAppNavExtension, + createRouterExtension({ + namespace: 'test', + Component: ({ children }) => ( + {children} + ), + }), ], }), ], diff --git a/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx b/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx index a6783d43a3..a56ae2f140 100644 --- a/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx +++ b/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx @@ -56,9 +56,13 @@ describe('renderInTestApp', () => { fireEvent.click(screen.getByRole('link', { name: 'See details' })); - expect(analyticsApiMock.getEvents()[0]).toMatchObject({ - action: 'click', - subject: 'See details', - }); + expect(analyticsApiMock.getEvents()).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + action: 'click', + subject: 'See details', + }), + ]), + ); }); }); diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index cc58b79619..fd6a47e4e7 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration-react +## 1.1.23 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + ## 1.1.23-next.0 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index e916c24ed4..f1592628ab 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.23-next.0", + "version": "1.1.23", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 8f13e90570..02ecf90bdc 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/repo-tools +## 0.5.2 + +### Patch Changes + +- 883782e: Updated the OpenAPI template to export the `TypedResponse` interface so that client code can leverage it +- 7acbb5a: Removed `mock-fs` dev dependency. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/cli-node@0.2.2 + - @backstage/catalog-model@1.4.3 + - @backstage/cli-common@0.1.13 + - @backstage/errors@1.2.3 + +## 0.5.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/cli-node@0.2.2-next.0 + ## 0.5.2-next.1 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 69dbb190fa..c8f832af01 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.5.2-next.1", + "version": "0.5.2", "publishConfig": { "access": "public" }, diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 3162966a4a..0e6163e1b7 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,34 @@ # techdocs-cli-embedded-app +## 0.2.90 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/cli@0.25.1 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-techdocs@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/app-defaults@1.4.7 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.3 + - @backstage/test-utils@1.4.7 + - @backstage/theme@0.5.0 + +## 0.2.90-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-techdocs@1.9.3-next.2 + - @backstage/cli@0.25.1-next.1 + - @backstage/integration-react@1.1.23-next.0 + ## 0.2.90-next.1 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index d5da1169c7..8e30395052 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.90-next.1", + "version": "0.2.90", "private": true, "backstage": { "role": "frontend" diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index ed43167f56..f65ed4bd46 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,24 @@ # @techdocs/cli +## 1.8.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-techdocs-node@1.11.1 + - @backstage/catalog-model@1.4.3 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + +## 1.8.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-techdocs-node@1.11.1-next.2 + ## 1.8.1-next.1 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 65e3e16716..4d4fc997b6 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.8.1-next.1", + "version": "1.8.1", "publishConfig": { "access": "public" }, diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 9ab9643131..c4f342b554 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/test-utils +## 1.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + ## 1.4.7-next.1 ### Patch Changes diff --git a/packages/test-utils/api-report.md b/packages/test-utils/api-report.md index 913413acd1..e31a820a1c 100644 --- a/packages/test-utils/api-report.md +++ b/packages/test-utils/api-report.md @@ -7,6 +7,7 @@ import { AnalyticsApi } from '@backstage/core-plugin-api'; import { AnalyticsEvent } from '@backstage/core-plugin-api'; import { ApiHolder } from '@backstage/core-plugin-api'; import { ApiRef } from '@backstage/core-plugin-api'; +import { AppComponents } from '@backstage/core-plugin-api'; import { AuthorizeResult } from '@backstage/plugin-permission-common'; import { ComponentType } from 'react'; import { Config } from '@backstage/config'; @@ -243,6 +244,7 @@ export type TestAppOptions = { mountedRoutes?: { [path: string]: RouteRef | ExternalRouteRef; }; + components?: Partial; }; // @public diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 5d3bb2ab4e..43b9c29a10 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.7-next.1", + "version": "1.4.7", "publishConfig": { "access": "public" }, diff --git a/packages/test-utils/src/testUtils/appWrappers.tsx b/packages/test-utils/src/testUtils/appWrappers.tsx index 8bc69e184a..f2c1ff592e 100644 --- a/packages/test-utils/src/testUtils/appWrappers.tsx +++ b/packages/test-utils/src/testUtils/appWrappers.tsx @@ -25,6 +25,7 @@ import { themes, UnifiedThemeProvider } from '@backstage/theme'; import MockIcon from '@material-ui/icons/AcUnit'; import { createSpecializedApp } from '@backstage/core-app-api'; import { + AppComponents, attachComponentData, BootErrorPageProps, createRouteRef, @@ -101,6 +102,11 @@ export type TestAppOptions = { * const link = useRouteRef(myRouteRef) */ mountedRoutes?: { [path: string]: RouteRef | ExternalRouteRef }; + + /** + * Components to be forwarded to the `components` option of `createApp`. + */ + components?: Partial; }; function isExternalRouteRef( @@ -137,6 +143,7 @@ export function createTestAppWrapper( Router: ({ children }) => ( ), + ...options.components, }, icons: mockIcons, plugins: [], diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index 23857d82e3..adc0cf284f 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-adr-backend +## 0.4.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/plugin-adr-common@0.2.19 + - @backstage/plugin-search-common@1.2.10 + +## 0.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 0.4.6-next.1 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index efe1653fe2..24cebdff04 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.4.6-next.1", + "version": "0.4.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md index 6f85feed2a..84c285a1a8 100644 --- a/plugins/adr-common/CHANGELOG.md +++ b/plugins/adr-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-adr-common +## 0.2.19 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.3 + - @backstage/integration@1.8.0 + - @backstage/plugin-search-common@1.2.10 + ## 0.2.18 ### Patch Changes diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json index 4e345cf19b..d05b585c7d 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.18", + "version": "0.2.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index a3fe23803d..8cf8b2c28e 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-adr +## 0.6.12 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-search-react@1.7.5 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-adr-common@0.2.19 + - @backstage/plugin-search-common@1.2.10 + +## 0.6.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/integration-react@1.1.23-next.0 + ## 0.6.12-next.1 ### Patch Changes diff --git a/plugins/adr/README.md b/plugins/adr/README.md index e6178f003b..3e8647a8fa 100644 --- a/plugins/adr/README.md +++ b/plugins/adr/README.md @@ -2,7 +2,7 @@ Welcome to the ADR plugin! -This plugin allows you to browse ADRs associated with your entities as well as a way to discover ADRs across others entities via Backstage Search. Use this to learn from the past experience of other projects to guide your own architecture decisions. +This plugin allows you to explore ADRs (Architecture Decision Records) associated with your entities, as well as discover ADRs across other entities using Backstage Search. Use this to inform your own architectural decisions based on the experiences of previous projects. ![ADR tab](./docs/adr-tab.png) diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 96652e0c62..35c89ce255 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.6.12-next.1", + "version": "0.6.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index c84b4a5098..2a7c655a2d 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-airbrake-backend +## 0.3.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + +## 0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 0.3.6-next.1 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index c7d20a22d7..f424ba8ce7 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.3.6-next.1", + "version": "0.3.6", "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 2a40d0c4c1..4636c27068 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-airbrake +## 0.3.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/dev-utils@1.0.26 + - @backstage/catalog-model@1.4.3 + - @backstage/test-utils@1.4.7 + +## 0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/dev-utils@1.0.26-next.2 + ## 0.3.29-next.1 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index 730436d20c..3cf1107fe0 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.29-next.1", + "version": "0.3.29", "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 3739341635..bf9aaa61df 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-allure +## 0.1.45 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.1.45-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.45-next.1 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index 5c7f49f29b..991c2a8944 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.45-next.1", + "version": "0.1.45", "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 c77afd0bf4..5135b15ac1 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.37 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + ## 0.1.37-next.1 ### Patch Changes diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index 1995731b01..3d367a5889 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.37-next.1", + "version": "0.1.37", "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 cc177dc290..6529fc3711 100644 --- a/plugins/analytics-module-ga4/CHANGELOG.md +++ b/plugins/analytics-module-ga4/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-analytics-module-ga4 +## 0.1.8 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + ## 0.1.8-next.1 ### Patch Changes diff --git a/plugins/analytics-module-ga4/package.json b/plugins/analytics-module-ga4/package.json index a4b459ba5b..97b610c2bf 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.8-next.1", + "version": "0.1.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-newrelic-browser/CHANGELOG.md b/plugins/analytics-module-newrelic-browser/CHANGELOG.md index c687761295..0f9b210d9a 100644 --- a/plugins/analytics-module-newrelic-browser/CHANGELOG.md +++ b/plugins/analytics-module-newrelic-browser/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-analytics-module-newrelic-browser +## 0.0.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + ## 0.0.6-next.1 ### Patch Changes diff --git a/plugins/analytics-module-newrelic-browser/package.json b/plugins/analytics-module-newrelic-browser/package.json index 1448b1923a..0815b62b6c 100644 --- a/plugins/analytics-module-newrelic-browser/package.json +++ b/plugins/analytics-module-newrelic-browser/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-newrelic-browser", - "version": "0.0.6-next.1", + "version": "0.0.6", "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 ddd38838ba..9c2a434030 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-apache-airflow +## 0.2.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + ## 0.2.19-next.1 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index d2241c820b..489fcde5e8 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.19-next.1", + "version": "0.2.19", "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 b157a73217..f801bf9ba2 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-api-docs +## 0.10.3 + +### Patch Changes + +- 8a69cc9: Fix custom http resolvers for AsyncAPI widget. +- 062b8f2: Add permission check to Register Existing API button +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.10.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.10.3-next.1 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 8fedf41203..7159aec206 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.10.3-next.1", + "version": "0.10.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,12 +33,14 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@asyncapi/react-component": "1.2.6", + "@asyncapi/react-component": "1.2.13", "@backstage/catalog-model": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-catalog": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", + "@backstage/plugin-permission-react": "workspace:^", "@graphiql/react": "^0.20.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", diff --git a/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx b/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx index 6d0b191d68..7938770c4c 100644 --- a/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx +++ b/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx @@ -32,6 +32,7 @@ import { starredEntitiesApiRef, } from '@backstage/plugin-catalog-react'; import { + MockPermissionApi, MockStorageApi, TestApiProvider, renderInTestApp, @@ -41,6 +42,7 @@ import { screen, waitFor } from '@testing-library/react'; import React from 'react'; import { apiDocsConfigRef } from '../../config'; import { DefaultApiExplorerPage } from './DefaultApiExplorerPage'; +import { permissionApiRef } from '@backstage/plugin-permission-react'; describe('DefaultApiExplorerPage', () => { const catalogApi: Partial = { @@ -98,6 +100,7 @@ describe('DefaultApiExplorerPage', () => { new DefaultStarredEntitiesApi({ storageApi }), ], [apiDocsConfigRef, apiDocsConfig], + [permissionApiRef, new MockPermissionApi()], ]} > {children} diff --git a/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.tsx b/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.tsx index ad43205c5f..dc83c2528d 100644 --- a/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.tsx +++ b/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.tsx @@ -38,6 +38,8 @@ import { } from '@backstage/plugin-catalog-react'; import React from 'react'; import { registerComponentRouteRef } from '../../routes'; +import { usePermission } from '@backstage/plugin-permission-react'; +import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha'; const defaultColumns: TableColumn[] = [ CatalogTable.columns.createTitleColumn({ hidden: true }), @@ -72,6 +74,9 @@ export const DefaultApiExplorerPage = (props: DefaultApiExplorerPageProps) => { configApi.getOptionalString('organization.name') ?? 'Backstage' } API Explorer`; const registerComponentLink = useRouteRef(registerComponentRouteRef); + const { allowed } = usePermission({ + permission: catalogEntityCreatePermission, + }); return ( { > - + {allowed && ( + + )} All your APIs diff --git a/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx b/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx index 3e2fbd1078..461e466b4f 100644 --- a/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx +++ b/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx @@ -143,18 +143,33 @@ const useStyles = makeStyles(theme => ({ }, })); -const fetchResolver = { - order: 199, // Use 199 as the built-in http resolver is 200 - canRead: /^https?:\/\//, - async read(file: any) { - const response = await fetch(file.url); +const httpsFetchResolver = { + schema: 'https', + order: 1, + canRead: true, + async read(uri: any) { + const response = await fetch(uri.toString()); + return response.text(); + }, +}; + +const httpFetchResolver = { + schema: 'http', + order: 1, + canRead: true, + async read(uri: any) { + const response = await fetch(uri.toString()); return response.text(); }, }; const config = { parserOptions: { - resolve: { fetch: fetchResolver }, + __unstable: { + resolver: { + resolvers: [httpsFetchResolver, httpFetchResolver], + }, + }, }, }; diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index 77a44cd37d..1523721718 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-apollo-explorer +## 0.1.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + ## 0.1.19-next.1 ### Patch Changes diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index 2b9fe695f5..37895e3343 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.19-next.1", + "version": "0.1.19", "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 508eed69ab..8550264a15 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-app-backend +## 0.3.57 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config-loader@1.6.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-app-node@0.1.9 + +## 0.3.57-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-app-node@0.1.9-next.2 + - @backstage/config-loader@1.6.1-next.0 + ## 0.3.57-next.1 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 6b5f3be8d2..0aecbec7f0 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.57-next.1", + "version": "0.3.57", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-node/CHANGELOG.md b/plugins/app-node/CHANGELOG.md index b39f2a2621..d396e40aba 100644 --- a/plugins/app-node/CHANGELOG.md +++ b/plugins/app-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-app-node +## 0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + ## 0.1.9-next.1 ### Patch Changes diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index 971fe6b6e0..38c5eadacf 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-node", "description": "Node.js library for the app plugin", - "version": "0.1.9-next.1", + "version": "0.1.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/visualizer/.eslintrc.js b/plugins/app-visualizer/.eslintrc.js similarity index 100% rename from plugins/visualizer/.eslintrc.js rename to plugins/app-visualizer/.eslintrc.js diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md new file mode 100644 index 0000000000..a4ddea2590 --- /dev/null +++ b/plugins/app-visualizer/CHANGELOG.md @@ -0,0 +1,14 @@ +# @backstage/plugin-app-visualizer + +## 0.1.0 + +### Minor Changes + +- e57cc9f: Initial release of the app visualizer plugin. + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 diff --git a/plugins/app-visualizer/README.md b/plugins/app-visualizer/README.md new file mode 100644 index 0000000000..865cd66746 --- /dev/null +++ b/plugins/app-visualizer/README.md @@ -0,0 +1,10 @@ +# @backstage/plugin-app-visualizer + +A plugin to help explore the structure of your Backstage app. + +This plugin provides the following extensions: + +| ID | Type | Description | Default Config | +| ------------------------- | --------- | ------------------------------------ | ------------------------- | +| `page:app-visualizer` | `Page` | The app visualizer page | `{ path: '/visualizer' }` | +| `nav-item:app-visualizer` | `NavItem` | Nav item for the app visualizer page | | diff --git a/plugins/visualizer/api-report.md b/plugins/app-visualizer/api-report.md similarity index 85% rename from plugins/visualizer/api-report.md rename to plugins/app-visualizer/api-report.md index 0cd9eface0..764caa7190 100644 --- a/plugins/visualizer/api-report.md +++ b/plugins/app-visualizer/api-report.md @@ -1,4 +1,4 @@ -## API Report File for "@backstage/plugin-visualizer" +## API Report File for "@backstage/plugin-app-visualizer" > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). diff --git a/plugins/visualizer/catalog-info.yaml b/plugins/app-visualizer/catalog-info.yaml similarity index 70% rename from plugins/visualizer/catalog-info.yaml rename to plugins/app-visualizer/catalog-info.yaml index f9cedddf87..cb444af524 100644 --- a/plugins/visualizer/catalog-info.yaml +++ b/plugins/app-visualizer/catalog-info.yaml @@ -1,8 +1,8 @@ apiVersion: backstage.io/v1alpha1 kind: Component metadata: - name: backstage-plugin-visualizer - title: '@backstage/plugin-visualizer' + name: backstage-plugin-app-visualizer + title: '@backstage/plugin-app-visualizer' description: Visualizes the Backstage app structure spec: lifecycle: experimental diff --git a/plugins/visualizer/package.json b/plugins/app-visualizer/package.json similarity index 87% rename from plugins/visualizer/package.json rename to plugins/app-visualizer/package.json index 53cc419735..197e97c464 100644 --- a/plugins/visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -1,8 +1,7 @@ { - "name": "@backstage/plugin-visualizer", + "name": "@backstage/plugin-app-visualizer", "description": "Visualizes the Backstage app structure", - "private": true, - "version": "0.0.2-next.1", + "version": "0.1.0", "publishConfig": { "access": "public" }, @@ -27,8 +26,7 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", "@material-ui/core": "^4.12.2", - "@material-ui/icons": "^4.9.1", - "@types/react": "^16.13.1 || ^17.0.0" + "@material-ui/icons": "^4.9.1" }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0", @@ -36,7 +34,8 @@ "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@types/react": "^16.13.1 || ^17.0.0" }, "files": [ "dist" diff --git a/plugins/visualizer/src/components/AppVisualizerPage/AppVisualizerPage.tsx b/plugins/app-visualizer/src/components/AppVisualizerPage/AppVisualizerPage.tsx similarity index 100% rename from plugins/visualizer/src/components/AppVisualizerPage/AppVisualizerPage.tsx rename to plugins/app-visualizer/src/components/AppVisualizerPage/AppVisualizerPage.tsx diff --git a/plugins/visualizer/src/components/AppVisualizerPage/DetailedVisualizer.tsx b/plugins/app-visualizer/src/components/AppVisualizerPage/DetailedVisualizer.tsx similarity index 100% rename from plugins/visualizer/src/components/AppVisualizerPage/DetailedVisualizer.tsx rename to plugins/app-visualizer/src/components/AppVisualizerPage/DetailedVisualizer.tsx diff --git a/plugins/visualizer/src/components/AppVisualizerPage/TextVisualizer.tsx b/plugins/app-visualizer/src/components/AppVisualizerPage/TextVisualizer.tsx similarity index 100% rename from plugins/visualizer/src/components/AppVisualizerPage/TextVisualizer.tsx rename to plugins/app-visualizer/src/components/AppVisualizerPage/TextVisualizer.tsx diff --git a/plugins/visualizer/src/components/AppVisualizerPage/TreeVisualizer.tsx b/plugins/app-visualizer/src/components/AppVisualizerPage/TreeVisualizer.tsx similarity index 100% rename from plugins/visualizer/src/components/AppVisualizerPage/TreeVisualizer.tsx rename to plugins/app-visualizer/src/components/AppVisualizerPage/TreeVisualizer.tsx diff --git a/plugins/visualizer/src/components/AppVisualizerPage/index.ts b/plugins/app-visualizer/src/components/AppVisualizerPage/index.ts similarity index 100% rename from plugins/visualizer/src/components/AppVisualizerPage/index.ts rename to plugins/app-visualizer/src/components/AppVisualizerPage/index.ts diff --git a/plugins/visualizer/src/index.ts b/plugins/app-visualizer/src/index.ts similarity index 100% rename from plugins/visualizer/src/index.ts rename to plugins/app-visualizer/src/index.ts diff --git a/plugins/visualizer/src/plugin.tsx b/plugins/app-visualizer/src/plugin.tsx similarity index 86% rename from plugins/visualizer/src/plugin.tsx rename to plugins/app-visualizer/src/plugin.tsx index 0aa8053604..9a726ecc99 100644 --- a/plugins/visualizer/src/plugin.tsx +++ b/plugins/app-visualizer/src/plugin.tsx @@ -25,14 +25,14 @@ import React from 'react'; const rootRouteRef = createRouteRef(); -const visualizerPage = createPageExtension({ +const appVisualizerPage = createPageExtension({ defaultPath: '/visualizer', routeRef: rootRouteRef, loader: () => import('./components/AppVisualizerPage').then(m => ), }); -export const visualizerNavItem = createNavItemExtension({ +export const appVisualizerNavItem = createNavItemExtension({ title: 'Visualizer', icon: VisualizerIcon, routeRef: rootRouteRef, @@ -40,6 +40,6 @@ export const visualizerNavItem = createNavItemExtension({ /** @public */ export const visualizerPlugin = createPlugin({ - id: 'visualizer', - extensions: [visualizerPage, visualizerNavItem], + id: 'app-visualizer', + extensions: [appVisualizerPage, appVisualizerNavItem], }); diff --git a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md index 1a58abfcef..22f61ff088 100644 --- a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-auth-backend-module-atlassian-provider +## 0.1.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-atlassian-provider/package.json b/plugins/auth-backend-module-atlassian-provider/package.json index b33679387b..3d73de88fc 100644 --- a/plugins/auth-backend-module-atlassian-provider/package.json +++ b/plugins/auth-backend-module-atlassian-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-atlassian-provider", "description": "The atlassian-provider backend module for the auth plugin.", - "version": "0.1.1-next.1", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md index af43d4e2f0..e9e5d99224 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-auth-backend-module-gcp-iap-provider +## 0.2.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-gcp-iap-provider/package.json b/plugins/auth-backend-module-gcp-iap-provider/package.json index 064eb52055..d167389b20 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/package.json +++ b/plugins/auth-backend-module-gcp-iap-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-gcp-iap-provider", "description": "A GCP IAP auth provider module for the Backstage auth backend", - "version": "0.2.3-next.1", + "version": "0.2.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-github-provider/CHANGELOG.md b/plugins/auth-backend-module-github-provider/CHANGELOG.md index be21837ee8..ee59a1e269 100644 --- a/plugins/auth-backend-module-github-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-github-provider/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-auth-backend-module-github-provider +## 0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.1.6-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json index 49daad89c4..bf84dc5ec7 100644 --- a/plugins/auth-backend-module-github-provider/package.json +++ b/plugins/auth-backend-module-github-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-github-provider", "description": "The github-provider backend module for the auth plugin.", - "version": "0.1.6-next.1", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md index 861b78bea8..92acc636c1 100644 --- a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-auth-backend-module-gitlab-provider +## 0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.1.6-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-gitlab-provider/package.json b/plugins/auth-backend-module-gitlab-provider/package.json index 029ec0b3fc..c7f4d5ef04 100644 --- a/plugins/auth-backend-module-gitlab-provider/package.json +++ b/plugins/auth-backend-module-gitlab-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-gitlab-provider", "description": "The gitlab-provider backend module for the auth plugin.", - "version": "0.1.6-next.1", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-google-provider/CHANGELOG.md b/plugins/auth-backend-module-google-provider/CHANGELOG.md index 5a5b5f6a62..b43722644b 100644 --- a/plugins/auth-backend-module-google-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-google-provider/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-auth-backend-module-google-provider +## 0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.1.6-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-google-provider/package.json b/plugins/auth-backend-module-google-provider/package.json index 10a981997c..7528d9f8b6 100644 --- a/plugins/auth-backend-module-google-provider/package.json +++ b/plugins/auth-backend-module-google-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-google-provider", "description": "A Google auth provider module for the Backstage auth backend", - "version": "0.1.6-next.1", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md index 57fa8a7469..496538fdf0 100644 --- a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-auth-backend-module-microsoft-provider +## 0.1.4 + +### Patch Changes + +- 928efbc: Deprecated the `authModuleMicrosoftProvider` export. A default export is now available and should be used like this in your backend: `backend.add(import('@backstage/plugin-auth-backend-module-microsoft-provider'));` +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-microsoft-provider/api-report.md b/plugins/auth-backend-module-microsoft-provider/api-report.md index 21bf77d545..33600c10d8 100644 --- a/plugins/auth-backend-module-microsoft-provider/api-report.md +++ b/plugins/auth-backend-module-microsoft-provider/api-report.md @@ -10,9 +10,13 @@ import { PassportOAuthAuthenticatorHelper } from '@backstage/plugin-auth-node'; import { PassportProfile } from '@backstage/plugin-auth-node'; import { SignInResolverFactory } from '@backstage/plugin-auth-node'; -// @public (undocumented) +// @public @deprecated (undocumented) export const authModuleMicrosoftProvider: () => BackendFeature; +// @public (undocumented) +const authModuleMicrosoftProvider_2: () => BackendFeature; +export default authModuleMicrosoftProvider_2; + // @public (undocumented) export const microsoftAuthenticator: OAuthAuthenticator< { diff --git a/plugins/auth-backend-module-microsoft-provider/package.json b/plugins/auth-backend-module-microsoft-provider/package.json index 2156179154..9412575200 100644 --- a/plugins/auth-backend-module-microsoft-provider/package.json +++ b/plugins/auth-backend-module-microsoft-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-microsoft-provider", "description": "The microsoft-provider backend module for the auth plugin.", - "version": "0.1.4-next.1", + "version": "0.1.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-microsoft-provider/src/deprecated.ts b/plugins/auth-backend-module-microsoft-provider/src/deprecated.ts new file mode 100644 index 0000000000..3c671b6c25 --- /dev/null +++ b/plugins/auth-backend-module-microsoft-provider/src/deprecated.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. + */ + +import { authModuleMicrosoftProvider as deprecatedAuthModuleMicrosoftProvider } from './module'; + +/** + * @public + * @deprecated Use default import instead + */ +export const authModuleMicrosoftProvider = + deprecatedAuthModuleMicrosoftProvider; diff --git a/plugins/auth-backend-module-microsoft-provider/src/index.ts b/plugins/auth-backend-module-microsoft-provider/src/index.ts index ae4fbf5926..45b7b719cd 100644 --- a/plugins/auth-backend-module-microsoft-provider/src/index.ts +++ b/plugins/auth-backend-module-microsoft-provider/src/index.ts @@ -21,5 +21,6 @@ */ export { microsoftAuthenticator } from './authenticator'; -export { authModuleMicrosoftProvider } from './module'; +export { authModuleMicrosoftProvider as default } from './module'; export { microsoftSignInResolvers } from './resolvers'; +export * from './deprecated'; diff --git a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md index 498147fefa..44cb96b97d 100644 --- a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-auth-backend-module-oauth2-provider +## 0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.1.6-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-provider/package.json b/plugins/auth-backend-module-oauth2-provider/package.json index b005b13ade..5edc0be4b8 100644 --- a/plugins/auth-backend-module-oauth2-provider/package.json +++ b/plugins/auth-backend-module-oauth2-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-provider", "description": "The oauth2-provider backend module for the auth plugin.", - "version": "0.1.6-next.1", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md index 1b698712d6..71c14a75e2 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-auth-backend-module-oauth2-proxy-provider +## 0.1.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/errors@1.2.3 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/package.json b/plugins/auth-backend-module-oauth2-proxy-provider/package.json index 368a4dbe0e..c3d49bfcd0 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/package.json +++ b/plugins/auth-backend-module-oauth2-proxy-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-proxy-provider", "description": "The oauth2-proxy-provider backend module for the auth plugin.", - "version": "0.1.1-next.1", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-okta-provider/CHANGELOG.md b/plugins/auth-backend-module-okta-provider/CHANGELOG.md index eb8ffbbc80..b059fa0bb4 100644 --- a/plugins/auth-backend-module-okta-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-okta-provider/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-auth-backend-module-okta-provider +## 0.0.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.0.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.0.2-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-okta-provider/package.json b/plugins/auth-backend-module-okta-provider/package.json index 981b05fb8f..7159ab1292 100644 --- a/plugins/auth-backend-module-okta-provider/package.json +++ b/plugins/auth-backend-module-okta-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-okta-provider", "description": "The okta-provider backend module for the auth plugin.", - "version": "0.0.2-next.1", + "version": "0.0.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md index a34f8338f2..147a13b97d 100644 --- a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-auth-backend-module-pinniped-provider +## 0.1.3 + +### Patch Changes + +- 928efbc: Deprecated the `authModulePinnipedProvider` export. A default export is now available and should be used like this in your backend: `backend.add(import('@backstage/plugin-auth-backend-module-pinniped-provider'));` +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-pinniped-provider/api-report.md b/plugins/auth-backend-module-pinniped-provider/api-report.md index 430099713e..182ea8ba21 100644 --- a/plugins/auth-backend-module-pinniped-provider/api-report.md +++ b/plugins/auth-backend-module-pinniped-provider/api-report.md @@ -10,9 +10,13 @@ import { OAuthAuthenticator } from '@backstage/plugin-auth-node'; import { Strategy } from 'openid-client'; import { TokenSet } from 'openid-client'; -// @public (undocumented) +// @public @deprecated (undocumented) export const authModulePinnipedProvider: () => BackendFeature; +// @public (undocumented) +const authModulePinnipedProvider_2: () => BackendFeature; +export default authModulePinnipedProvider_2; + // @public (undocumented) export const pinnipedAuthenticator: OAuthAuthenticator< PinnipedStrategyCache, diff --git a/plugins/auth-backend-module-pinniped-provider/package.json b/plugins/auth-backend-module-pinniped-provider/package.json index ed0e7a1c8c..bda4cd9751 100644 --- a/plugins/auth-backend-module-pinniped-provider/package.json +++ b/plugins/auth-backend-module-pinniped-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-pinniped-provider", "description": "The pinniped-provider backend module for the auth plugin.", - "version": "0.1.3-next.1", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-pinniped-provider/src/deprecated.ts b/plugins/auth-backend-module-pinniped-provider/src/deprecated.ts new file mode 100644 index 0000000000..0dd2ed36bd --- /dev/null +++ b/plugins/auth-backend-module-pinniped-provider/src/deprecated.ts @@ -0,0 +1,23 @@ +/* + * 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 { authModulePinnipedProvider as deprecatedAuthModulePinnipedProvider } from './module'; + +/** + * @public + * @deprecated Use default import instead + */ +export const authModulePinnipedProvider = deprecatedAuthModulePinnipedProvider; diff --git a/plugins/auth-backend-module-pinniped-provider/src/index.ts b/plugins/auth-backend-module-pinniped-provider/src/index.ts index df4cd58603..f4b789644d 100644 --- a/plugins/auth-backend-module-pinniped-provider/src/index.ts +++ b/plugins/auth-backend-module-pinniped-provider/src/index.ts @@ -21,4 +21,5 @@ */ export { pinnipedAuthenticator, PinnipedStrategyCache } from './authenticator'; -export { authModulePinnipedProvider } from './module'; +export { authModulePinnipedProvider as default } from './module'; +export * from './deprecated'; diff --git a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md index 4bfdac9f2f..8beb4ed11c 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-auth-backend-module-vmware-cloud-provider +## 0.1.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-vmware-cloud-provider/package.json b/plugins/auth-backend-module-vmware-cloud-provider/package.json index 5ebd864ef5..b9b6a3cdaf 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/package.json +++ b/plugins/auth-backend-module-vmware-cloud-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-vmware-cloud-provider", "description": "The vmware-cloud-provider backend module for the auth plugin.", - "version": "0.1.1-next.1", + "version": "0.1.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 eeecda384a..a65f0bdb61 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,47 @@ # @backstage/plugin-auth-backend +## 0.20.3 + +### Patch Changes + +- 004499c: Fixed an issue where some Okta's resolvers were missing +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.1.1 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.1.1 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.2.3 + - @backstage/plugin-auth-backend-module-github-provider@0.1.6 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.6 + - @backstage/plugin-auth-backend-module-google-provider@0.1.6 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.6 + - @backstage/plugin-auth-backend-module-okta-provider@0.0.2 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.20.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-backend-module-atlassian-provider@0.1.1-next.2 + - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.2.3-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.1.6-next.2 + - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.6-next.2 + - @backstage/plugin-auth-backend-module-google-provider@0.1.6-next.2 + - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.6-next.2 + - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.1.1-next.2 + - @backstage/plugin-auth-backend-module-okta-provider@0.0.2-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + ## 0.20.3-next.1 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 6e5660815a..a2b4d01b6c 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.20.3-next.1", + "version": "0.20.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index ab2516be2d..36d65e9fa3 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-auth-node +## 0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 0.4.3-next.1 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 6c76eff3b8..fc8fb5b25c 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.4.3-next.1", + "version": "0.4.3", "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 84c9a5df54..7b0a081b34 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-azure-devops-backend +## 0.5.1 + +### Patch Changes + +- d076ee4: Updated dependency `azure-devops-node-api` to `^12.0.0`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-azure-devops-common@0.3.2 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.5.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + ## 0.5.1-next.1 ### Patch Changes diff --git a/plugins/azure-devops-backend/README.md b/plugins/azure-devops-backend/README.md index 2fe62c90eb..0066e43856 100644 --- a/plugins/azure-devops-backend/README.md +++ b/plugins/azure-devops-backend/README.md @@ -23,9 +23,9 @@ Configuration Details: - `AZURE_TOKEN` environment variable must be set to a [Personal Access Token](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=preview-page) with read access to both Code and Build - `organization` is your Azure DevOps Services (cloud) Organization name or for Azure DevOps Server (on-premise) this will be your Collection name -#### Multi Organization +#### Multi Organization & Service Principals -To support cases where you have multiple Azure DevOps organizations you will want to make sure to configure them in the `integrations.azure` section of your `app-config.yaml` as detailed in the [Azure DevOps Locations](https://backstage.io/docs/integrations/azure/locations) documentation. +To support cases where you have multiple Azure DevOps organizations and/or you want to use a Service Principal you will want to make sure to configure them in the `integrations.azure` section of your `app-config.yaml` as detailed in the [Azure DevOps Locations](https://backstage.io/docs/integrations/azure/locations) documentation. **Note:** You will still need to define the [configuration above](#configuration). diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index 113677ff79..12b598f7e9 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.5.1-next.1", + "version": "0.5.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops/.eslintrc.js b/plugins/azure-devops/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/azure-devops/.eslintrc.js +++ b/plugins/azure-devops/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index da2e0d3fa0..8d851523f6 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-azure-devops +## 0.3.11 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-azure-devops-common@0.3.2 + +## 0.3.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.3.11-next.1 ### Patch Changes diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index 38c1eed279..cfff4348ee 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -22,7 +22,7 @@ import { Readme } from '@backstage/plugin-azure-devops-common'; import { ReadmeConfig } from '@backstage/plugin-azure-devops-common'; import { RepoBuild } from '@backstage/plugin-azure-devops-common'; import { RepoBuildOptions } from '@backstage/plugin-azure-devops-common'; -import { SvgIconProps } from '@material-ui/core'; +import { SvgIconProps } from '@material-ui/core/SvgIcon'; import { Team } from '@backstage/plugin-azure-devops-common'; // @public (undocumented) diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 53d74fe6f7..db744139ee 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.11-next.1", + "version": "0.3.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops/src/components/AzureGitTagsIcon/AzureGitTagsIcon.tsx b/plugins/azure-devops/src/components/AzureGitTagsIcon/AzureGitTagsIcon.tsx index c8b63e3259..0d317e3ce1 100644 --- a/plugins/azure-devops/src/components/AzureGitTagsIcon/AzureGitTagsIcon.tsx +++ b/plugins/azure-devops/src/components/AzureGitTagsIcon/AzureGitTagsIcon.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SvgIcon, SvgIconProps } from '@material-ui/core'; +import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon'; import React from 'react'; diff --git a/plugins/azure-devops/src/components/AzurePipelinesIcon/AzurePipelinesIcon.tsx b/plugins/azure-devops/src/components/AzurePipelinesIcon/AzurePipelinesIcon.tsx index bd19331f6e..10cdb3a905 100644 --- a/plugins/azure-devops/src/components/AzurePipelinesIcon/AzurePipelinesIcon.tsx +++ b/plugins/azure-devops/src/components/AzurePipelinesIcon/AzurePipelinesIcon.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SvgIcon, SvgIconProps } from '@material-ui/core'; +import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon'; import React from 'react'; diff --git a/plugins/azure-devops/src/components/AzurePullRequestsIcon/AzurePullRequestsIcon.tsx b/plugins/azure-devops/src/components/AzurePullRequestsIcon/AzurePullRequestsIcon.tsx index 99e3f74e90..e298f8bc25 100644 --- a/plugins/azure-devops/src/components/AzurePullRequestsIcon/AzurePullRequestsIcon.tsx +++ b/plugins/azure-devops/src/components/AzurePullRequestsIcon/AzurePullRequestsIcon.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import { SvgIcon, SvgIconProps } from '@material-ui/core'; +import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon'; /** @public */ export const AzurePullRequestsIcon = (props: SvgIconProps) => ( diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index 6707929a6c..09eba5f5a2 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { Box, Typography } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Typography from '@material-ui/core/Typography'; import { BuildResult, BuildRun, diff --git a/plugins/azure-devops/src/components/GitTagTable/GitTagTable.tsx b/plugins/azure-devops/src/components/GitTagTable/GitTagTable.tsx index c6abba55e1..f34a1929fe 100644 --- a/plugins/azure-devops/src/components/GitTagTable/GitTagTable.tsx +++ b/plugins/azure-devops/src/components/GitTagTable/GitTagTable.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Box } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; import { Link, ResponseErrorPanel, diff --git a/plugins/azure-devops/src/components/PullRequestStatusButtonGroup/PullRequestStatusButtonGroup.tsx b/plugins/azure-devops/src/components/PullRequestStatusButtonGroup/PullRequestStatusButtonGroup.tsx index f516bfb0e5..1b0b9a8afe 100644 --- a/plugins/azure-devops/src/components/PullRequestStatusButtonGroup/PullRequestStatusButtonGroup.tsx +++ b/plugins/azure-devops/src/components/PullRequestStatusButtonGroup/PullRequestStatusButtonGroup.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { Button, ButtonGroup } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import ButtonGroup from '@material-ui/core/ButtonGroup'; import { PullRequestStatus } from '@backstage/plugin-azure-devops-common'; import React from 'react'; diff --git a/plugins/azure-devops/src/components/PullRequestTable/PullRequestTable.tsx b/plugins/azure-devops/src/components/PullRequestTable/PullRequestTable.tsx index b37ba6e73c..d672102945 100644 --- a/plugins/azure-devops/src/components/PullRequestTable/PullRequestTable.tsx +++ b/plugins/azure-devops/src/components/PullRequestTable/PullRequestTable.tsx @@ -14,7 +14,8 @@ * limitations under the License. */ -import { Box, Chip } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Chip from '@material-ui/core/Chip'; import { Link, ResponseErrorPanel, diff --git a/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestCard/PullRequestCard.tsx b/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestCard/PullRequestCard.tsx index 98237cb2a3..dd9fff86b5 100644 --- a/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestCard/PullRequestCard.tsx +++ b/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestCard/PullRequestCard.tsx @@ -15,7 +15,9 @@ */ import { Avatar, Link } from '@backstage/core-components'; -import { Card, CardContent, CardHeader } from '@material-ui/core'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import CardHeader from '@material-ui/core/CardHeader'; import Typography from '@material-ui/core/Typography'; import { AutoCompleteIcon } from '../AutoCompleteIcon'; diff --git a/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestGrid/PullRequestGrid.tsx b/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestGrid/PullRequestGrid.tsx index 8b9c49beb4..0244ea3bb1 100644 --- a/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestGrid/PullRequestGrid.tsx +++ b/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestGrid/PullRequestGrid.tsx @@ -17,7 +17,7 @@ import { PullRequestGridColumn } from '../PullRequestGridColumn'; import { PullRequestGroup } from '../types'; import React from 'react'; -import { styled } from '@material-ui/core'; +import { styled } from '@material-ui/core/styles'; const GridDiv = styled('div')(({ theme }) => ({ display: 'flex', diff --git a/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestGridColumn/PullRequestGridColumn.tsx b/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestGridColumn/PullRequestGridColumn.tsx index 94a648188d..f06216ac76 100644 --- a/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestGridColumn/PullRequestGridColumn.tsx +++ b/plugins/azure-devops/src/components/PullRequestsPage/lib/PullRequestGridColumn/PullRequestGridColumn.tsx @@ -14,7 +14,9 @@ * limitations under the License. */ -import { Paper, Typography, styled, withStyles } from '@material-ui/core'; +import Paper from '@material-ui/core/Paper'; +import Typography from '@material-ui/core/Typography'; +import { styled, withStyles } from '@material-ui/core/styles'; import { PullRequestCard } from '../PullRequestCard'; import { PullRequestGroup } from '../types'; diff --git a/plugins/azure-devops/src/components/ReadmeCard/ReadmeCard.tsx b/plugins/azure-devops/src/components/ReadmeCard/ReadmeCard.tsx index 420fe6ecf4..300c9e0d7c 100644 --- a/plugins/azure-devops/src/components/ReadmeCard/ReadmeCard.tsx +++ b/plugins/azure-devops/src/components/ReadmeCard/ReadmeCard.tsx @@ -14,7 +14,9 @@ * limitations under the License. */ -import { Box, Button, makeStyles } from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Button from '@material-ui/core/Button'; +import { makeStyles } from '@material-ui/core/styles'; import { InfoCard, Progress, diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index 951d2fc785..c806c46925 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-azure-sites-backend +## 0.1.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config@1.1.1 + - @backstage/plugin-azure-sites-common@0.1.1 + +## 0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + ## 0.1.19-next.1 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index 5d05f4e5e0..ae3a849810 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.19-next.1", + "version": "0.1.19", "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 06adf894fb..dd706132a6 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-azure-sites +## 0.1.18 + +### Patch Changes + +- a31f688: Show Azure site tags in `EntityAzureSitesOverviewWidget`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-azure-sites-common@0.1.1 + +## 0.1.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.18-next.1 ### Patch Changes diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index caa06b6de4..cc16ab9e47 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.18-next.1", + "version": "0.1.18", "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 7c2470c64f..c0135f7ee8 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-badges-backend +## 0.3.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.3.6-next.1 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index c46c5bbaf1..893a5b6969 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.3.6-next.1", + "version": "0.3.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index a6f71e5073..0897cf4caf 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-badges +## 0.2.53 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.2.53-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.2.53-next.1 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index d9ca86a424..688536d260 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.53-next.1", + "version": "0.2.53", "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 cdd55bc02e..51dac2f648 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-bazaar-backend +## 0.3.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + +## 0.3.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.3.7-next.1 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index a3e48d8bd3..82f4c66a76 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.3.7-next.1", + "version": "0.3.7", "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 227e4689a7..5e048efb1b 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-bazaar +## 0.2.21 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.2.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.2.21-next.1 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index f103ba1726..058ead5ca3 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.21-next.1", + "version": "0.2.21", "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 d4d4dcdd01..efc87f6839 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-bitrise +## 0.1.56 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.1.56-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.56-next.1 ### Patch Changes diff --git a/plugins/bitrise/README.md b/plugins/bitrise/README.md index 9c99f28568..e5d5c2122c 100644 --- a/plugins/bitrise/README.md +++ b/plugins/bitrise/README.md @@ -28,9 +28,8 @@ const websiteEntityPage = ( ``` -Now your plugin should be visible as a tab at the top of the entity pages, -specifically for components that are of the type `website`. -However, it warns of a missing `bitrise.io/app` annotation. +Your plugin should now appear as a tab at the top of entity pages, particularly for `website` component types. +However, it alerts you to a missing `bitrise.io/app` annotation. Add the annotation to your component [catalog-info.yaml](https://github.com/backstage/backstage/blob/master/catalog-info.yaml) as shown in the highlighted example below: @@ -51,4 +50,4 @@ proxy: Authorization: ${BITRISE_AUTH_TOKEN} ``` -Learn on https://devcenter.bitrise.io/api/authentication how to create a new Bitrise token. +Learn how to generate a new Bitrise token at https://devcenter.bitrise.io/api/authentication. diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index ccddc2e088..2dd804f746 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.56-next.1", + "version": "0.1.56", "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 5e4687d322..ff0c82bcc4 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.3.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- 22e88d0: Added status and e-mail as labels to the AWS Account Resource +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/integration-aws-node@0.1.8 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 57c094d988..af507e3c68 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.3.3-next.1", + "version": "0.3.3", "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 ba467b201f..e33d32aa36 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.28 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.1.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.28-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index e17fe6b1e9..05d2587746 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.28-next.1", + "version": "0.1.28", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md index 583cd38e3f..28d4c10240 100644 --- a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-catalog-backend-module-backstage-openapi +## 0.1.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-openapi-utils@0.1.2 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-openapi-utils@0.1.2-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.2-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-backstage-openapi/package.json b/plugins/catalog-backend-module-backstage-openapi/package.json index 1f49fd2715..ff331aeca5 100644 --- a/plugins/catalog-backend-module-backstage-openapi/package.json +++ b/plugins/catalog-backend-module-backstage-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-backstage-openapi", - "version": "0.1.2-next.1", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 574d7f4051..0fb20563d0 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.24 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.15 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-events-node@0.2.18 + +## 0.1.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.24-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index df8d956599..e1352c6363 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.24-next.1", + "version": "0.1.24", "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 15845da184..d3abaf1608 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.22 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.1.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.22-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 7e56481f55..00f8c6572f 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.22-next.1", + "version": "0.1.22", "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 cc207827c6..b39778b2fb 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.24 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.15 + +## 0.2.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + ## 0.2.24-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index 1f0add4c46..2625835a5b 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.24-next.1", + "version": "0.2.24", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index 6ea18854e9..aef3c0c14a 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.9-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index 5e1ebda71d..5515feeb5b 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", "description": "A Backstage catalog backend module that helps integrate towards GCP", - "version": "0.1.9-next.1", + "version": "0.1.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 7c68090dd6..f43a1a7550 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.25 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.1.25-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.25-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 858de342c2..95f90287c3 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.25-next.1", + "version": "0.1.25", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index bdb674adc0..2dac3fa910 100644 --- a/plugins/catalog-backend-module-github-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-catalog-backend-module-github-org +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-catalog-backend-module-github@0.4.7 + - @backstage/config@1.1.1 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-backend-module-github@0.4.7-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index 5fe618f1ca..bd7e23f90d 100644 --- a/plugins/catalog-backend-module-github-org/package.json +++ b/plugins/catalog-backend-module-github-org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github-org", "description": "The github-org backend module for the catalog plugin.", - "version": "0.1.3-next.1", + "version": "0.1.3", "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 0ebca9c910..6ea0c50666 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-catalog-backend-module-github +## 0.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-events-node@0.2.18 + +## 0.4.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.4.7-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 2e6ec26190..9231a0cd69 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.4.7-next.1", + "version": "0.4.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index c5c4f7f87a..138796de12 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + +## 0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.3.6-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/api-report.md b/plugins/catalog-backend-module-gitlab/api-report.md index 6620f6445f..bb52d8908a 100644 --- a/plugins/catalog-backend-module-gitlab/api-report.md +++ b/plugins/catalog-backend-module-gitlab/api-report.md @@ -8,10 +8,14 @@ import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; import { EntityProvider } from '@backstage/plugin-catalog-node'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; +import { GitLabIntegrationConfig } from '@backstage/integration'; +import { GroupEntity } from '@backstage/catalog-model'; import { LocationSpec } from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { TaskRunner } from '@backstage/backend-tasks'; +import { TaskScheduleDefinition } from '@backstage/backend-tasks'; +import { UserEntity } from '@backstage/catalog-model'; // @public export class GitlabDiscoveryEntityProvider implements EntityProvider { @@ -53,6 +57,20 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor { ): Promise; } +// @public +export type GitLabGroup = { + id: number; + name: string; + full_path: string; + description?: string; + parent_id?: number; +}; + +// @public (undocumented) +export type GitLabGroupSamlIdentity = { + extern_uid: string; +}; + // @public export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { // (undocumented) @@ -64,9 +82,84 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { logger: Logger; schedule?: TaskRunner; scheduler?: PluginTaskScheduler; + userTransformer?: UserTransformer; + groupEntitiesTransformer?: GroupTransformer; + groupNameTransformer?: GroupNameTransformer; }, ): GitlabOrgDiscoveryEntityProvider[]; // (undocumented) getProviderName(): string; } + +// @public +export type GitlabProviderConfig = { + host: string; + group: string; + id: string; + branch?: string; + fallbackBranch: string; + catalogFile: string; + projectPattern: RegExp; + userPattern: RegExp; + groupPattern: RegExp; + orgEnabled?: boolean; + schedule?: TaskScheduleDefinition; + skipForkedRepos?: boolean; +}; + +// @public +export type GitLabUser = { + id: number; + username: string; + email?: string; + name: string; + state: string; + web_url: string; + avatar_url: string; + groups?: GitLabGroup[]; + group_saml_identity?: GitLabGroupSamlIdentity; +}; + +// @public +export type GroupNameTransformer = ( + options: GroupNameTransformerOptions, +) => string; + +// @public +export interface GroupNameTransformerOptions { + // (undocumented) + group: GitLabGroup; + // (undocumented) + providerConfig: GitlabProviderConfig; +} + +// @public +export type GroupTransformer = ( + options: GroupTransformerOptions, +) => GroupEntity[]; + +// @public +export interface GroupTransformerOptions { + // (undocumented) + groupNameTransformer: GroupNameTransformer; + // (undocumented) + groups: GitLabGroup[]; + // (undocumented) + providerConfig: GitlabProviderConfig; +} + +// @public +export type UserTransformer = (options: UserTransformerOptions) => UserEntity; + +// @public +export interface UserTransformerOptions { + // (undocumented) + groupNameTransformer: GroupNameTransformer; + // (undocumented) + integrationConfig: GitLabIntegrationConfig; + // (undocumented) + providerConfig: GitlabProviderConfig; + // (undocumented) + user: GitLabUser; +} ``` diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 96a71c7695..4092a1dab2 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.3.6-next.1", + "version": "0.3.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/src/index.ts b/plugins/catalog-backend-module-gitlab/src/index.ts index 2dd19c041d..cedcb828d6 100644 --- a/plugins/catalog-backend-module-gitlab/src/index.ts +++ b/plugins/catalog-backend-module-gitlab/src/index.ts @@ -25,3 +25,15 @@ export { GitlabDiscoveryEntityProvider, GitlabOrgDiscoveryEntityProvider, } from './providers'; +export type { + GitLabUser, + GitLabGroup, + GitlabProviderConfig, + GitLabGroupSamlIdentity, + GroupNameTransformer, + GroupNameTransformerOptions, + GroupTransformer, + GroupTransformerOptions, + UserTransformer, + UserTransformerOptions, +} from './lib'; diff --git a/plugins/catalog-backend-module-gitlab/src/lib/defaultTransformers.ts b/plugins/catalog-backend-module-gitlab/src/lib/defaultTransformers.ts new file mode 100644 index 0000000000..d7a6bf76e9 --- /dev/null +++ b/plugins/catalog-backend-module-gitlab/src/lib/defaultTransformers.ts @@ -0,0 +1,150 @@ +/* + * 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 { GroupEntity, UserEntity } from '@backstage/catalog-model'; +import { + GitLabGroup, + GroupNameTransformerOptions, + GroupTransformerOptions, + UserTransformerOptions, +} from './types'; + +export function defaultGroupNameTransformer( + options: GroupNameTransformerOptions, +): string { + if ( + options.providerConfig.group && + options.group.full_path.startsWith(`${options.providerConfig.group}/`) + ) { + return options.group.full_path + .replace(`${options.providerConfig.group}/`, '') + .replaceAll('/', '-'); + } + return options.group.full_path.replaceAll('/', '-'); +} + +export function defaultGroupEntitiesTransformer( + options: GroupTransformerOptions, +): GroupEntity[] { + const idMapped: { [groupId: number]: GitLabGroup } = {}; + const entities: GroupEntity[] = []; + + for (const group of options.groups) { + idMapped[group.id] = group; + } + + for (const group of options.groups) { + const annotations: { [annotationName: string]: string } = {}; + + annotations[`${options.providerConfig.host}/team-path`] = group.full_path; + + const entity: GroupEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: options.groupNameTransformer({ + group, + providerConfig: options.providerConfig, + }), + annotations: annotations, + }, + spec: { + type: 'team', + children: [], + profile: { + displayName: group.name, + }, + }, + }; + + if (group.description) { + entity.metadata.description = group.description; + } + + if (group.parent_id && idMapped.hasOwnProperty(group.parent_id)) { + entity.spec.parent = options.groupNameTransformer({ + group: idMapped[group.parent_id], + providerConfig: options.providerConfig, + }); + } + + entities.push(entity); + } + + return entities; +} + +/** + * The default implementation of the transformation from a graph user entry to + * a User entity. + * + * @public + */ +export function defaultUserTransformer( + options: UserTransformerOptions, +): UserEntity { + const annotations: { [annotationName: string]: string } = {}; + + annotations[`${options.integrationConfig.host}/user-login`] = + options.user.web_url; + if (options.user?.group_saml_identity?.extern_uid) { + annotations[`${options.integrationConfig.host}/saml-external-uid`] = + options.user.group_saml_identity.extern_uid; + } + + const entity: UserEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + name: options.user.username, + annotations: annotations, + }, + spec: { + profile: { + displayName: options.user.name || undefined, + picture: options.user.avatar_url || undefined, + }, + memberOf: [], + }, + }; + + if (options.user.email) { + if (!entity.spec) { + entity.spec = {}; + } + + if (!entity.spec.profile) { + entity.spec.profile = {}; + } + + entity.spec.profile.email = options.user.email; + } + + if (options.user.groups) { + for (const group of options.user.groups) { + if (!entity.spec.memberOf) { + entity.spec.memberOf = []; + } + entity.spec.memberOf.push( + options.groupNameTransformer({ + group, + providerConfig: options.providerConfig, + }), + ); + } + } + + return entity; +} diff --git a/plugins/catalog-backend-module-gitlab/src/lib/index.ts b/plugins/catalog-backend-module-gitlab/src/lib/index.ts index 53fad07994..1eee268862 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/index.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/index.ts @@ -16,8 +16,17 @@ export { GitLabClient, paginated } from './client'; export type { + GitLabUser, + GitLabGroup, + GitLabGroupSamlIdentity, GitLabProject, GitlabProviderConfig, GitlabGroupDescription, + GroupNameTransformer, + GroupNameTransformerOptions, + GroupTransformer, + GroupTransformerOptions, + UserTransformer, + UserTransformerOptions, } from './types'; export { readGitlabConfigs } from '../providers/config'; diff --git a/plugins/catalog-backend-module-gitlab/src/lib/types.ts b/plugins/catalog-backend-module-gitlab/src/lib/types.ts index fa2eb73da6..25c9a4a232 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/types.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/types.ts @@ -14,6 +14,8 @@ * limitations under the License. */ import { TaskScheduleDefinition } from '@backstage/backend-tasks'; +import { GroupEntity, UserEntity } from '@backstage/catalog-model'; +import { GitLabIntegrationConfig } from '@backstage/integration'; export type PagedResponse = { items: T[]; @@ -40,6 +42,11 @@ export type GitLabProject = { forked_from_project?: GitlabProjectForkedFrom; }; +/** + * Representation of a GitLab user in the GitLab API + * + * @public + */ export type GitLabUser = { id: number; username: string; @@ -52,10 +59,18 @@ export type GitLabUser = { group_saml_identity?: GitLabGroupSamlIdentity; }; +/** + * @public + */ export type GitLabGroupSamlIdentity = { extern_uid: string; }; +/** + * Representation of a GitLab group in the GitLab API + * + * @public + */ export type GitLabGroup = { id: number; name: string; @@ -113,10 +128,25 @@ export type GitLabDescendantGroupsResponse = { }; }; }; - +/** + * The configuration parameters for the GitlabProvider + * + * @public + */ export type GitlabProviderConfig = { + /** + * Identifies one of the hosts set up in the integrations + */ host: string; + /** + * Required for gitlab.com when `orgEnabled: true`. + * Optional for self managed. Must not end with slash. + * Accepts only groups under the provided path (which will be stripped) + */ group: string; + /** + * ??? + */ id: string; /** * The name of the branch to be used, to discover catalog files. @@ -128,11 +158,85 @@ export type GitlabProviderConfig = { * Defaults to: `master` */ fallbackBranch: string; + /** + * Defaults to `catalog-info.yaml` + */ catalogFile: string; + /** + * Filters found projects based on provided patter. + * Defaults to `[\s\S]*`, which means to not filter anything + */ projectPattern: RegExp; + /** + * Filters found users based on provided patter. + * Defaults to `[\s\S]*`, which means to not filter anything + */ userPattern: RegExp; + /** + * Filters found groups based on provided patter. + * Defaults to `[\s\S]*`, which means to not filter anything + */ groupPattern: RegExp; + orgEnabled?: boolean; schedule?: TaskScheduleDefinition; + /** + * If the project is a fork, skip repository + */ skipForkedRepos?: boolean; }; + +/** + * Customize how group names are generated + * + * @public + */ +export type GroupNameTransformer = ( + options: GroupNameTransformerOptions, +) => string; + +/** + * The GroupTransformerOptions + * + * @public + */ +export interface GroupNameTransformerOptions { + group: GitLabGroup; + providerConfig: GitlabProviderConfig; +} +/** + * Customize the ingested User entity + * + * @public + */ +export type UserTransformer = (options: UserTransformerOptions) => UserEntity; +/** + * The UserTransformerOptions + * + * @public + */ +export interface UserTransformerOptions { + user: GitLabUser; + integrationConfig: GitLabIntegrationConfig; + providerConfig: GitlabProviderConfig; + groupNameTransformer: GroupNameTransformer; +} + +/** + * Customize the ingested Group entity + * + * @public + */ +export type GroupTransformer = ( + options: GroupTransformerOptions, +) => GroupEntity[]; +/** + * The GroupTransformer options + * + * @public + */ +export interface GroupTransformerOptions { + groups: GitLabGroup[]; + providerConfig: GitlabProviderConfig; + groupNameTransformer: GroupNameTransformer; +} diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts index affa8a41cf..1157a2f1f3 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -18,8 +18,6 @@ import { ANNOTATION_LOCATION, ANNOTATION_ORIGIN_LOCATION, Entity, - GroupEntity, - UserEntity, } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import { GitLabIntegration, ScmIntegrations } from '@backstage/integration'; @@ -37,7 +35,19 @@ import { paginated, readGitlabConfigs, } from '../lib'; -import { GitLabGroup, GitLabUser, PagedResponse } from '../lib/types'; +import { + GitLabGroup, + GitLabUser, + PagedResponse, + UserTransformer, + GroupTransformer as GroupEntitiesTransformer, + GroupNameTransformer, +} from '../lib/types'; +import { + defaultGroupNameTransformer, + defaultGroupEntitiesTransformer, + defaultUserTransformer, +} from '../lib/defaultTransformers'; type Result = { scanned: number; @@ -59,6 +69,9 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { private readonly logger: Logger; private readonly scheduleFn: () => Promise; private connection?: EntityProviderConnection; + private userTransformer: UserTransformer; + private groupEntitiesTransformer: GroupEntitiesTransformer; + private groupNameTransformer: GroupNameTransformer; static fromConfig( config: Config, @@ -66,6 +79,9 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { logger: Logger; schedule?: TaskRunner; scheduler?: PluginTaskScheduler; + userTransformer?: UserTransformer; + groupEntitiesTransformer?: GroupEntitiesTransformer; + groupNameTransformer?: GroupNameTransformer; }, ): GitlabOrgDiscoveryEntityProvider[] { if (!options.schedule && !options.scheduler) { @@ -122,6 +138,9 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { integration: GitLabIntegration; logger: Logger; taskRunner: TaskRunner; + userTransformer?: UserTransformer; + groupEntitiesTransformer?: GroupEntitiesTransformer; + groupNameTransformer?: GroupNameTransformer; }) { this.config = options.config; this.integration = options.integration; @@ -129,6 +148,11 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { target: this.getProviderName(), }); this.scheduleFn = this.createScheduleFn(options.taskRunner); + this.userTransformer = options.userTransformer ?? defaultUserTransformer; + this.groupEntitiesTransformer = + options.groupEntitiesTransformer ?? defaultGroupEntitiesTransformer; + this.groupNameTransformer = + options.groupNameTransformer ?? defaultGroupNameTransformer; } getProviderName(): string { @@ -271,13 +295,20 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { }); const userEntities = res.matches.map(p => - this.createUserEntity(p, this.integration.config.host), - ); - const groupEntities = this.createGroupEntities( - groupsWithUsers, - this.integration.config.host, + this.userTransformer({ + user: p, + integrationConfig: this.integration.config, + providerConfig: this.config, + groupNameTransformer: this.groupNameTransformer, + }), ); + const groupEntities = this.groupEntitiesTransformer({ + groups: groupsWithUsers, + providerConfig: this.config, + groupNameTransformer: this.groupNameTransformer, + }); + await this.connection.applyMutation({ type: 'full', entities: [...userEntities, ...groupEntities].map(entity => ({ @@ -291,32 +322,6 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { }); } - private createGroupEntities( - groupResult: GitLabGroup[], - host: string, - ): GroupEntity[] { - const idMapped: { [groupId: number]: GitLabGroup } = {}; - const entities: GroupEntity[] = []; - - for (const group of groupResult) { - idMapped[group.id] = group; - } - - for (const group of groupResult) { - const entity = this.createGroupEntity(group, host); - - if (group.parent_id && idMapped.hasOwnProperty(group.parent_id)) { - entity.spec.parent = this.groupName( - idMapped[group.parent_id].full_path, - ); - } - - entities.push(entity); - } - - return entities; - } - private withLocations(host: string, baseUrl: string, entity: Entity): Entity { const location = entity.kind === 'Group' @@ -334,90 +339,4 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { entity, ) as Entity; } - - private createUserEntity(user: GitLabUser, host: string): UserEntity { - const annotations: { [annotationName: string]: string } = {}; - - annotations[`${host}/user-login`] = user.web_url; - if (user?.group_saml_identity?.extern_uid) { - annotations[`${host}/saml-external-uid`] = - user.group_saml_identity.extern_uid; - } - - const entity: UserEntity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'User', - metadata: { - name: user.username, - annotations: annotations, - }, - spec: { - profile: { - displayName: user.name || undefined, - picture: user.avatar_url || undefined, - }, - memberOf: [], - }, - }; - - if (user.email) { - if (!entity.spec) { - entity.spec = {}; - } - - if (!entity.spec.profile) { - entity.spec.profile = {}; - } - - entity.spec.profile.email = user.email; - } - - if (user.groups) { - for (const group of user.groups) { - if (!entity.spec.memberOf) { - entity.spec.memberOf = []; - } - entity.spec.memberOf.push(this.groupName(group.full_path)); - } - } - - return entity; - } - - private groupName(full_path: string): string { - if (this.config.group && full_path.startsWith(`${this.config.group}/`)) { - return full_path - .replace(`${this.config.group}/`, '') - .replaceAll('/', '-'); - } - return full_path.replaceAll('/', '-'); - } - - private createGroupEntity(group: GitLabGroup, host: string): GroupEntity { - const annotations: { [annotationName: string]: string } = {}; - - annotations[`${host}/team-path`] = group.full_path; - - const entity: GroupEntity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Group', - metadata: { - name: this.groupName(group.full_path), - annotations: annotations, - }, - spec: { - type: 'team', - children: [], - profile: { - displayName: group.name, - }, - }, - }; - - if (group.description) { - entity.metadata.description = group.description; - } - - return entity; - } } diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index ef5a8da3b7..24fd6a0b30 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.4.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-events-node@0.2.18 + +## 0.4.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.4.13-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 987082d9a8..41c0abd811 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.4.13-next.1", + "version": "0.4.13", "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 42abc68163..5e01cf2f97 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.24 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.5.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.5.24-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 2cce5949f9..6a16e89ff1 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.24-next.1", + "version": "0.5.24", "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 391bc548f0..8ea92b99b9 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.16 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.5.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.5.16-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index e06fd60bcc..1187c93262 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.16-next.1", + "version": "0.5.16", "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 d90a6d4847..ff1f865a28 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.26 + +### Patch Changes + +- 4ebf99b: Add support for the new backend system. + + A new backend module for the catalog backend + was added and exported as `default`. + + You can use it with the new backend system like + + ```ts title="packages/backend/src/index.ts" + backend.add(import('@backstage/plugin-catalog-backend-module-openapi')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-catalog-backend@1.16.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.1.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + ## 0.1.26-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/README.md b/plugins/catalog-backend-module-openapi/README.md index 6b988e15f5..6a8028895d 100644 --- a/plugins/catalog-backend-module-openapi/README.md +++ b/plugins/catalog-backend-module-openapi/README.md @@ -17,6 +17,33 @@ yarn add --cwd packages/backend @backstage/plugin-catalog-backend-module-openapi ### Adding the plugin to your `packages/backend` +```ts title="packages/backend/src/index.ts" +backend.add(import('@backstage/plugin-catalog-backend-module-openapi')); +``` + +This will add the `jsonSchemaRefPlaceholderResolver` for +the placeholder resolver keys `asyncapi` and `openapi`. + +This allows you to use the `$openapi` placeholder when referencing your OpenAPI specification and `$asyncapi` when referencing your AsyncAPI specifications. This will then resolve all `$ref` instances in your specification. + +You can also use this resolver for other kind of yaml files to resolve $ref pointer. + +```yaml +apiVersion: backstage.io/v1alpha1 +kind: API +metadata: + name: example + description: Example API +spec: + type: openapi + lifecycle: production + owner: team + definition: + $openapi: ./spec/openapi.yaml # by using $openapi Backstage will now resolve all $ref instances +``` + +### Adding the plugin to your `packages/backend` (old backend system) + #### **jsonSchemaRefPlaceholderResolver** The placeholder resolver can be added by importing `jsonSchemaRefPlaceholderResolver` in `src/plugins/catalog.ts` in your `backend` package and adding the following. diff --git a/plugins/catalog-backend-module-openapi/api-report.md b/plugins/catalog-backend-module-openapi/api-report.md index 455816645a..206cfac291 100644 --- a/plugins/catalog-backend-module-openapi/api-report.md +++ b/plugins/catalog-backend-module-openapi/api-report.md @@ -3,6 +3,7 @@ > 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 { CatalogProcessor } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; import { Entity } from '@backstage/catalog-model'; @@ -13,6 +14,10 @@ import { PlaceholderResolverParams } from '@backstage/plugin-catalog-backend'; import { ScmIntegrations } from '@backstage/integration'; import { UrlReader } from '@backstage/backend-common'; +// @public +const catalogModuleJsonSchemaRefPlaceholderResolver: () => BackendFeature; +export default catalogModuleJsonSchemaRefPlaceholderResolver; + // @public (undocumented) export function jsonSchemaRefPlaceholderResolver( params: PlaceholderResolverParams, diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 495d5f4f0d..1b3a2e46a0 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.26-next.1", + "version": "0.1.26", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,6 +34,7 @@ "dependencies": { "@apidevtools/json-schema-ref-parser": "^9.0.6", "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/integration": "workspace:^", diff --git a/plugins/catalog-backend-module-openapi/src/index.ts b/plugins/catalog-backend-module-openapi/src/index.ts index 170c925a7f..70ab88c2ff 100644 --- a/plugins/catalog-backend-module-openapi/src/index.ts +++ b/plugins/catalog-backend-module-openapi/src/index.ts @@ -22,3 +22,6 @@ export { jsonSchemaRefPlaceholderResolver } from './jsonSchemaRefPlaceholderReso * @deprecated replaced by jsonSchemaRefPlaceholderResolver */ export const openApiPlaceholderResolver = jsonSchemaRefPlaceholderResolver; + +export * from './module'; +export { default } from './module'; diff --git a/plugins/catalog-backend-module-openapi/src/module/catalogModuleJsonSchemaRefPlaceholderResolver.test.ts b/plugins/catalog-backend-module-openapi/src/module/catalogModuleJsonSchemaRefPlaceholderResolver.test.ts new file mode 100644 index 0000000000..cfea25341e --- /dev/null +++ b/plugins/catalog-backend-module-openapi/src/module/catalogModuleJsonSchemaRefPlaceholderResolver.test.ts @@ -0,0 +1,54 @@ +/* + * Copyright 2024 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 { startTestBackend } from '@backstage/backend-test-utils'; +import { PlaceholderResolver } from '@backstage/plugin-catalog-node'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { catalogModuleJsonSchemaRefPlaceholderResolver } from './catalogModuleJsonSchemaRefPlaceholderResolver'; +import { jsonSchemaRefPlaceholderResolver } from '../jsonSchemaRefPlaceholderResolver'; + +describe('catalogModuleJsonSchemaRefPlaceholderResolver', () => { + it('should register provider at the catalog extension point', async () => { + const registeredPlaceholderResolvers: { + [key: string]: PlaceholderResolver; + } = {}; + + const extensionPoint = { + addPlaceholderResolver: ( + key: string, + resolver: PlaceholderResolver, + ): void => { + registeredPlaceholderResolvers[key] = resolver; + }, + }; + + await startTestBackend({ + extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], + features: [catalogModuleJsonSchemaRefPlaceholderResolver()], + }); + + expect(Object.keys(registeredPlaceholderResolvers)).toEqual([ + 'asyncapi', + 'openapi', + ]); + expect(registeredPlaceholderResolvers.asyncapi).toBe( + jsonSchemaRefPlaceholderResolver, + ); + expect(registeredPlaceholderResolvers.openapi).toBe( + jsonSchemaRefPlaceholderResolver, + ); + }); +}); diff --git a/plugins/catalog-backend-module-openapi/src/module/catalogModuleJsonSchemaRefPlaceholderResolver.ts b/plugins/catalog-backend-module-openapi/src/module/catalogModuleJsonSchemaRefPlaceholderResolver.ts new file mode 100644 index 0000000000..053951866a --- /dev/null +++ b/plugins/catalog-backend-module-openapi/src/module/catalogModuleJsonSchemaRefPlaceholderResolver.ts @@ -0,0 +1,48 @@ +/* + * Copyright 2024 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 { createBackendModule } from '@backstage/backend-plugin-api'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { jsonSchemaRefPlaceholderResolver } from '../jsonSchemaRefPlaceholderResolver'; + +/** + * Registers the jsonSchemaRefPlaceholderResolver + * as placeholder resolver for `$asyncapi` and `$openapi`. + * + * @public + */ +export const catalogModuleJsonSchemaRefPlaceholderResolver = + createBackendModule({ + pluginId: 'catalog', + moduleId: 'json-schema-ref-placeholder-resolver', + register(env) { + env.registerInit({ + deps: { + catalog: catalogProcessingExtensionPoint, + }, + async init({ catalog }) { + catalog.addPlaceholderResolver( + 'asyncapi', + jsonSchemaRefPlaceholderResolver, + ); + catalog.addPlaceholderResolver( + 'openapi', + jsonSchemaRefPlaceholderResolver, + ); + }, + }); + }, + }); diff --git a/plugins/catalog-backend-module-openapi/src/module/index.ts b/plugins/catalog-backend-module-openapi/src/module/index.ts new file mode 100644 index 0000000000..b914472c8d --- /dev/null +++ b/plugins/catalog-backend-module-openapi/src/module/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2024 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 { catalogModuleJsonSchemaRefPlaceholderResolver as default } from './catalogModuleJsonSchemaRefPlaceholderResolver'; diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index 1dfc3537d4..dbc84f46f7 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index 18763a47a7..d9bdb74b16 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.14-next.1", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index 40f9199f91..4901341e46 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + ## 0.1.6-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index 46539df512..3dc896f7c7 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", - "version": "0.1.6-next.1", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index 5d1845ffac..947fdb5914 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + +## 0.3.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.3.6-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index acc067c054..4412c4ef7c 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", "description": "Backstage Catalog module to view unprocessed entities", - "version": "0.3.6-next.1", + "version": "0.3.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 6d9c01e745..3330de7fd3 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/plugin-catalog-backend +## 1.16.1 + +### Patch Changes + +- c3249d6: Parse the URL using a different method rather than `git-url-parse` to support wildcards for URLs which are not VCS providers +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-search-backend-module-catalog@0.1.13 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-openapi-utils@0.1.2 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-events-node@0.2.18 + +## 1.16.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-openapi-utils@0.1.2-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 1.16.1-next.1 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index cf12fbaf0b..42f40cccd2 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.16.1-next.1", + "version": "1.16.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts b/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts index c9575ce5cd..e2489df4b4 100644 --- a/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts +++ b/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts @@ -213,4 +213,34 @@ describe('UrlReaderProcessor', () => { expect(reader.search).toHaveBeenCalledTimes(1); }); + + it('parser return valid URL with wildcard *', async () => { + const logger = getVoidLogger(); + + const reader: jest.Mocked = { + readUrl: jest.fn(), + readTree: jest.fn(), + search: jest.fn().mockImplementation(async () => []), + }; + + const processor = new UrlReaderProcessor({ reader, logger }); + + const emit = jest.fn(); + + await processor.readLocation( + { + type: 'url', + target: 'https://storage.cloud.google.com/ah-backstage-poc-catalog/*', + }, + false, + emit, + defaultEntityDataParser, + mockCache, + ); + + expect(reader.search).toHaveBeenCalledWith( + 'https://storage.cloud.google.com/ah-backstage-poc-catalog/*', + { etag: undefined }, + ); + }); }); diff --git a/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.ts b/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.ts index 5e31dcbd1a..c568f03a81 100644 --- a/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.ts +++ b/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.ts @@ -17,7 +17,6 @@ import { UrlReader } from '@backstage/backend-common'; import { Entity } from '@backstage/catalog-model'; import { assertError } from '@backstage/errors'; -import parseGitUrl from 'git-url-parse'; import limiterFactory from 'p-limit'; import { Logger } from 'winston'; import { LocationSpec } from '@backstage/plugin-catalog-common'; @@ -124,7 +123,8 @@ export class UrlReaderProcessor implements CatalogProcessor { ): Promise<{ response: { data: Buffer; url: string }[]; etag?: string }> { // Does it contain globs? I.e. does it contain asterisks or question marks // (no curly braces for now) - const { filepath } = parseGitUrl(location); + + const { pathname: filepath } = new URL(location); if (filepath?.match(/[*?]/)) { const limiter = limiterFactory(5); const response = await this.options.reader.search(location, { etag }); diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index 92415ecff9..9f2b511676 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-common +## 1.0.20 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-search-common@1.2.10 + ## 1.0.19 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index 3c4bc34997..9642746fd7 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.19", + "version": "1.0.20", "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 3bf5fa247b..235e5c25fb 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-catalog-graph +## 0.3.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/types@1.1.1 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index d159dfae48..a38f1a4480 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.3.3-next.1", + "version": "0.3.3", "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 83db43e1c8..ea9d4cb61e 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-catalog-import +## 0.10.5 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.10.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/integration-react@1.1.23-next.0 + ## 0.10.5-next.1 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 3cb8e317fe..865f60a842 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.10.5-next.1", + "version": "0.10.5", "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 5f9a5b5fd6..cda3c22b0f 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-catalog-node +## 1.6.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + +## 1.6.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + ## 1.6.1-next.1 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 592c7562bc..013577d0b9 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.6.1-next.1", + "version": "1.6.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 d6a0e0d4d9..9bd729a8e6 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-catalog-react +## 1.9.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + - @backstage/plugin-catalog-common@1.0.20 + +## 1.9.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/integration-react@1.1.23-next.0 + ## 1.9.3-next.1 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index fe3fba834e..93486c64db 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.9.3-next.1", + "version": "1.9.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index 7a45d8de79..9a2be34228 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.1.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + ## 0.1.7-next.1 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index 0312b589dc..d3b037788a 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities", - "version": "0.1.7-next.1", + "version": "0.1.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 52fdb9c969..a34341d585 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-catalog +## 1.16.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-search-react@1.7.5 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-search-common@1.2.10 + +## 1.16.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/integration-react@1.1.23-next.0 + ## 1.16.1-next.1 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 70a4ce2a14..4654a831f9 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.16.1-next.1", + "version": "1.16.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/src/alpha/plugin.tsx b/plugins/catalog/src/alpha/plugin.tsx index 99aacd27da..9a964c4e46 100644 --- a/plugins/catalog/src/alpha/plugin.tsx +++ b/plugins/catalog/src/alpha/plugin.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { convertLegacyRouteRef } from '@backstage/core-compat-api'; +import { convertLegacyRouteRefs } from '@backstage/core-compat-api'; import { createPlugin } from '@backstage/frontend-plugin-api'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; @@ -38,16 +38,16 @@ import searchResultItems from './searchResultItems'; /** @alpha */ export default createPlugin({ id: 'catalog', - routes: { - catalogIndex: convertLegacyRouteRef(rootRouteRef), - catalogEntity: convertLegacyRouteRef(entityRouteRef), - }, - externalRoutes: { - viewTechDoc: convertLegacyRouteRef(viewTechDocRouteRef), - createComponent: convertLegacyRouteRef(createComponentRouteRef), - createFromTemplate: convertLegacyRouteRef(createFromTemplateRouteRef), - unregisterRedirect: convertLegacyRouteRef(unregisterRedirectRouteRef), - }, + routes: convertLegacyRouteRefs({ + catalogIndex: rootRouteRef, + catalogEntity: entityRouteRef, + }), + externalRoutes: convertLegacyRouteRefs({ + viewTechDoc: viewTechDocRouteRef, + createComponent: createComponentRouteRef, + createFromTemplate: createFromTemplateRouteRef, + unregisterRedirect: unregisterRedirectRouteRef, + }), extensions: [ ...apis, ...pages, diff --git a/plugins/catalog/src/apis/EntityPresentationApi/defaults.tsx b/plugins/catalog/src/apis/EntityPresentationApi/defaults.tsx index 84f04c6f83..c2abeb5e6a 100644 --- a/plugins/catalog/src/apis/EntityPresentationApi/defaults.tsx +++ b/plugins/catalog/src/apis/EntityPresentationApi/defaults.tsx @@ -18,10 +18,10 @@ import { IconComponent } from '@backstage/core-plugin-api'; import { defaultEntityPresentation } from '@backstage/plugin-catalog-react'; import { HumanDuration } from '@backstage/types'; import ApartmentIcon from '@material-ui/icons/Apartment'; -import BusinessIcon from '@material-ui/icons/Business'; +import CategoryIcon from '@material-ui/icons/Category'; import ExtensionIcon from '@material-ui/icons/Extension'; import HelpIcon from '@material-ui/icons/Help'; -import LibraryAddIcon from '@material-ui/icons/LibraryAdd'; +import FeaturedPlayListIcon from '@material-ui/icons/FeaturedPlayList'; import LocationOnIcon from '@material-ui/icons/LocationOn'; import MemoryIcon from '@material-ui/icons/Memory'; import PeopleIcon from '@material-ui/icons/People'; @@ -38,13 +38,13 @@ export const UNKNOWN_KIND_ICON: IconComponent = HelpIcon; export const DEFAULT_ICONS: Record = { api: ExtensionIcon, component: MemoryIcon, - system: BusinessIcon, + system: CategoryIcon, resource: WorkIcon, domain: ApartmentIcon, location: LocationOnIcon, user: PersonIcon, group: PeopleIcon, - template: LibraryAddIcon, + template: FeaturedPlayListIcon, }; export function createDefaultRenderer(options: { diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 3645379d51..79d8cda7bf 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.25 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-cicd-statistics@0.1.31 + +## 0.1.25-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cicd-statistics@0.1.31-next.2 + ## 0.1.25-next.1 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 1e3dfcdb6c..f84457a781 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.25-next.1", + "version": "0.1.25", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index 7b0c97a22f..e80e9d5d68 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-cicd-statistics +## 0.1.31 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.1.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.31-next.1 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 1bae81fc1c..aaa271baa7 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.31-next.1", + "version": "0.1.31", "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 3f547546c5..baabcaa66f 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-circleci +## 0.3.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.3.29-next.1 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 55552ff302..174dbda8d1 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.29-next.1", + "version": "0.3.29", "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 65f498900d..84cd321643 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-cloudbuild +## 0.3.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.3.29-next.1 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index 1b71704da0..8d7c9a3282 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.29-next.1", + "version": "0.3.29", "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 5dd6af6608..551e4fb262 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-code-climate +## 0.1.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.1.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.29-next.1 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 9b9684b032..1c9971f476 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.29-next.1", + "version": "0.1.29", "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 3929e1a560..e55df807d1 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-code-coverage-backend +## 0.2.23 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.2.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.2.23-next.1 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 5f0c4038d4..4fa0a8e6ec 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.23-next.1", + "version": "0.2.23", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index 8f956bf4b5..5155660c36 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-code-coverage +## 0.2.22 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.2.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.2.22-next.1 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index 06577d9ae3..c37036f1ff 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.22-next.1", + "version": "0.2.22", "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 16665e7bcf..df9ed3199f 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-codescene +## 0.1.21 + +### Patch Changes + +- d5eda61: Updated Readme document in codescene plugin +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + ## 0.1.21-next.1 ### Patch Changes diff --git a/plugins/codescene/README.md b/plugins/codescene/README.md index bbfb58e68f..8c84c9015c 100644 --- a/plugins/codescene/README.md +++ b/plugins/codescene/README.md @@ -1,8 +1,8 @@ # codescene -[CodeScene](https://codescene.com/) is a multi-purpose tool bridging code, business and people. See hidden risks and social patterns in your code. Prioritize and reduce technical debt. +[CodeScene](https://codescene.com/) is a multi-purpose tool that connects code, businesses, and people. Discover hidden hazards and social trends in your code. Prioritise and minimise technical debt. -The CodeScene Backstage Plugin exposes a page component that will list the existing projects and their analysis data on your CodeScene instance. +The CodeScene Backstage Plugin provides a page component that displays a list of existing projects and associated analysis data on your CodeScene instance. ![screenshot](./docs/codescene-plugin-screenshot.png) diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 2727a055a8..f0dfd20394 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.21-next.1", + "version": "0.1.21", "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 3f5050932e..0ed7d3afd5 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-config-schema +## 0.1.49 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + ## 0.1.49-next.1 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 5f9b696f14..15860d4e89 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.49-next.1", + "version": "0.1.49", "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 ac46d4589a..cd0c31e2f1 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-cost-insights +## 0.12.18 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/theme@0.5.0 + - @backstage/plugin-cost-insights-common@0.1.2 + +## 0.12.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.12.18-next.1 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index 8a4aa56826..2db994d466 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.18-next.1", + "version": "0.12.18", "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 a105fb25ff..62e91cc50c 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-devtools-backend +## 0.2.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config-loader@1.6.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-devtools-common@0.1.8 + +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/config-loader@1.6.1-next.0 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index aca2adf8b8..4d56c3e9dd 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.2.6-next.1", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools-common/CHANGELOG.md b/plugins/devtools-common/CHANGELOG.md index 9ede428d75..3bbc48a585 100644 --- a/plugins/devtools-common/CHANGELOG.md +++ b/plugins/devtools-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-devtools-common +## 0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/types@1.1.1 + ## 0.1.7 ### Patch Changes diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index 24884efed2..a488e997a1 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.7", + "version": "0.1.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools/.eslintrc.js b/plugins/devtools/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/devtools/.eslintrc.js +++ b/plugins/devtools/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index 8b7a4376f3..4237bd149a 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-devtools +## 0.1.8 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/errors@1.2.3 + - @backstage/plugin-devtools-common@0.1.8 + ## 0.1.8-next.1 ### Patch Changes diff --git a/plugins/devtools/api-report.md b/plugins/devtools/api-report.md index 21754d7c1e..bba36a5a9a 100644 --- a/plugins/devtools/api-report.md +++ b/plugins/devtools/api-report.md @@ -10,7 +10,7 @@ import { default as default_2 } from 'react'; import { JSX as JSX_2 } from 'react'; import { default as React_2 } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; -import { TabProps } from '@material-ui/core'; +import { TabProps } from '@material-ui/core/Tab'; // @public (undocumented) export const ConfigContent: () => React_2.JSX.Element; diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 34ce5d7091..ece8fe89e3 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.8-next.1", + "version": "0.1.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools/src/components/Content/ConfigContent/ConfigContent.tsx b/plugins/devtools/src/components/Content/ConfigContent/ConfigContent.tsx index 66129b5dae..aba46f85b7 100644 --- a/plugins/devtools/src/components/Content/ConfigContent/ConfigContent.tsx +++ b/plugins/devtools/src/components/Content/ConfigContent/ConfigContent.tsx @@ -15,16 +15,16 @@ */ import { Progress, WarningPanel } from '@backstage/core-components'; +import Box from '@material-ui/core/Box'; +import Paper from '@material-ui/core/Paper'; +import Typography from '@material-ui/core/Typography'; import { - Box, createStyles, makeStyles, - Paper, Theme, - Typography, useTheme, -} from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; +} from '@material-ui/core/styles'; +import Alert from '@material-ui/lab/Alert'; import React from 'react'; import ReactJson from 'react-json-view'; import { useConfig } from '../../../hooks'; diff --git a/plugins/devtools/src/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.tsx b/plugins/devtools/src/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.tsx index a5dd825fe5..c6a46ea8fb 100644 --- a/plugins/devtools/src/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.tsx +++ b/plugins/devtools/src/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.tsx @@ -23,16 +23,12 @@ import { TableColumn, } from '@backstage/core-components'; import { ExternalDependency } from '@backstage/plugin-devtools-common'; -import { - Box, - createStyles, - Grid, - makeStyles, - Paper, - Theme, - Typography, -} from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; +import Box from '@material-ui/core/Box'; +import Grid from '@material-ui/core/Grid'; +import Paper from '@material-ui/core/Paper'; +import Typography from '@material-ui/core/Typography'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; +import Alert from '@material-ui/lab/Alert'; import React from 'react'; import { useExternalDependencies } from '../../../hooks'; diff --git a/plugins/devtools/src/components/Content/InfoContent/BackstageLogoIcon.tsx b/plugins/devtools/src/components/Content/InfoContent/BackstageLogoIcon.tsx index 32f35600f2..8a9df77546 100644 --- a/plugins/devtools/src/components/Content/InfoContent/BackstageLogoIcon.tsx +++ b/plugins/devtools/src/components/Content/InfoContent/BackstageLogoIcon.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SvgIcon, SvgIconProps } from '@material-ui/core'; +import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon'; import React from 'react'; diff --git a/plugins/devtools/src/components/Content/InfoContent/InfoContent.tsx b/plugins/devtools/src/components/Content/InfoContent/InfoContent.tsx index 0ed43d2fee..fcbea53603 100644 --- a/plugins/devtools/src/components/Content/InfoContent/InfoContent.tsx +++ b/plugins/devtools/src/components/Content/InfoContent/InfoContent.tsx @@ -15,20 +15,16 @@ */ import { Progress } from '@backstage/core-components'; -import { - Avatar, - Box, - createStyles, - Divider, - List, - ListItem, - ListItemAvatar, - ListItemText, - makeStyles, - Paper, - Theme, -} from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; +import Avatar from '@material-ui/core/Avatar'; +import Box from '@material-ui/core/Box'; +import Divider from '@material-ui/core/Divider'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemAvatar from '@material-ui/core/ListItemAvatar'; +import ListItemText from '@material-ui/core/ListItemText'; +import Paper from '@material-ui/core/Paper'; +import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; +import Alert from '@material-ui/lab/Alert'; import React from 'react'; import { useInfo } from '../../../hooks'; import { InfoDependenciesTable } from './InfoDependenciesTable'; diff --git a/plugins/devtools/src/components/DevToolsLayout/DevToolsLayout.tsx b/plugins/devtools/src/components/DevToolsLayout/DevToolsLayout.tsx index ae9a337ced..bce0837ef1 100644 --- a/plugins/devtools/src/components/DevToolsLayout/DevToolsLayout.tsx +++ b/plugins/devtools/src/components/DevToolsLayout/DevToolsLayout.tsx @@ -19,7 +19,7 @@ import { attachComponentData, useElementFilter, } from '@backstage/core-plugin-api'; -import { TabProps } from '@material-ui/core'; +import { TabProps } from '@material-ui/core/Tab'; import { default as React } from 'react'; /** @public */ diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index bdd7de083c..1cff141762 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-dynatrace +## 8.0.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 8.0.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 8.0.3-next.1 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index d9708fb20a..c82b8a4d5b 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "8.0.3-next.1", + "version": "8.0.3", "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 0e6b2878ac..e9eec4b8f2 100644 --- a/plugins/entity-feedback-backend/CHANGELOG.md +++ b/plugins/entity-feedback-backend/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-entity-feedback-backend +## 0.2.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-entity-feedback-common@0.1.3 + +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index 1e0bd561d1..8e5deafdf1 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.2.6-next.1", + "version": "0.2.6", "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 cf626a7668..5cc2ae9468 100644 --- a/plugins/entity-feedback/CHANGELOG.md +++ b/plugins/entity-feedback/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-entity-feedback +## 0.2.12 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-entity-feedback-common@0.1.3 + +## 0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.2.12-next.1 ### Patch Changes diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json index 60944c2ad6..226c76c106 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.12-next.1", + "version": "0.2.12", "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 7482b3822c..f1070960c8 100644 --- a/plugins/entity-validation/CHANGELOG.md +++ b/plugins/entity-validation/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-entity-validation +## 0.1.14 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/entity-validation/api-report.md b/plugins/entity-validation/api-report.md index 9d69458ed0..95fdfaf42c 100644 --- a/plugins/entity-validation/api-report.md +++ b/plugins/entity-validation/api-report.md @@ -7,12 +7,15 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; import { JSX as JSX_2 } from 'react'; +import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; // @public (undocumented) export const EntityValidationPage: (props: { defaultYaml?: string | undefined; defaultLocation?: string | undefined; + hideFileLocationField?: boolean | undefined; + contentHead?: ReactNode; }) => JSX_2.Element; // @public (undocumented) diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index ccc37bbb80..7e2389dd7a 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.14-next.1", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -57,6 +57,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/dev-utils": "workspace:^", + "@backstage/test-utils": "workspace:^", "@testing-library/dom": "^9.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^14.0.0" diff --git a/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.test.tsx b/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.test.tsx new file mode 100644 index 0000000000..c8827ffc13 --- /dev/null +++ b/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.test.tsx @@ -0,0 +1,91 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import { TestApiProvider, renderInTestApp } from '@backstage/test-utils'; +import { EntityValidationPage } from './EntityValidationPage'; +import { CatalogApi, catalogApiRef } from '@backstage/plugin-catalog-react'; +import { MarkdownContent } from '@backstage/core-components'; + +describe('EntityValidatorPage', () => { + const catalogApi: Partial = { + getEntities: () => + Promise.resolve({ + items: [ + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'API', + metadata: { + name: 'Entity1', + annotations: { + 'backstage.io/view-url': 'viewurl', + 'backstage.io/edit-url': 'editurl', + }, + }, + spec: { type: 'openapi' }, + }, + ], + }), + }; + + const contentHead = ; + + it('should show loation text field', async () => { + const { getByText, getByTestId } = await renderInTestApp( + + + , + ); + const mainGrid = getByTestId('main-grid'); + + expect(mainGrid.children.length).toBe(2); + expect(getByText('File Location')).toBeInTheDocument(); + }); + + it('should not show loation text field', async () => { + const { queryByText, getByTestId } = await renderInTestApp( + + + , + ); + const mainGrid = getByTestId('main-grid'); + + expect(mainGrid.children.length).toBe(1); + expect(queryByText('File Location')).not.toBeInTheDocument(); + }); + + it('should not show content head', async () => { + const { getByTestId } = await renderInTestApp( + + + , + ); + const mainGrid = getByTestId('main-grid'); + + expect(mainGrid.children.length).toBe(2); + }); + + it('should show content head', async () => { + const { getByTestId } = await renderInTestApp( + + + , + ); + const mainGrid = getByTestId('main-grid'); + + expect(mainGrid.children.length).toBe(3); + }); +}); diff --git a/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx b/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx index 0f0e60366b..c3e6386a37 100644 --- a/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx +++ b/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx @@ -15,9 +15,9 @@ */ import React, { useState } from 'react'; -import { Content, Header, LinkButton, Page } from '@backstage/core-components'; +import { Content, Header, Page } from '@backstage/core-components'; import { EntityTextArea } from '../EntityTextArea'; -import { Grid, TextField } from '@material-ui/core'; +import { Button, Grid, TextField } from '@material-ui/core'; import { CatalogProcessorResult } from '../../types'; import { parseEntityYaml } from '../../utils'; import { EntityValidationOutput } from '../EntityValidationOutput'; @@ -40,10 +40,14 @@ spec: export const EntityValidationPage = (props: { defaultYaml?: string; defaultLocation?: string; + hideFileLocationField?: boolean; + contentHead?: React.ReactNode; }) => { const { defaultYaml = EXAMPLE_CATALOG_INFO_YAML, defaultLocation = 'https://github.com/backstage/backstage/blob/master/catalog-info.yaml', + hideFileLocationField = false, + contentHead, } = props; const [catalogYaml, setCatalogYaml] = useState(defaultYaml); @@ -67,8 +71,16 @@ export const EntityValidationPage = (props: { subtitle="Tool to validate catalog-info.yaml files" /> - - + + {contentHead} + + {!hideFileLocationField && ( setLocationUrl(e.target.value)} /> - - - - - - Validate - + )} + + + + + + setCatalogYaml(value)} + catalogYaml={catalogYaml} + /> + + + + - - - - - setCatalogYaml(value)} - catalogYaml={catalogYaml} - /> - - - - - + + + + + diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index 86bdc49717..b77a2912ca 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.2.12 + +### Patch Changes + +- 7b8e551: Fix errors when deleting SQS messages: + + - If zero messages were received, skip deletion to avoid `EmptyBatchRequest` error from the SQS client. + - If zero failures were returned from the SQS client during deletion, skip error logging. + +- d5ddc4e: Add documentation on how to install the plugins with the new backend system. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-tasks@0.5.14 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-events-node@0.2.18 + +## 0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.2.12-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/README.md b/plugins/events-backend-module-aws-sqs/README.md index cb3a5045c0..397de35c10 100644 --- a/plugins/events-backend-module-aws-sqs/README.md +++ b/plugins/events-backend-module-aws-sqs/README.md @@ -40,3 +40,7 @@ events: # From your Backstage root directory yarn add --cwd packages/backend @backstage/plugin-events-backend-module-aws-sqs ``` + +```ts title="packages/backend/src/index.ts" +backend.add(import('@backstage/plugin-events-backend-module-aws-sqs/alpha')); +``` diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index d9a6b6581c..6e0c986554 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.12-next.1", + "version": "0.2.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts b/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts index 4f4e6ea55d..a2f6a00fe7 100644 --- a/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts +++ b/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts @@ -111,7 +111,7 @@ export class AwsSqsConsumingEventPublisher implements EventPublisher { } private async deleteMessages(messages?: Message[]): Promise { - if (!messages) { + if (!messages || messages.length === 0) { return; } @@ -129,7 +129,7 @@ export class AwsSqsConsumingEventPublisher implements EventPublisher { const result = await this.sqs.send( new DeleteMessageBatchCommand(deleteParams), ); - if (result.Failed) { + if (result.Failed && result.Failed.length > 0) { this.logger.error( `Failed to delete ${result.Failed!.length} of ${ messages.length diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 649277350e..233d9f6eb5 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.19 + +### Patch Changes + +- af76a95: Add default exports for the new backend system and documentation. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-events-node@0.2.18 + +## 0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + ## 0.1.19-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-azure/README.md b/plugins/events-backend-module-azure/README.md index 26bffbc45d..457fd81fbc 100644 --- a/plugins/events-backend-module-azure/README.md +++ b/plugins/events-backend-module-azure/README.md @@ -31,6 +31,14 @@ Install this module: yarn add --cwd packages/backend @backstage/plugin-events-backend-module-azure ``` +### Add to backend + +```ts title="packages/backend/src/index.ts" +backend.add(import('@backstage/plugin-events-backend-module-azure/alpha')); +``` + +### Add to backend (old) + Add the event router to the `EventsBackend` instance in `packages/backend/src/plugins/events.ts`: ```diff diff --git a/plugins/events-backend-module-azure/api-report-alpha.md b/plugins/events-backend-module-azure/api-report-alpha.md index 1bd568d1df..d07f8852f3 100644 --- a/plugins/events-backend-module-azure/api-report-alpha.md +++ b/plugins/events-backend-module-azure/api-report-alpha.md @@ -6,7 +6,9 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const eventsModuleAzureDevOpsEventRouter: () => BackendFeature; +const eventsModuleAzureDevOpsEventRouter: () => BackendFeature; +export default eventsModuleAzureDevOpsEventRouter; +export { eventsModuleAzureDevOpsEventRouter }; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 51e55865a7..2530e2dfd9 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.19-next.1", + "version": "0.1.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/src/alpha.ts b/plugins/events-backend-module-azure/src/alpha.ts index 07334fcbda..4de53df42a 100644 --- a/plugins/events-backend-module-azure/src/alpha.ts +++ b/plugins/events-backend-module-azure/src/alpha.ts @@ -15,3 +15,4 @@ */ export { eventsModuleAzureDevOpsEventRouter } from './service/eventsModuleAzureDevOpsEventRouter'; +export { eventsModuleAzureDevOpsEventRouter as default } from './service/eventsModuleAzureDevOpsEventRouter'; diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 53ecf33a1b..ae4db7e0fa 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.19 + +### Patch Changes + +- af76a95: Add default exports for the new backend system and documentation. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-events-node@0.2.18 + +## 0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + ## 0.1.19-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/README.md b/plugins/events-backend-module-bitbucket-cloud/README.md index 60fdf52af9..d70a70c87e 100644 --- a/plugins/events-backend-module-bitbucket-cloud/README.md +++ b/plugins/events-backend-module-bitbucket-cloud/README.md @@ -31,6 +31,16 @@ Install this module: yarn add --cwd packages/backend @backstage/plugin-events-backend-module-bitbucket-cloud ``` +### Add to backend + +```ts title="packages/backend/src/index.ts" +backend.add( + import('@backstage/plugin-events-backend-module-bitbucket-cloud/alpha'), +); +``` + +### Add to backend (old) + Add the event router to the `EventsBackend` instance in `packages/backend/src/plugins/events.ts`: ```diff diff --git a/plugins/events-backend-module-bitbucket-cloud/api-report-alpha.md b/plugins/events-backend-module-bitbucket-cloud/api-report-alpha.md index 5e63ae36c8..fa7cdfa9f6 100644 --- a/plugins/events-backend-module-bitbucket-cloud/api-report-alpha.md +++ b/plugins/events-backend-module-bitbucket-cloud/api-report-alpha.md @@ -6,7 +6,9 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const eventsModuleBitbucketCloudEventRouter: () => BackendFeature; +const eventsModuleBitbucketCloudEventRouter: () => BackendFeature; +export default eventsModuleBitbucketCloudEventRouter; +export { eventsModuleBitbucketCloudEventRouter }; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index ae6d84bec3..5dd1e3e00c 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.19-next.1", + "version": "0.1.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts b/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts index 75cda4327d..1f0e09a653 100644 --- a/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts +++ b/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts @@ -15,3 +15,4 @@ */ export { eventsModuleBitbucketCloudEventRouter } from './service/eventsModuleBitbucketCloudEventRouter'; +export { eventsModuleBitbucketCloudEventRouter as default } from './service/eventsModuleBitbucketCloudEventRouter'; diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 7b9b3c5075..6af1070a1f 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.19 + +### Patch Changes + +- af76a95: Add default exports for the new backend system and documentation. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-events-node@0.2.18 + +## 0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + ## 0.1.19-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/README.md b/plugins/events-backend-module-gerrit/README.md index 1808ef46ba..34b2d154be 100644 --- a/plugins/events-backend-module-gerrit/README.md +++ b/plugins/events-backend-module-gerrit/README.md @@ -30,6 +30,14 @@ Install this module: yarn add --cwd packages/backend @backstage/plugin-events-backend-module-gerrit ``` +### Add to backend + +```ts title="packages/backend/src/index.ts" +backend.add(import('@backstage/plugin-events-backend-module-gerrit/alpha')); +``` + +### Add to backend (old) + Add the event router to the `EventsBackend` instance in `packages/backend/src/plugins/events.ts`: ```diff diff --git a/plugins/events-backend-module-gerrit/api-report-alpha.md b/plugins/events-backend-module-gerrit/api-report-alpha.md index d1be54730f..66dea72747 100644 --- a/plugins/events-backend-module-gerrit/api-report-alpha.md +++ b/plugins/events-backend-module-gerrit/api-report-alpha.md @@ -6,7 +6,9 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const eventsModuleGerritEventRouter: () => BackendFeature; +const eventsModuleGerritEventRouter: () => BackendFeature; +export default eventsModuleGerritEventRouter; +export { eventsModuleGerritEventRouter }; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index 498b9c4492..0593cd8664 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.19-next.1", + "version": "0.1.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/src/alpha.ts b/plugins/events-backend-module-gerrit/src/alpha.ts index 788331b998..9c1eea0b75 100644 --- a/plugins/events-backend-module-gerrit/src/alpha.ts +++ b/plugins/events-backend-module-gerrit/src/alpha.ts @@ -15,3 +15,4 @@ */ export { eventsModuleGerritEventRouter } from './service/eventsModuleGerritEventRouter'; +export { eventsModuleGerritEventRouter as default } from './service/eventsModuleGerritEventRouter'; diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 3ec7e4f0a8..bff2a53470 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-events-backend-module-github +## 0.1.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/plugin-events-node@0.2.18 + +## 0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + ## 0.1.19-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index eeaa4d3c0a..97bd7b7cc6 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.19-next.1", + "version": "0.1.19", "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 728678066d..de697ee02c 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/plugin-events-node@0.2.18 + +## 0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + ## 0.1.19-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 44694b8968..7eacb91a61 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.19-next.1", + "version": "0.1.19", "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 e1c146ea62..2651cbeffe 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.18 + +## 0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.18-next.2 + ## 0.1.19-next.1 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index bcb8dde45d..aabd16558d 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.19-next.1", + "version": "0.1.19", "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 44561cafe5..fb7607f8b1 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-events-backend +## 0.2.18 + +### Patch Changes + +- 92ea615: Update `README.md` +- d5ddc4e: Add documentation on how to install the plugins with the new backend system. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/plugin-events-node@0.2.18 + +## 0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + ## 0.2.18-next.1 ### Patch Changes diff --git a/plugins/events-backend/README.md b/plugins/events-backend/README.md index 29c420cef2..2fd980f003 100644 --- a/plugins/events-backend/README.md +++ b/plugins/events-backend/README.md @@ -24,7 +24,15 @@ to the used event broker. yarn add --cwd packages/backend @backstage/plugin-events-backend @backstage/plugin-events-node ``` -### Event Broker +### Add to backend + +```ts title="packages/backend/src/index.ts" +backend.add(import('@backstage/plugin-events-backend/alpha')); +``` + +### Add to backend (old) + +#### Event Broker First you will need to add and implementation of the `EventBroker` interface to the backend plugin environment. This will allow event broker instance any backend plugins to publish and subscribe to events in order to communicate @@ -34,6 +42,7 @@ Add the following to `makeCreateEnv` ```diff // packages/backend/src/index.ts ++ import { DefaultEventBroker } from '@backstage/plugin-events-backend'; + const eventBroker = new DefaultEventBroker(root.child({ type: 'plugin' })); ``` @@ -41,10 +50,11 @@ Then update plugin environment to include the event broker. ```diff // packages/backend/src/types.ts ++ import { EventBroker } from '@backstage/plugin-events-node'; + eventBroker: EventBroker; ``` -### Publishing and Subscribing to events with the broker +#### Publishing and Subscribing to events with the broker Backend plugins are passed the event broker in the plugin environment at startup of the application. The plugin can make use of this to communicate between parts of the application. @@ -80,27 +90,27 @@ export default async function createPlugin( } ``` -### Implementing an `EventSubscriber` class +#### Implementing an `EventSubscriber` class More complex solutions might need the creation of a class that implements the `EventSubscriber` interface. e.g. ```typescript jsx -import { EventSubscriber } from "./EventSubscriber"; +import { EventSubscriber } from './EventSubscriber'; class ExampleSubscriber implements EventSubscriber { - ... + // ... supportsEventTopics() { - return ['publish.example'] + return ['publish.example']; } async onEvent(params: EventParams) { - env.logger.info(`receieved ${params.topic} event`) + env.logger.info(`receieved ${params.topic} event`); } } ``` -### Events Backend +#### Events Backend The events backend plugin provides a router to handler http events and publish the http requests onto the event broker. diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 839b54a365..ec4a59f4e9 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.18-next.1", + "version": "0.2.18", "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 0233d46b5e..dd9844430c 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-events-node +## 0.2.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + +## 0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + ## 0.2.18-next.1 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 042edda633..d2a9e5424d 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.18-next.1", + "version": "0.2.18", "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 6e06254c59..2f4a7fb873 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @internal/plugin-todo-list-backend +## 1.0.21 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/errors@1.2.3 + +## 1.0.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 1.0.21-next.1 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 769a97dc6f..65241fd128 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.21-next.1", + "version": "1.0.21", "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 bef3cf1d40..98d6bafa7f 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.17 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + ## 1.0.16 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 6a3b2897eb..1d984812f9 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.16", + "version": "1.0.17", "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 eae25f89bd..8dfacdd105 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list +## 1.0.21 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + ## 1.0.21-next.1 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index f38ba69a06..63634879df 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.21-next.1", + "version": "1.0.21", "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 bf555518e1..292a14f652 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-explore-backend +## 0.0.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-search-backend-module-explore@0.1.13 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-explore-common@0.0.2 + +## 0.0.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 + ## 0.0.19-next.1 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index feba009ea8..5af891fb02 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.19-next.1", + "version": "0.0.19", "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 87fa9eb1d7..d9668070c2 100644 --- a/plugins/explore-react/CHANGELOG.md +++ b/plugins/explore-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-explore-react +## 0.0.35 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-explore-common@0.0.2 + ## 0.0.35-next.1 ### Patch Changes diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index 4774eec397..a3128511ac 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.35-next.1", + "version": "0.0.35", "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 6f4325f0ff..b1cdac03d7 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-explore +## 0.4.15 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-explore-react@0.0.35 + - @backstage/plugin-search-react@1.7.5 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.10 + +## 0.4.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + ## 0.4.15-next.1 ### Patch Changes diff --git a/plugins/explore/package.json b/plugins/explore/package.json index 9dd5afa07e..500480c1ad 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.15-next.1", + "version": "0.4.15", "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 11e2cf5f55..5272139970 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-firehydrant +## 0.2.13 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.2.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.2.13-next.1 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index b8790295a7..9747592e0c 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.13-next.1", + "version": "0.2.13", "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 29cc6a9b20..61721a6600 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-fossa +## 0.2.61 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.2.61-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.2.61-next.1 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index 2820179392..83af637994 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.61-next.1", + "version": "0.2.61", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index afb7239eeb..cb9865d96c 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-gcalendar +## 0.3.22 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/errors@1.2.3 + ## 0.3.22-next.1 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index 0e22947f8d..c8a5b0bd0a 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.22-next.1", + "version": "0.3.22", "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 1fdd0d9246..bcdc653349 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-gcp-projects +## 0.3.45 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + ## 0.3.45-next.1 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index 28f6fc0b72..571267216c 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.45-next.1", + "version": "0.3.45", "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 9d181b17ab..2ce671930b 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.41 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/integration@1.8.0 + ## 0.3.41-next.1 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index 11e1b03c51..7fc2a142ab 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.41-next.1", + "version": "0.3.41", "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 2fc594456b..89807a9f29 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-github-actions +## 0.6.10 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/integration@1.8.0 + +## 0.6.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/integration-react@1.1.23-next.0 + ## 0.6.10-next.1 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index a3bdcce037..b675315dae 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.10-next.1", + "version": "0.6.10", "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 1c15091b1b..b09bb8d5db 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-github-deployments +## 0.1.60 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.1.60-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/integration-react@1.1.23-next.0 + ## 0.1.60-next.1 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 04f51bbc1b..1869e04595 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.60-next.1", + "version": "0.1.60", "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 1a7f71d637..3d15c6b6a9 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-github-issues +## 0.2.18 + +### Patch Changes + +- bf92ae3: Updated dependency `octokit` to `^3.0.0`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.2.18-next.1 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index 202b82a2c9..de3b02f53b 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.18-next.1", + "version": "0.2.18", "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 830967cc57..8fc568d310 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.23 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/integration@1.8.0 + +## 0.1.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.23-next.1 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index 890ee8f8a3..aa086c0848 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.23-next.1", + "version": "0.1.23", "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 1a3372089c..cd312c04bf 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-gitops-profiles +## 0.3.44 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + ## 0.3.44-next.1 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index dc999ea645..d9e509a49b 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.44-next.1", + "version": "0.3.44", "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 4e8501a397..884a6fc295 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-gocd +## 0.1.35 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.1.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.35-next.1 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index 4861e37866..ec25c9f7e0 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.35-next.1", + "version": "0.1.35", "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 e1427265ed..14ce2b20fb 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-graphiql +## 0.3.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## 0.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + ## 0.3.2-next.1 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index 820807dfc6..254356550f 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.3.2-next.1", + "version": "0.3.2", "publishConfig": { "access": "public" }, diff --git a/plugins/graphiql/src/alpha.tsx b/plugins/graphiql/src/alpha.tsx index fdd343020d..086f397d7a 100644 --- a/plugins/graphiql/src/alpha.tsx +++ b/plugins/graphiql/src/alpha.tsx @@ -37,6 +37,7 @@ import { graphiQLRouteRef } from './route-refs'; import { compatWrapper, convertLegacyRouteRef, + convertLegacyRouteRefs, } from '@backstage/core-compat-api'; /** @alpha */ @@ -128,7 +129,7 @@ export default createPlugin({ graphiqlGitlabGraphiQLEndpointExtension, graphiqlNavItem, ], - routes: { - root: convertLegacyRouteRef(graphiQLRouteRef), - }, + routes: convertLegacyRouteRefs({ + root: graphiQLRouteRef, + }), }); diff --git a/plugins/graphql-voyager/CHANGELOG.md b/plugins/graphql-voyager/CHANGELOG.md index ee57db87f6..f65e23b8bb 100644 --- a/plugins/graphql-voyager/CHANGELOG.md +++ b/plugins/graphql-voyager/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphql-voyager +## 0.1.11 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + ## 0.1.11-next.1 ### Patch Changes diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index 7e18c7a486..2a2941b033 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.11-next.1", + "version": "0.1.11", "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 2f22d5967b..3e877e8a5d 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-home-react +## 0.1.7 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## 0.1.7-next.2 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. + ## 0.1.7-next.1 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index 2e2e294376..896d9e46f2 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.7-next.1", + "version": "0.1.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 0cf444f173..200ccd0aca 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/plugin-home +## 0.6.1 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-home-react@0.1.7 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + +## 0.6.1-next.2 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-home-react@0.1.7-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.6.1-next.1 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index ea4d94f011..9eff9d6110 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.6.1-next.1", + "version": "0.6.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index de2d0b34ac..e2a55dbc2a 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-ilert +## 0.2.18 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.2.18-next.1 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index c68ef6d58f..7ef998cc64 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.18-next.1", + "version": "0.2.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index 29d8c91997..04645c8b31 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-jenkins-backend +## 0.3.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-jenkins-common@0.1.23 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + ## 0.3.3-next.1 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index ef91f1bf2e..0310169606 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.3.3-next.1", + "version": "0.3.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-common/CHANGELOG.md b/plugins/jenkins-common/CHANGELOG.md index 04fa14fedc..6d364dc40b 100644 --- a/plugins/jenkins-common/CHANGELOG.md +++ b/plugins/jenkins-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-jenkins-common +## 0.1.23 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-catalog-common@1.0.20 + ## 0.1.22 ### Patch Changes diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index 5c2d576e90..d61bd6cede 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-jenkins-common", - "version": "0.1.22", + "version": "0.1.23", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index e998d17f8e..f69387fbdf 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-jenkins +## 0.9.4 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-jenkins-common@0.1.23 + +## 0.9.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.9.4-next.1 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 09636ba148..87181ac37c 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.9.4-next.1", + "version": "0.9.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index 1418d420bf..17a3a277e9 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-kafka-backend +## 0.3.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.3.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 0.3.7-next.1 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index 0e3f437dc6..5b8130fa91 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.3.7-next.1", + "version": "0.3.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index 1b6f461220..4b6a8eda9b 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-kafka +## 0.3.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.3.29-next.1 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 54bca28904..ffbeb1c761 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka", "description": "A Backstage plugin that integrates towards Kafka", - "version": "0.3.29-next.1", + "version": "0.3.29", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 12244728cf..d19054eb6b 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-kubernetes-backend +## 0.14.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration-aws-node@0.1.8 + - @backstage/types@1.1.1 + - @backstage/plugin-kubernetes-node@0.1.3 + +## 0.14.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-kubernetes-node@0.1.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + ## 0.14.1-next.1 ### Patch Changes diff --git a/plugins/kubernetes-backend/api-report.md b/plugins/kubernetes-backend/api-report.md index e6996484dd..afdb3bcf9a 100644 --- a/plugins/kubernetes-backend/api-report.md +++ b/plugins/kubernetes-backend/api-report.md @@ -4,6 +4,7 @@ ```ts import { AuthenticationStrategy as AuthenticationStrategy_2 } from '@backstage/plugin-kubernetes-node'; +import { AuthMetadata as AuthMetadata_2 } from '@backstage/plugin-kubernetes-node'; import { CatalogApi } from '@backstage/catalog-client'; import { ClusterDetails as ClusterDetails_2 } from '@backstage/plugin-kubernetes-node'; import { Config } from '@backstage/config'; @@ -12,9 +13,12 @@ import { Duration } from 'luxon'; import express from 'express'; import * as k8sAuthTypes from '@backstage/plugin-kubernetes-node'; import { KubernetesClustersSupplier as KubernetesClustersSupplier_2 } from '@backstage/plugin-kubernetes-node'; +import { KubernetesCredential as KubernetesCredential_2 } from '@backstage/plugin-kubernetes-node'; +import { KubernetesFetcher as KubernetesFetcher_2 } from '@backstage/plugin-kubernetes-node'; import { KubernetesObjectsProvider as KubernetesObjectsProvider_2 } from '@backstage/plugin-kubernetes-node'; import { KubernetesRequestAuth } from '@backstage/plugin-kubernetes-common'; import type { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; +import { KubernetesServiceLocator as KubernetesServiceLocator_2 } from '@backstage/plugin-kubernetes-node'; import { Logger } from 'winston'; import { ObjectToFetch as ObjectToFetch_2 } from '@backstage/plugin-kubernetes-node'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; @@ -23,20 +27,24 @@ import { RequestHandler } from 'http-proxy-middleware'; import { TokenCredential } from '@azure/identity'; // @public (undocumented) -export class AksStrategy implements AuthenticationStrategy { +export class AksStrategy implements AuthenticationStrategy_2 { // (undocumented) getCredential( - _: ClusterDetails, + _: ClusterDetails_2, requestAuth: KubernetesRequestAuth, - ): Promise; + ): Promise; + // (undocumented) + presentAuthMetadata(_authMetadata: AuthMetadata_2): AuthMetadata_2; // (undocumented) validateCluster(): Error[]; } // @public (undocumented) -export class AnonymousStrategy implements AuthenticationStrategy { +export class AnonymousStrategy implements AuthenticationStrategy_2 { // (undocumented) - getCredential(): Promise; + getCredential(): Promise; + // (undocumented) + presentAuthMetadata(_authMetadata: AuthMetadata_2): AuthMetadata_2; // (undocumented) validateCluster(): Error[]; } @@ -48,19 +56,25 @@ export type AuthenticationStrategy = k8sAuthTypes.AuthenticationStrategy; export type AuthMetadata = k8sAuthTypes.AuthMetadata; // @public (undocumented) -export class AwsIamStrategy implements AuthenticationStrategy { +export class AwsIamStrategy implements AuthenticationStrategy_2 { constructor(opts: { config: Config }); // (undocumented) - getCredential(clusterDetails: ClusterDetails): Promise; + getCredential( + clusterDetails: ClusterDetails_2, + ): Promise; + // (undocumented) + presentAuthMetadata(_authMetadata: AuthMetadata_2): AuthMetadata_2; // (undocumented) validateCluster(): Error[]; } // @public (undocumented) -export class AzureIdentityStrategy implements AuthenticationStrategy { +export class AzureIdentityStrategy implements AuthenticationStrategy_2 { constructor(logger: Logger, tokenCredential?: TokenCredential); // (undocumented) - getCredential(): Promise; + getCredential(): Promise; + // (undocumented) + presentAuthMetadata(_authMetadata: AuthMetadata_2): AuthMetadata_2; // (undocumented) validateCluster(): Error[]; } @@ -81,21 +95,23 @@ export type CustomResourcesByEntity = k8sAuthTypes.CustomResourcesByEntity; export const DEFAULT_OBJECTS: ObjectToFetch[]; // @public -export class DispatchStrategy implements AuthenticationStrategy { +export class DispatchStrategy implements AuthenticationStrategy_2 { constructor(options: DispatchStrategyOptions); // (undocumented) getCredential( - clusterDetails: ClusterDetails, + clusterDetails: ClusterDetails_2, auth: KubernetesRequestAuth, - ): Promise; + ): Promise; // (undocumented) - validateCluster(authMetadata: AuthMetadata): Error[]; + presentAuthMetadata(_authMetadata: AuthMetadata_2): AuthMetadata_2; + // (undocumented) + validateCluster(authMetadata: AuthMetadata_2): Error[]; } // @public (undocumented) export type DispatchStrategyOptions = { authStrategyMap: { - [key: string]: AuthenticationStrategy; + [key: string]: AuthenticationStrategy_2; }; }; @@ -103,20 +119,24 @@ export type DispatchStrategyOptions = { export type FetchResponseWrapper = k8sAuthTypes.FetchResponseWrapper; // @public (undocumented) -export class GoogleServiceAccountStrategy implements AuthenticationStrategy { +export class GoogleServiceAccountStrategy implements AuthenticationStrategy_2 { // (undocumented) - getCredential(): Promise; + getCredential(): Promise; + // (undocumented) + presentAuthMetadata(_authMetadata: AuthMetadata_2): AuthMetadata_2; // (undocumented) validateCluster(): Error[]; } // @public (undocumented) -export class GoogleStrategy implements AuthenticationStrategy { +export class GoogleStrategy implements AuthenticationStrategy_2 { // (undocumented) getCredential( - _: ClusterDetails, + _: ClusterDetails_2, requestAuth: KubernetesRequestAuth, - ): Promise; + ): Promise; + // (undocumented) + presentAuthMetadata(_authMetadata: AuthMetadata_2): AuthMetadata_2; // (undocumented) validateCluster(): Error[]; } @@ -131,7 +151,7 @@ export const HEADER_KUBERNETES_CLUSTER: string; export class KubernetesBuilder { constructor(env: KubernetesEnvironment); // (undocumented) - addAuthStrategy(key: string, strategy: AuthenticationStrategy): this; + addAuthStrategy(key: string, strategy: AuthenticationStrategy_2): this; // (undocumented) build(): KubernetesBuilderReturn; // (undocumented) @@ -145,15 +165,15 @@ export class KubernetesBuilder { // (undocumented) protected buildCustomResources(): CustomResource_2[]; // (undocumented) - protected buildFetcher(): KubernetesFetcher; + protected buildFetcher(): KubernetesFetcher_2; // (undocumented) protected buildHttpServiceLocator( _clusterSupplier: KubernetesClustersSupplier_2, - ): KubernetesServiceLocator; + ): KubernetesServiceLocator_2; // (undocumented) protected buildMultiTenantServiceLocator( clusterSupplier: KubernetesClustersSupplier_2, - ): KubernetesServiceLocator; + ): KubernetesServiceLocator_2; // (undocumented) protected buildObjectsProvider( options: KubernetesObjectsProviderOptions, @@ -175,11 +195,11 @@ export class KubernetesBuilder { protected buildServiceLocator( method: ServiceLocatorMethod, clusterSupplier: KubernetesClustersSupplier_2, - ): KubernetesServiceLocator; + ): KubernetesServiceLocator_2; // (undocumented) protected buildSingleTenantServiceLocator( clusterSupplier: KubernetesClustersSupplier_2, - ): KubernetesServiceLocator; + ): KubernetesServiceLocator_2; // (undocumented) static createBuilder(env: KubernetesEnvironment): KubernetesBuilder; // (undocumented) @@ -195,7 +215,7 @@ export class KubernetesBuilder { // (undocumented) protected getClusterSupplier(): KubernetesClustersSupplier_2; // (undocumented) - protected getFetcher(): KubernetesFetcher; + protected getFetcher(): KubernetesFetcher_2; // (undocumented) protected getObjectsProvider( options: KubernetesObjectsProviderOptions, @@ -208,38 +228,38 @@ export class KubernetesBuilder { clusterSupplier: KubernetesClustersSupplier_2, ): KubernetesProxy; // (undocumented) - protected getServiceLocator(): KubernetesServiceLocator; + protected getServiceLocator(): KubernetesServiceLocator_2; // (undocumented) protected getServiceLocatorMethod(): ServiceLocatorMethod; // (undocumented) setAuthStrategyMap(authStrategyMap: { - [key: string]: AuthenticationStrategy; + [key: string]: AuthenticationStrategy_2; }): void; // (undocumented) setClusterSupplier(clusterSupplier?: KubernetesClustersSupplier_2): this; // (undocumented) setDefaultClusterRefreshInterval(refreshInterval: Duration): this; // (undocumented) - setFetcher(fetcher?: KubernetesFetcher): this; + setFetcher(fetcher?: KubernetesFetcher_2): this; // (undocumented) setObjectsProvider(objectsProvider?: KubernetesObjectsProvider_2): this; // (undocumented) setProxy(proxy?: KubernetesProxy): this; // (undocumented) - setServiceLocator(serviceLocator?: KubernetesServiceLocator): this; + setServiceLocator(serviceLocator?: KubernetesServiceLocator_2): this; } // @public export type KubernetesBuilderReturn = Promise<{ router: express.Router; clusterSupplier: KubernetesClustersSupplier_2; - customResources: CustomResource[]; - fetcher: KubernetesFetcher; + customResources: CustomResource_2[]; + fetcher: KubernetesFetcher_2; proxy: KubernetesProxy; objectsProvider: KubernetesObjectsProvider_2; - serviceLocator: KubernetesServiceLocator; + serviceLocator: KubernetesServiceLocator_2; authStrategyMap: { - [key: string]: AuthenticationStrategy; + [key: string]: AuthenticationStrategy_2; }; }>; @@ -321,14 +341,16 @@ export type ObjectsByEntityRequest = KubernetesRequestBody; export type ObjectToFetch = k8sAuthTypes.ObjectToFetch; // @public (undocumented) -export class OidcStrategy implements AuthenticationStrategy { +export class OidcStrategy implements AuthenticationStrategy_2 { // (undocumented) getCredential( - clusterDetails: ClusterDetails, + clusterDetails: ClusterDetails_2, authConfig: KubernetesRequestAuth, - ): Promise; + ): Promise; // (undocumented) - validateCluster(authMetadata: AuthMetadata): Error[]; + presentAuthMetadata(_authMetadata: AuthMetadata_2): AuthMetadata_2; + // (undocumented) + validateCluster(authMetadata: AuthMetadata_2): Error[]; } // @public (undocumented) @@ -348,9 +370,13 @@ export interface RouterOptions { } // @public (undocumented) -export class ServiceAccountStrategy implements AuthenticationStrategy { +export class ServiceAccountStrategy implements AuthenticationStrategy_2 { // (undocumented) - getCredential(clusterDetails: ClusterDetails): Promise; + getCredential( + clusterDetails: ClusterDetails_2, + ): Promise; + // (undocumented) + presentAuthMetadata(_authMetadata: AuthMetadata_2): AuthMetadata_2; // (undocumented) validateCluster(): Error[]; } diff --git a/plugins/kubernetes-backend/config.d.ts b/plugins/kubernetes-backend/config.d.ts index e9b5878920..de7f79b66c 100644 --- a/plugins/kubernetes-backend/config.d.ts +++ b/plugins/kubernetes-backend/config.d.ts @@ -46,13 +46,16 @@ export interface Config { /** @visibility secret */ serviceAccountToken?: string; /** @visibility frontend */ - authProvider: + authProvider?: + | 'aks' | 'aws' - | 'google' - | 'serviceAccount' | 'azure' + | 'google' + | 'googleServiceAccount' | 'oidc' - | 'googleServiceAccount'; + | 'serviceAccount'; + /** @visibility secret */ + authMetadata?: object; /** @visibility frontend */ oidcTokenProvider?: string; /** @visibility frontend */ @@ -81,6 +84,8 @@ export interface Config { /** @visibility frontend */ region?: string; /** @visibility frontend */ + authProvider?: string; + /** @visibility frontend */ skipTLSVerify?: boolean; /** @visibility frontend */ skipMetricsLookup?: boolean; diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 0e24f0e56a..6e80fef004 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.14.1-next.1", + "version": "0.14.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-backend/src/auth/AksStrategy.ts b/plugins/kubernetes-backend/src/auth/AksStrategy.ts index 07bdf2efe0..40151314a8 100644 --- a/plugins/kubernetes-backend/src/auth/AksStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/AksStrategy.ts @@ -13,8 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ClusterDetails } from '../types/types'; -import { AuthenticationStrategy, KubernetesCredential } from './types'; +import { + AuthMetadata, + AuthenticationStrategy, + ClusterDetails, + KubernetesCredential, +} from '@backstage/plugin-kubernetes-node'; import { KubernetesRequestAuth } from '@backstage/plugin-kubernetes-common'; /** @@ -31,7 +35,12 @@ export class AksStrategy implements AuthenticationStrategy { ? { type: 'bearer token', token: token as string } : { type: 'anonymous' }; } + public validateCluster(): Error[] { return []; } + + public presentAuthMetadata(_authMetadata: AuthMetadata): AuthMetadata { + return {}; + } } diff --git a/plugins/kubernetes-backend/src/auth/AnonymousStrategy.ts b/plugins/kubernetes-backend/src/auth/AnonymousStrategy.ts index 30a9593773..0f1aad398a 100644 --- a/plugins/kubernetes-backend/src/auth/AnonymousStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/AnonymousStrategy.ts @@ -14,7 +14,11 @@ * limitations under the License. */ -import { AuthenticationStrategy, KubernetesCredential } from './types'; +import { + AuthMetadata, + AuthenticationStrategy, + KubernetesCredential, +} from '@backstage/plugin-kubernetes-node'; /** * @@ -28,4 +32,8 @@ export class AnonymousStrategy implements AuthenticationStrategy { public validateCluster(): Error[] { return []; } + + public presentAuthMetadata(_authMetadata: AuthMetadata): AuthMetadata { + return {}; + } } diff --git a/plugins/kubernetes-backend/src/auth/AwsIamStrategy.ts b/plugins/kubernetes-backend/src/auth/AwsIamStrategy.ts index 53b880d60c..942b93615f 100644 --- a/plugins/kubernetes-backend/src/auth/AwsIamStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/AwsIamStrategy.ts @@ -25,8 +25,12 @@ import { ANNOTATION_KUBERNETES_AWS_ASSUME_ROLE, ANNOTATION_KUBERNETES_AWS_EXTERNAL_ID, } from '@backstage/plugin-kubernetes-common'; -import { ClusterDetails } from '../types/types'; -import { AuthenticationStrategy, KubernetesCredential } from './types'; +import { + AuthMetadata, + AuthenticationStrategy, + ClusterDetails, + KubernetesCredential, +} from '@backstage/plugin-kubernetes-node'; /** * @@ -128,4 +132,8 @@ export class AwsIamStrategy implements AuthenticationStrategy { return `k8s-aws-v1.${Buffer.from(url).toString('base64url')}`; } + + public presentAuthMetadata(_authMetadata: AuthMetadata): AuthMetadata { + return {}; + } } diff --git a/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.ts b/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.ts index d0eea3c13c..a1b29a10a1 100644 --- a/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.ts @@ -15,12 +15,16 @@ */ import { Logger } from 'winston'; -import { AuthenticationStrategy, KubernetesCredential } from './types'; import { AccessToken, DefaultAzureCredential, TokenCredential, } from '@azure/identity'; +import { + AuthMetadata, + AuthenticationStrategy, + KubernetesCredential, +} from '@backstage/plugin-kubernetes-node'; const aksScope = '6dae42f8-4368-4678-94ff-3960e28e3630/.default'; // This scope is the same for all Azure Managed Kubernetes @@ -89,4 +93,8 @@ export class AzureIdentityStrategy implements AuthenticationStrategy { private tokenExpired(): boolean { return Date.now() >= this.accessToken.expiresOnTimestamp; } + + public presentAuthMetadata(_authMetadata: AuthMetadata): AuthMetadata { + return {}; + } } diff --git a/plugins/kubernetes-backend/src/auth/DispatchStrategy.test.ts b/plugins/kubernetes-backend/src/auth/DispatchStrategy.test.ts index 7202311d6f..773e464168 100644 --- a/plugins/kubernetes-backend/src/auth/DispatchStrategy.test.ts +++ b/plugins/kubernetes-backend/src/auth/DispatchStrategy.test.ts @@ -31,6 +31,7 @@ describe('getCredential', () => { mockStrategy = { getCredential: jest.fn(), validateCluster: jest.fn(), + presentAuthMetadata: jest.fn(), }; strategy = new DispatchStrategy({ authStrategyMap: { google: mockStrategy }, diff --git a/plugins/kubernetes-backend/src/auth/DispatchStrategy.ts b/plugins/kubernetes-backend/src/auth/DispatchStrategy.ts index f12e49b577..14a3009a65 100644 --- a/plugins/kubernetes-backend/src/auth/DispatchStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/DispatchStrategy.ts @@ -14,12 +14,16 @@ * limitations under the License. */ -import { AuthenticationStrategy, KubernetesCredential } from './types'; -import { AuthMetadata, ClusterDetails } from '../types'; import { ANNOTATION_KUBERNETES_AUTH_PROVIDER, KubernetesRequestAuth, } from '@backstage/plugin-kubernetes-common'; +import { + AuthMetadata, + AuthenticationStrategy, + ClusterDetails, + KubernetesCredential, +} from '@backstage/plugin-kubernetes-node'; /** * @@ -67,4 +71,8 @@ export class DispatchStrategy implements AuthenticationStrategy { } return strategy.validateCluster(authMetadata); } + + public presentAuthMetadata(_authMetadata: AuthMetadata): AuthMetadata { + return {}; + } } diff --git a/plugins/kubernetes-backend/src/auth/GoogleServiceAccountStrategy.ts b/plugins/kubernetes-backend/src/auth/GoogleServiceAccountStrategy.ts index 2a44a31d6c..f6757d6a64 100644 --- a/plugins/kubernetes-backend/src/auth/GoogleServiceAccountStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/GoogleServiceAccountStrategy.ts @@ -13,7 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { AuthenticationStrategy, KubernetesCredential } from './types'; + +import { + AuthMetadata, + AuthenticationStrategy, + KubernetesCredential, +} from '@backstage/plugin-kubernetes-node'; import * as container from '@google-cloud/container'; /** @@ -36,4 +41,8 @@ export class GoogleServiceAccountStrategy implements AuthenticationStrategy { public validateCluster(): Error[] { return []; } + + public presentAuthMetadata(_authMetadata: AuthMetadata): AuthMetadata { + return {}; + } } diff --git a/plugins/kubernetes-backend/src/auth/GoogleStrategy.ts b/plugins/kubernetes-backend/src/auth/GoogleStrategy.ts index c1290dc1fe..c48086f7f8 100644 --- a/plugins/kubernetes-backend/src/auth/GoogleStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/GoogleStrategy.ts @@ -14,9 +14,13 @@ * limitations under the License. */ -import { AuthenticationStrategy, KubernetesCredential } from './types'; -import { ClusterDetails } from '../types/types'; import { KubernetesRequestAuth } from '@backstage/plugin-kubernetes-common'; +import { + AuthMetadata, + AuthenticationStrategy, + ClusterDetails, + KubernetesCredential, +} from '@backstage/plugin-kubernetes-node'; /** * @@ -35,7 +39,12 @@ export class GoogleStrategy implements AuthenticationStrategy { } return { type: 'bearer token', token: token as string }; } + public validateCluster(): Error[] { return []; } + + public presentAuthMetadata(_authMetadata: AuthMetadata): AuthMetadata { + return {}; + } } diff --git a/plugins/kubernetes-backend/src/auth/OidcStrategy.ts b/plugins/kubernetes-backend/src/auth/OidcStrategy.ts index 445799cbb8..1039f1d40c 100644 --- a/plugins/kubernetes-backend/src/auth/OidcStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/OidcStrategy.ts @@ -18,8 +18,12 @@ import { ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER, KubernetesRequestAuth, } from '@backstage/plugin-kubernetes-common'; -import { AuthenticationStrategy, KubernetesCredential } from './types'; -import { AuthMetadata, ClusterDetails } from '../types/types'; +import { + AuthMetadata, + AuthenticationStrategy, + ClusterDetails, + KubernetesCredential, +} from '@backstage/plugin-kubernetes-node'; /** * @@ -57,4 +61,8 @@ export class OidcStrategy implements AuthenticationStrategy { } return []; } + + public presentAuthMetadata(_authMetadata: AuthMetadata): AuthMetadata { + return {}; + } } diff --git a/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts b/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts index 714b2a94d1..aff6e61a64 100644 --- a/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts @@ -14,10 +14,14 @@ * limitations under the License. */ +import { + AuthMetadata, + AuthenticationStrategy, + ClusterDetails, + KubernetesCredential, +} from '@backstage/plugin-kubernetes-node'; import { KubeConfig, User } from '@kubernetes/client-node'; import fs from 'fs-extra'; -import { AuthenticationStrategy, KubernetesCredential } from './types'; -import { ClusterDetails } from '../types/types'; /** * @@ -45,4 +49,8 @@ export class ServiceAccountStrategy implements AuthenticationStrategy { public validateCluster(): Error[] { return []; } + + public presentAuthMetadata(_authMetadata: AuthMetadata): AuthMetadata { + return {}; + } } diff --git a/plugins/kubernetes-backend/src/cluster-locator/ConfigClusterLocator.test.ts b/plugins/kubernetes-backend/src/cluster-locator/ConfigClusterLocator.test.ts index 258cddcd66..ad3203a16d 100644 --- a/plugins/kubernetes-backend/src/cluster-locator/ConfigClusterLocator.test.ts +++ b/plugins/kubernetes-backend/src/cluster-locator/ConfigClusterLocator.test.ts @@ -32,6 +32,7 @@ describe('ConfigClusterLocator', () => { authStrategy = { getCredential: jest.fn(), validateCluster: jest.fn().mockReturnValue([]), + presentAuthMetadata: jest.fn(), }; }); @@ -177,6 +178,97 @@ describe('ConfigClusterLocator', () => { ]); }); + it('reads custom authMetadata', async () => { + const config: Config = new ConfigReader({ + clusters: [ + { + name: 'cluster', + url: 'http://url', + authProvider: 'authProvider', + authMetadata: { 'custom-key': 'custom-value' }, + }, + ], + }); + + const result = await ConfigClusterLocator.fromConfig( + config, + authStrategy, + ).getClusters(); + + expect(result).toMatchObject([ + { + authMetadata: expect.objectContaining({ 'custom-key': 'custom-value' }), + }, + ]); + }); + + it('reads authProvider from metadata block', async () => { + const config: Config = new ConfigReader({ + clusters: [ + { + name: 'cluster', + url: 'http://url', + authMetadata: { + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'serviceAccount', + }, + }, + ], + }); + + const result = await ConfigClusterLocator.fromConfig( + config, + authStrategy, + ).getClusters(); + + expect(result).toMatchObject([ + { + authMetadata: { + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'serviceAccount', + }, + }, + ]); + }); + + it('prefers authMetadata block to top-level keys', async () => { + const sut = ConfigClusterLocator.fromConfig( + new ConfigReader({ + clusters: [ + { + name: 'cluster', + url: 'http://url', + authProvider: 'aws', + authMetadata: { + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'serviceAccount', + }, + }, + ], + }), + authStrategy, + ); + + const result = await sut.getClusters(); + + expect(result).toMatchObject([ + { + authMetadata: { + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'serviceAccount', + }, + }, + ]); + }); + + it('forbids cluster without auth provider', () => { + const config: Config = new ConfigReader({ + clusters: [{ name: 'cluster', url: 'http://url' }], + }); + + expect(() => ConfigClusterLocator.fromConfig(config, authStrategy)).toThrow( + `cluster 'cluster' has no auth provider configured; this must be specified` + + ` via the 'authProvider' or ` + + `'authMetadata.${ANNOTATION_KUBERNETES_AUTH_PROVIDER}' parameter`, + ); + }); + it('one cluster with dashboardParameters', async () => { const config: Config = new ConfigReader({ clusters: [ diff --git a/plugins/kubernetes-backend/src/cluster-locator/ConfigClusterLocator.ts b/plugins/kubernetes-backend/src/cluster-locator/ConfigClusterLocator.ts index 7899d7762d..19ba8634ad 100644 --- a/plugins/kubernetes-backend/src/cluster-locator/ConfigClusterLocator.ts +++ b/plugins/kubernetes-backend/src/cluster-locator/ConfigClusterLocator.ts @@ -37,9 +37,22 @@ export class ConfigClusterLocator implements KubernetesClustersSupplier { ): ConfigClusterLocator { return new ConfigClusterLocator( config.getConfigArray('clusters').map(c => { - const authProvider = c.getString('authProvider'); + const authMetadataBlock = c.getOptional<{ + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]?: string; + }>('authMetadata'); + const name = c.getString('name'); + const authProvider = + authMetadataBlock?.[ANNOTATION_KUBERNETES_AUTH_PROVIDER] ?? + c.getOptionalString('authProvider'); + if (!authProvider) { + throw new Error( + `cluster '${name}' has no auth provider configured; this must be ` + + `specified via the 'authProvider' or ` + + `'authMetadata.${ANNOTATION_KUBERNETES_AUTH_PROVIDER}' parameter`, + ); + } const clusterDetails: ClusterDetails = { - name: c.getString('name'), + name, url: c.getString('url'), skipTLSVerify: c.getOptionalBoolean('skipTLSVerify') ?? false, skipMetricsLookup: c.getOptionalBoolean('skipMetricsLookup') ?? false, @@ -48,6 +61,7 @@ export class ConfigClusterLocator implements KubernetesClustersSupplier { authMetadata: { [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: authProvider, ...ConfigClusterLocator.parseAuthMetadata(c), + ...authMetadataBlock, }, }; diff --git a/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.test.ts b/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.test.ts index f919561490..849a7839e2 100644 --- a/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.test.ts +++ b/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.test.ts @@ -382,5 +382,108 @@ describe('GkeClusterLocator', () => { parent: 'projects/some-project/locations/some-region', }); }); + it('return google login when no authProvider is specified', async () => { + mockedListClusters.mockReturnValueOnce([ + { + clusters: [ + { + name: 'some-cluster', + endpoint: '1.2.3.4', + }, + ], + }, + ]); + + const config: Config = new ConfigReader({ + type: 'gke', + projectId: 'some-project', + }); + + const sut = GkeClusterLocator.fromConfigWithClient(config, { + listClusters: mockedListClusters, + } as any); + + const result = await sut.getClusters(); + + expect(result).toStrictEqual([ + { + name: 'some-cluster', + url: 'https://1.2.3.4', + authMetadata: { [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'google' }, + skipTLSVerify: false, + skipMetricsLookup: false, + }, + ]); + }); + it('return googleServiceAccount login when authProvider is specified', async () => { + mockedListClusters.mockReturnValueOnce([ + { + clusters: [ + { + name: 'some-cluster', + endpoint: '1.2.3.4', + }, + ], + }, + ]); + + const config: Config = new ConfigReader({ + type: 'gke', + projectId: 'some-project', + authProvider: 'googleServiceAccount', + }); + + const sut = GkeClusterLocator.fromConfigWithClient(config, { + listClusters: mockedListClusters, + } as any); + + const result = await sut.getClusters(); + + expect(result).toStrictEqual([ + { + name: 'some-cluster', + url: 'https://1.2.3.4', + authMetadata: { + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'googleServiceAccount', + }, + skipTLSVerify: false, + skipMetricsLookup: false, + }, + ]); + }); + it('return google login when authProvider property has invalid value', async () => { + mockedListClusters.mockReturnValueOnce([ + { + clusters: [ + { + name: 'some-cluster', + endpoint: '1.2.3.4', + }, + ], + }, + ]); + + const config: Config = new ConfigReader({ + type: 'gke', + projectId: 'some-project', + authProvider: 'differentValue', + }); + + const sut = GkeClusterLocator.fromConfigWithClient(config, { + listClusters: mockedListClusters, + } as any); + + const result = await sut.getClusters(); + + expect(result).toStrictEqual([ + { + name: 'some-cluster', + url: 'https://1.2.3.4', + authMetadata: { [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'google' }, + skipTLSVerify: false, + skipMetricsLookup: false, + }, + ]); + }); }); }); diff --git a/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.ts b/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.ts index 74e7ebc9af..03f5bda103 100644 --- a/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.ts +++ b/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.ts @@ -29,6 +29,7 @@ interface MatchResourceLabelEntry { type GkeClusterLocatorOptions = { projectId: string; + authProvider: string; region?: string; skipTLSVerify?: boolean; skipMetricsLookup?: boolean; @@ -54,8 +55,14 @@ export class GkeClusterLocator implements KubernetesClustersSupplier { return { key: mrl.getString('key'), value: mrl.getString('value') }; }) ?? []; + const storeAuthProviderString = + config.getOptionalString('authProvider') === 'googleServiceAccount' + ? 'googleServiceAccount' + : 'google'; + const options = { projectId: config.getString('projectId'), + authProvider: storeAuthProviderString, region: config.getOptionalString('region') ?? '-', skipTLSVerify: config.getOptionalBoolean('skipTLSVerify') ?? false, skipMetricsLookup: @@ -97,6 +104,7 @@ export class GkeClusterLocator implements KubernetesClustersSupplier { const { projectId, region, + authProvider, skipTLSVerify, skipMetricsLookup, exposeDashboard, @@ -121,7 +129,7 @@ export class GkeClusterLocator implements KubernetesClustersSupplier { // TODO filter out clusters which don't have name or endpoint name: r.name ?? 'unknown', url: `https://${r.endpoint ?? ''}`, - authMetadata: { [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'google' }, + authMetadata: { [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: authProvider }, skipTLSVerify, skipMetricsLookup, ...(exposeDashboard diff --git a/plugins/kubernetes-backend/src/cluster-locator/index.test.ts b/plugins/kubernetes-backend/src/cluster-locator/index.test.ts index ded0faac5b..beb9fc9cfe 100644 --- a/plugins/kubernetes-backend/src/cluster-locator/index.test.ts +++ b/plugins/kubernetes-backend/src/cluster-locator/index.test.ts @@ -53,6 +53,7 @@ describe('getCombinedClusterSupplier', () => { const mockStrategy: jest.Mocked = { getCredential: jest.fn(), validateCluster: jest.fn().mockReturnValue([]), + presentAuthMetadata: jest.fn(), }; const clusterSupplier = getCombinedClusterSupplier( diff --git a/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts index 77d02a032a..5d19c6d94d 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts @@ -14,20 +14,19 @@ * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; import { ANNOTATION_KUBERNETES_AUTH_PROVIDER, + ANNOTATION_KUBERNETES_AWS_ASSUME_ROLE, + ANNOTATION_KUBERNETES_AWS_EXTERNAL_ID, + ANNOTATION_KUBERNETES_DASHBOARD_URL, ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER, - ObjectsByEntityResponse, KubernetesRequestAuth, } from '@backstage/plugin-kubernetes-common'; import request from 'supertest'; import { ClusterDetails, - FetchResponseWrapper, KubernetesFetcher, KubernetesServiceLocator, - ObjectFetchParams, } from '../types/types'; import { KubernetesCredential } from '../auth/types'; import { @@ -42,15 +41,13 @@ import { startTestBackend, } from '@backstage/backend-test-utils'; import { rest } from 'msw'; -import { - AuthorizeResult, - PermissionEvaluator, -} from '@backstage/plugin-permission-common'; +import { AuthorizeResult } from '@backstage/plugin-permission-common'; import { PermissionsService, createBackendModule, } from '@backstage/backend-plugin-api'; import { + AuthMetadata, KubernetesObjectsProvider, kubernetesAuthStrategyExtensionPoint, kubernetesClusterSupplierExtensionPoint, @@ -60,99 +57,69 @@ import { } from '@backstage/plugin-kubernetes-node'; import { ExtendedHttpServer } from '@backstage/backend-app-api'; -describe('KubernetesBuilder', () => { +describe('API integration tests', () => { let app: ExtendedHttpServer; - let objectsProviderMock: KubernetesObjectsProvider; + let objectsProviderMock: jest.Mocked; const happyK8SResult = { - items: [ - { - clusterOne: { - pods: [ - { - metadata: { - name: 'pod1', - }, - }, - ], - }, - }, - ], - } as any; - const policyMock: jest.Mocked = { - authorize: jest.fn(), - authorizeConditional: jest.fn(), + items: [{ clusterOne: { pods: [{ metadata: { name: 'pod1' } }] } }], }; const permissionsMock: ServiceMock = - mockServices.permissions.mock(policyMock); + mockServices.permissions.mock({ + authorize: jest.fn(), + authorizeConditional: jest.fn(), + }); + const minimalValidConfigService = mockServices.rootConfig.factory({ + data: { + kubernetes: { + serviceLocatorMethod: { type: 'multiTenant' }, + clusterLocatorMethods: [], + }, + }, + }); + const withClusters = (clusters: ClusterDetails[]) => + createBackendModule({ + pluginId: 'kubernetes', + moduleId: 'testClusterSupplier', + register(env) { + env.registerInit({ + deps: { extension: kubernetesClusterSupplierExtensionPoint }, + async init({ extension }) { + extension.addClusterSupplier({ + getClusters: jest.fn().mockResolvedValue(clusters), + }); + }, + }); + }, + }); beforeEach(async () => { jest.resetAllMocks(); objectsProviderMock = { - getKubernetesObjectsByEntity: jest.fn().mockImplementation(_ => { - return Promise.resolve(happyK8SResult); - }), - getCustomResourcesByEntity: jest.fn().mockImplementation(_ => { - return Promise.resolve(happyK8SResult); - }), - }; - - const clusterSupplierMock = { - getClusters: jest.fn().mockImplementation(_ => { - return Promise.resolve([ - { - name: 'some-cluster', - url: 'https://localhost:1234', - authMetadata: { - [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'serviceAccount', - }, - }, - { - name: 'some-other-cluster', - url: 'https://localhost:1235', - authMetadata: { - [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'oidc', - [ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER]: 'google', - }, - }, - ]); - }), + getKubernetesObjectsByEntity: jest.fn().mockResolvedValue(happyK8SResult), + getCustomResourcesByEntity: jest.fn().mockResolvedValue(happyK8SResult), }; jest.mock('@backstage/catalog-client', () => ({ - CatalogClient: jest.fn().mockImplementation(() => ({ - getEntityByRef: jest.fn().mockImplementation(entityRef => { + CatalogClient: jest.fn().mockReturnValue({ + getEntityByRef: jest.fn().mockImplementation(async entityRef => { if (entityRef.name === 'noentity') { - return Promise.resolve(undefined); + return undefined; } - return Promise.resolve({ + return { kind: entityRef.kind, metadata: { name: entityRef.name, namespace: entityRef.namespace, }, - } as Entity); + }; }), - })), + }), })); const { server } = await startTestBackend({ features: [ - mockServices.rootConfig.factory({ - data: { - kubernetes: { - serviceLocatorMethod: { - type: 'multiTenant', - }, - clusterLocatorMethods: [ - { - type: 'config', - clusters: [], - }, - ], - }, - }, - }), + minimalValidConfigService, import('@backstage/plugin-kubernetes-backend/alpha'), import('@backstage/plugin-permission-backend/alpha'), import('@backstage/plugin-permission-backend-module-allow-all-policy'), @@ -168,24 +135,33 @@ describe('KubernetesBuilder', () => { }); }, }), - createBackendModule({ - pluginId: 'kubernetes', - moduleId: 'testClusterSupplier', - register(env) { - env.registerInit({ - deps: { extension: kubernetesClusterSupplierExtensionPoint }, - async init({ extension }) { - extension.addClusterSupplier(clusterSupplierMock); - }, - }); + withClusters([ + { + name: 'some-cluster', + url: 'https://localhost:1234', + authMetadata: { + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'serviceAccount', + }, }, - }), + { + name: 'some-other-cluster', + url: 'https://localhost:1235', + authMetadata: { + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'oidc', + [ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER]: 'google', + }, + }, + ]), ], }); app = server; }); + afterEach(() => { + app.stop(); + }); + describe('get /clusters', () => { it('happy path: lists clusters', async () => { const response = await request(app).get('/api/kubernetes/clusters'); @@ -205,7 +181,105 @@ describe('KubernetesBuilder', () => { ], }); }); + + it('happy path: lists clusters with custom AuthStrategy and custom auth metadata', async () => { + const { server } = await startTestBackend({ + features: [ + minimalValidConfigService, + import('@backstage/plugin-kubernetes-backend/alpha'), + createBackendModule({ + pluginId: 'kubernetes', + moduleId: 'testObjectsProvider', + register(env) { + env.registerInit({ + deps: { extension: kubernetesObjectsProviderExtensionPoint }, + async init({ extension }) { + extension.addObjectsProvider(objectsProviderMock); + }, + }); + }, + }), + withClusters([ + { + name: 'some-cluster', + url: 'https://localhost:1234', + authMetadata: { + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'customAuth', + [ANNOTATION_KUBERNETES_DASHBOARD_URL]: + 'https://127.0.0.1:8443/dashboard', + [ANNOTATION_KUBERNETES_AWS_EXTERNAL_ID]: '12650152165654', + [ANNOTATION_KUBERNETES_AWS_ASSUME_ROLE]: 'my_aws_role', + }, + }, + ]), + createBackendModule({ + pluginId: 'kubernetes', + moduleId: 'testAuthStrategy', + register(env) { + env.registerInit({ + deps: { extension: kubernetesAuthStrategyExtensionPoint }, + async init({ extension }) { + extension.addAuthStrategy('customAuth', { + getCredential: jest + .fn< + Promise, + [ClusterDetails, KubernetesRequestAuth] + >() + .mockImplementation(async (_, requestAuth) => ({ + type: 'bearer token', + token: requestAuth.custom as string, + })), + validateCluster: jest.fn().mockReturnValue([]), + presentAuthMetadata: ( + authMetadata: AuthMetadata, + ): AuthMetadata => { + const authMetadataFilter = Object.entries(authMetadata) + .filter(([key, _value]) => { + return [ + ANNOTATION_KUBERNETES_DASHBOARD_URL, + ANNOTATION_KUBERNETES_AWS_ASSUME_ROLE, + ].includes(key); + }) + .reduce( + ( + accumulator: AuthMetadata, + currentValue: [string, string], + ) => { + accumulator[currentValue[0]] = currentValue[1]; + return accumulator; + }, + {}, + ); + + return authMetadataFilter; + }, + }); + }, + }); + }, + }), + ], + }); + app = server; + + const response = await request(app).get('/api/kubernetes/clusters'); + + expect(response.status).toEqual(200); + expect(response.body).toStrictEqual({ + items: [ + { + name: 'some-cluster', + authProvider: 'customAuth', + auth: { + 'kubernetes.io/aws-assume-role': 'my_aws_role', + 'kubernetes.io/dashboard-url': 'https://127.0.0.1:8443/dashboard', + }, + }, + ], + }); + }); }); + describe('post /services/:serviceId', () => { it('happy path: lists kubernetes objects without auth in request body', async () => { const response = await request(app).post( @@ -218,20 +292,16 @@ describe('KubernetesBuilder', () => { it('happy path: lists kubernetes objects with auth in request body', async () => { const response = await request(app) .post('/api/kubernetes/services/test-service') - .send({ - auth: { - google: 'google_token_123', - }, - }) + .send({ auth: { google: 'google_token_123' } }) .set('Content-Type', 'application/json'); expect(response.status).toEqual(200); expect(response.body).toEqual(happyK8SResult); }); it('internal error: lists kubernetes objects', async () => { - objectsProviderMock.getKubernetesObjectsByEntity = jest - .fn() - .mockRejectedValue(Error('some internal error')); + objectsProviderMock.getKubernetesObjectsByEntity.mockRejectedValue( + Error('some internal error'), + ); const response = await request(app).post( '/api/kubernetes/services/test-service', @@ -259,96 +329,29 @@ describe('KubernetesBuilder', () => { }, ]; - const clusterSupplierMock = { - getClusters: jest.fn().mockImplementation(_ => { - return Promise.resolve(clusters); + const pod = { metadata: { name: 'pod1' } }; + + const mockServiceLocator: jest.Mocked = { + getClustersByEntity: jest.fn().mockResolvedValue({ + clusters: [someCluster], }), }; - const pod = { - metadata: { - name: 'pod1', - }, - }; - const result: ObjectsByEntityResponse = { - items: [ - { - cluster: { - name: someCluster.name, - }, - errors: [], - podMetrics: [], - resources: [ - { - type: 'pods', - resources: [pod], - }, - ], - }, - ], - }; - - const mockServiceLocator: KubernetesServiceLocator = { - getClustersByEntity( - _entity: Entity, - ): Promise<{ clusters: ClusterDetails[] }> { - return Promise.resolve({ clusters: [someCluster] }); - }, - }; - - const mockFetcher: KubernetesFetcher = { - fetchPodMetricsByNamespaces( - _clusterDetails: ClusterDetails, - _credential: KubernetesCredential, - _namespaces: Set, - ): Promise { - return Promise.resolve({ errors: [], responses: [] }); - }, - fetchObjectsForService( - _params: ObjectFetchParams, - ): Promise { - return Promise.resolve({ - errors: [], - responses: [ - { - type: 'pods', - resources: [pod], - }, - ], - }); - }, + const mockFetcher: jest.Mocked = { + fetchPodMetricsByNamespaces: jest + .fn() + .mockResolvedValue({ errors: [], responses: [] }), + fetchObjectsForService: jest.fn().mockResolvedValue({ + errors: [], + responses: [{ type: 'pods', resources: [pod] }], + }), }; const { server } = await startTestBackend({ features: [ - mockServices.rootConfig.factory({ - data: { - kubernetes: { - serviceLocatorMethod: { - type: 'multiTenant', - }, - clusterLocatorMethods: [ - { - type: 'config', - clusters: [], - }, - ], - }, - }, - }), + minimalValidConfigService, import('@backstage/plugin-kubernetes-backend/alpha'), - createBackendModule({ - pluginId: 'kubernetes', - moduleId: 'testClusterSupplier', - register(env) { - env.registerInit({ - deps: { extension: kubernetesClusterSupplierExtensionPoint }, - async init({ extension }) { - extension.addClusterSupplier(clusterSupplierMock); - }, - }); - }, - }), + withClusters(clusters), createBackendModule({ pluginId: 'kubernetes', moduleId: 'testFetcher', @@ -375,20 +378,22 @@ describe('KubernetesBuilder', () => { }), ], }); - app = server; const response = await request(app) .post('/api/kubernetes/services/test-service') - .send({ - entity: { - metadata: { - name: 'thing', - }, - }, - }); + .send({ entity: { metadata: { name: 'thing' } } }); - expect(response.body).toEqual(result); + expect(response.body).toEqual({ + items: [ + { + cluster: { name: someCluster.name }, + errors: [], + podMetrics: [], + resources: [{ type: 'pods', resources: [pod] }], + }, + ], + }); expect(response.status).toEqual(200); }); @@ -405,9 +410,11 @@ describe('KubernetesBuilder', () => { }), }; - const clusterSupplierMock = { - getClusters: jest.fn().mockImplementation(_ => { - return Promise.resolve([ + const { server } = await startTestBackend({ + features: [ + minimalValidConfigService, + import('@backstage/plugin-kubernetes-backend/alpha'), + withClusters([ { name: 'custom-cluster', url: 'http://my.cluster.url', @@ -415,40 +422,7 @@ describe('KubernetesBuilder', () => { [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'custom', }, }, - ]); - }), - }; - - const { server } = await startTestBackend({ - features: [ - mockServices.rootConfig.factory({ - data: { - kubernetes: { - serviceLocatorMethod: { - type: 'multiTenant', - }, - clusterLocatorMethods: [ - { - type: 'config', - clusters: [], - }, - ], - }, - }, - }), - import('@backstage/plugin-kubernetes-backend/alpha'), - createBackendModule({ - pluginId: 'kubernetes', - moduleId: 'testClusterSupplier', - register(env) { - env.registerInit({ - deps: { extension: kubernetesClusterSupplierExtensionPoint }, - async init({ extension }) { - extension.addClusterSupplier(clusterSupplierMock); - }, - }); - }, - }), + ]), createBackendModule({ pluginId: 'kubernetes', moduleId: 'testAuthStrategy', @@ -467,6 +441,7 @@ describe('KubernetesBuilder', () => { token: requestAuth.custom as string, })), validateCluster: jest.fn().mockReturnValue([]), + presentAuthMetadata: jest.fn().mockReturnValue({}), }); }, }); @@ -492,11 +467,7 @@ describe('KubernetesBuilder', () => { await request(app) .post('/api/kubernetes/services/test-service') .send({ - entity: { - metadata: { - name: 'thing', - }, - }, + entity: { metadata: { name: 'thing' } }, auth: { custom: 'custom-token' }, }); @@ -533,30 +504,26 @@ describe('KubernetesBuilder', () => { ); }); - it('returns the given request body with permission set to allow', async () => { - const requestBody = { + it('forwards request body to k8s', async () => { + const namespaceManifest = { kind: 'Namespace', apiVersion: 'v1', - metadata: { - name: 'new-ns', - }, + metadata: { name: 'new-ns' }, }; const proxyEndpointRequest = request(app) .post('/api/kubernetes/proxy/api/v1/namespaces') .set(HEADER_KUBERNETES_CLUSTER, 'some-cluster') .set(HEADER_KUBERNETES_AUTH, 'randomtoken') - .send(requestBody); - + .send(namespaceManifest); worker.use(rest.all(proxyEndpointRequest.url, req => req.passthrough())); - const response = await proxyEndpointRequest; - expect(response.body).toStrictEqual(requestBody); + expect(response.body).toStrictEqual(namespaceManifest); }); - it('supports yaml content type with permission set to allow', async () => { - const requestBody = `--- + it('supports yaml content type', async () => { + const yamlManifest = `--- kind: Namespace apiVersion: v1 metadata: @@ -568,55 +535,37 @@ metadata: .set(HEADER_KUBERNETES_CLUSTER, 'some-cluster') .set(HEADER_KUBERNETES_AUTH, 'randomtoken') .set('content-type', 'application/yaml') - .send(requestBody); + .send(yamlManifest); worker.use(rest.all(proxyEndpointRequest.url, req => req.passthrough())); const response = await proxyEndpointRequest; - expect(response.text).toEqual(requestBody); + expect(response.text).toEqual(yamlManifest); }); - it('returns a 403 response if Permission Policy is in place that blocks endpoint', async () => { - const requestBody = { - kind: 'Namespace', - apiVersion: 'v1', - metadata: { - name: 'new-ns', - }, - }; - + it('returns 403 response when permission blocks endpoint', async () => { permissionsMock.authorize.mockResolvedValue([ { result: AuthorizeResult.DENY }, ]); const { server } = await startTestBackend({ features: [ - mockServices.rootConfig.factory({ - data: { - kubernetes: { - serviceLocatorMethod: { - type: 'multiTenant', - }, - clusterLocatorMethods: [ - { - type: 'config', - clusters: [], - }, - ], - }, - }, - }), + minimalValidConfigService, permissionsMock.factory, import('@backstage/plugin-kubernetes-backend/alpha'), - // import('@backstage/plugin-permission-backend/alpha'), ], }); + app = server; - const proxyEndpointRequest = request(server) + const proxyEndpointRequest = request(app) .post('/api/kubernetes/proxy/api/v1/namespaces') .set(HEADER_KUBERNETES_CLUSTER, 'some-cluster') .set(HEADER_KUBERNETES_AUTH, 'randomtoken') - .send(requestBody); + .send({ + kind: 'Namespace', + apiVersion: 'v1', + metadata: { name: 'new-ns' }, + }); worker.use(rest.all(proxyEndpointRequest.url, req => req.passthrough())); @@ -635,62 +584,17 @@ metadata: }), ); - const clusterSupplierMock = { - getClusters: jest.fn().mockImplementation(_ => { - return Promise.resolve([ + const { server } = await startTestBackend({ + features: [ + minimalValidConfigService, + import('@backstage/plugin-kubernetes-backend/alpha'), + withClusters([ { name: 'custom-cluster', url: 'http://my.cluster.url', - authMetadata: { - [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'custom', - }, + authMetadata: { [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'custom' }, }, - ]); - }), - }; - - const { server } = await startTestBackend({ - features: [ - mockServices.rootConfig.factory({ - data: { - kubernetes: { - serviceLocatorMethod: { - type: 'multiTenant', - }, - clusterLocatorMethods: [ - { - type: 'config', - clusters: [], - }, - ], - }, - }, - }), - import('@backstage/plugin-kubernetes-backend/alpha'), - createBackendModule({ - pluginId: 'kubernetes', - moduleId: 'testObjectsProvider', - register(env) { - env.registerInit({ - deps: { extension: kubernetesObjectsProviderExtensionPoint }, - async init({ extension }) { - extension.addObjectsProvider(objectsProviderMock); - }, - }); - }, - }), - createBackendModule({ - pluginId: 'kubernetes', - moduleId: 'testClusterSupplier', - register(env) { - env.registerInit({ - deps: { extension: kubernetesClusterSupplierExtensionPoint }, - async init({ extension }) { - extension.addClusterSupplier(clusterSupplierMock); - }, - }); - }, - }), + ]), createBackendModule({ pluginId: 'kubernetes', moduleId: 'testAuthStrategy', @@ -706,6 +610,7 @@ metadata: >() .mockResolvedValue({ type: 'anonymous' }), validateCluster: jest.fn().mockReturnValue([]), + presentAuthMetadata: jest.fn().mockReturnValue({}), }); }, }); @@ -714,9 +619,7 @@ metadata: ], }); - app = server; - - const proxyEndpointRequest = request(app) + const proxyEndpointRequest = request(server) .get('/api/kubernetes/proxy/api/v1/namespaces') .set(HEADER_KUBERNETES_CLUSTER, 'custom-cluster') .set(HEADER_KUBERNETES_AUTH, 'custom-token'); @@ -726,58 +629,138 @@ metadata: expect(response.body).toStrictEqual({ items: [] }); }); - it('should not permit custom auth strategies with dashes', async () => { - const throwError = async () => { - await startTestBackend({ - features: [ - import('@backstage/plugin-kubernetes-backend/alpha'), - createBackendModule({ - pluginId: 'kubernetes', - moduleId: 'testAuthStrategy', - register(env) { - env.registerInit({ - deps: { extension: kubernetesAuthStrategyExtensionPoint }, - async init({ extension }) { - extension.addAuthStrategy('custom-strategy', { - getCredential: jest - .fn< - Promise, - [ClusterDetails, KubernetesRequestAuth] - >() - .mockResolvedValue({ type: 'anonymous' }), - validateCluster: jest.fn().mockReturnValue([]), - }); - }, - }); - }, - }), - ], - }); + it('reads custom auth metadata from config', async () => { + const authStrategy = { + getCredential: jest.fn().mockResolvedValue({ type: 'anonymous' }), + validateCluster: jest.fn().mockReturnValue([]), + presentAuthMetadata: jest.fn().mockReturnValue({}), }; + worker.use( + rest.get('http://my.cluster/api', (_req, res, ctx) => + res(ctx.json({})), + ), + ); + const { server } = await startTestBackend({ + features: [ + mockServices.rootConfig.factory({ + data: { + kubernetes: { + serviceLocatorMethod: { type: 'multiTenant' }, + clusterLocatorMethods: [ + { + type: 'config', + clusters: [ + { + name: 'cluster', + url: 'http://my.cluster', + authProvider: 'custom', + authMetadata: { 'custom-key': 'custom-value' }, + }, + ], + }, + ], + }, + }, + }), + import('@backstage/plugin-kubernetes-backend/alpha'), + createBackendModule({ + pluginId: 'kubernetes', + moduleId: 'testAuthStrategy', + register(env) { + env.registerInit({ + deps: { extension: kubernetesAuthStrategyExtensionPoint }, + async init({ extension }) { + extension.addAuthStrategy('custom', authStrategy); + }, + }); + }, + }), + ], + }); + app = server; - await expect(throwError).rejects.toThrow( - 'Strategy name can not include dashes', + const proxyEndpointRequest = request(app).get( + '/api/kubernetes/proxy/api', + ); + worker.use(rest.all(proxyEndpointRequest.url, req => req.passthrough())); + const response = await proxyEndpointRequest; + + expect(response.body).toStrictEqual({}); + expect(authStrategy.getCredential).toHaveBeenCalledWith( + expect.objectContaining({ + authMetadata: expect.objectContaining({ + 'custom-key': 'custom-value', + }), + }), + expect.anything(), ); }); }); - describe('get /.well-known/backstage/permissions/metadata', () => { - it('lists permissions supported by the kubernetes plugin', async () => { - const response = await request(app).get( - '/api/kubernetes/.well-known/backstage/permissions/metadata', - ); - - expect(response.status).toEqual(200); - expect(response.body).toMatchObject({ - permissions: [ - { - type: 'basic', - name: 'kubernetes.proxy', - attributes: {}, - }, + it('forbids custom auth strategies with dashes', () => { + const throwError = () => + startTestBackend({ + features: [ + import('@backstage/plugin-kubernetes-backend/alpha'), + createBackendModule({ + pluginId: 'kubernetes', + moduleId: 'testAuthStrategy', + register(env) { + env.registerInit({ + deps: { extension: kubernetesAuthStrategyExtensionPoint }, + async init({ extension }) { + extension.addAuthStrategy('custom-strategy', { + getCredential: jest + .fn< + Promise, + [ClusterDetails, KubernetesRequestAuth] + >() + .mockResolvedValue({ type: 'anonymous' }), + validateCluster: jest.fn().mockReturnValue([]), + presentAuthMetadata: jest.fn().mockReturnValue({}), + }); + }, + }); + }, + }), ], - rules: [], }); + return expect(throwError).rejects.toThrow( + 'Strategy name can not include dashes', + ); + }); + + it('serves permission integration endpoint', async () => { + const response = await request(app).get( + '/api/kubernetes/.well-known/backstage/permissions/metadata', + ); + + expect(response.status).toEqual(200); + expect(response.body).toMatchObject({ + permissions: [ + { type: 'basic', name: 'kubernetes.proxy', attributes: {} }, + ], + rules: [], }); }); + + it('fails when an unsupported serviceLocator type is specified', () => { + return expect(() => + startTestBackend({ + features: [ + mockServices.rootConfig.factory({ + data: { + kubernetes: { + serviceLocatorMethod: { type: 'unsupported' }, + clusterLocatorMethods: [{ type: 'config', clusters: [] }], + }, + }, + }), + import('@backstage/plugin-kubernetes-backend/alpha'), + ], + }), + ).rejects.toThrow( + 'Unsupported kubernetes.serviceLocatorMethod "unsupported"', + ); + }); }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts index c1ff4688e7..81cc3d471d 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts @@ -29,7 +29,6 @@ import { Logger } from 'winston'; import { getCombinedClusterSupplier } from '../cluster-locator'; import { - AuthenticationStrategy, AnonymousStrategy, DispatchStrategy, GoogleStrategy, @@ -45,17 +44,19 @@ import { addResourceRoutesToRouter } from '../routes/resourcesRoutes'; import { MultiTenantServiceLocator } from '../service-locator/MultiTenantServiceLocator'; import { SingleTenantServiceLocator } from '../service-locator/SingleTenantServiceLocator'; import { - CustomResource, - KubernetesFetcher, KubernetesObjectsProviderOptions, - KubernetesObjectTypes, - KubernetesServiceLocator, ObjectsByEntityRequest, ServiceLocatorMethod, } from '../types/types'; import { + AuthenticationStrategy, + AuthMetadata, + CustomResource, KubernetesClustersSupplier, + KubernetesFetcher, KubernetesObjectsProvider, + KubernetesObjectTypes, + KubernetesServiceLocator, } from '@backstage/plugin-kubernetes-node'; import { DEFAULT_OBJECTS, @@ -288,7 +289,7 @@ export class KubernetesBuilder { break; default: throw new Error( - `Unsupported kubernetes.clusterLocatorMethod "${method}"`, + `Unsupported kubernetes.serviceLocatorMethod "${method}"`, ); } @@ -369,11 +370,20 @@ export class KubernetesBuilder { items: clusterDetails.map(cd => { const oidcTokenProvider = cd.authMetadata[ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER]; + const authProvider = + cd.authMetadata[ANNOTATION_KUBERNETES_AUTH_PROVIDER]; + const strategy = this.getAuthStrategyMap()[authProvider]; + let auth: AuthMetadata = {}; + if (strategy) { + auth = strategy.presentAuthMetadata(cd.authMetadata); + } + return { name: cd.name, dashboardUrl: cd.dashboardUrl, - authProvider: cd.authMetadata[ANNOTATION_KUBERNETES_AUTH_PROVIDER], + authProvider, ...(oidcTokenProvider && { oidcTokenProvider }), + ...(auth && Object.keys(auth).length !== 0 && { auth }), }; }), }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts index 1faf2f0673..a50d0b37a2 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts @@ -196,6 +196,7 @@ describe('KubernetesFanOutHandler', () => { >() .mockResolvedValue({ type: 'anonymous' }), validateCluster: jest.fn().mockReturnValue([]), + presentAuthMetadata: jest.fn(), }, config, }); @@ -1147,6 +1148,7 @@ describe('KubernetesFanOutHandler', () => { >() .mockResolvedValue({ type: 'bearer token', token: 'token' }), validateCluster: jest.fn().mockReturnValue([]), + presentAuthMetadata: jest.fn(), }, config, }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts index e388589e74..3b435fad74 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFetcher.test.ts @@ -812,6 +812,129 @@ describe('KubernetesFetcher', () => { const [[{ agent }]] = httpsRequest.mock.calls; expect(agent.options.rejectUnauthorized).toBe(false); }); + + it('fetchObjectsForService authenticates with k8s using x509 client cert from authentication strategy', async () => { + worker.use( + rest.get('https://localhost:9999/api/v1/pods', (req, res, ctx) => + res( + checkToken(req, ctx, 'token'), + withLabels(req, ctx, { + items: [{ metadata: { name: 'pod-name' } }], + }), + ), + ), + ); + + const myCert = 'MOCKCert'; + const myKey = 'MOCKKey'; + + const result = sut.fetchObjectsForService({ + serviceId: 'some-service', + clusterDetails: { + name: 'cluster1', + url: 'https://localhost:9999', + authMetadata: {}, + caData: 'MOCKCA', + }, + credential: { + type: 'x509 client certificate', + cert: myCert, + key: myKey, + }, + objectTypesToFetch: new Set([ + { + group: '', + apiVersion: 'v1', + plural: 'pods', + objectType: 'pods', + }, + ]), + labelSelector: '', + customResources: [], + }); + + await expect(result).rejects.toThrow(/PEM/); + + expect(httpsRequest).toHaveBeenCalledTimes(1); + const [[{ agent }]] = httpsRequest.mock.calls; + expect(agent.options.ca.toString('base64')).toMatch('MOCKCA'); + expect(agent.options.cert).toEqual(myCert); + expect(agent.options.key).toEqual(myKey); + }); + + it('fetchPodMetricsByNamespaces authenticates with k8s using x509 client cert from authentication strategy', async () => { + worker.use( + rest.get( + 'https://localhost:9999/api/v1/namespaces/:namespace/pods', + (req, res, ctx) => + res( + withLabels(req, ctx, { + items: [ + { + metadata: { name: 'pod-name' }, + spec: { + containers: [ + { + name: 'container-name', + resources: { + requests: { cpu: '500m', memory: '512M' }, + limits: { cpu: '1000m', memory: '1G' }, + }, + }, + ], + }, + }, + ], + }), + ), + ), + rest.get( + 'https://localhost:9999/apis/metrics.k8s.io/v1beta1/namespaces/:namespace/pods', + (req, res, ctx) => + res( + withLabels(req, ctx, { + items: [ + { + metadata: { name: 'pod-name' }, + containers: [ + { + name: 'container-name', + usage: { cpu: '0', memory: '0' }, + }, + ], + }, + ], + }), + ), + ), + ); + + const myCert = 'MOCKCert'; + const myKey = 'MOCKKey'; + + const result = sut.fetchPodMetricsByNamespaces( + { + name: 'cluster1', + url: 'https://localhost:9999', + authMetadata: {}, + caData: 'MOCKCA', + }, + { + type: 'x509 client certificate', + cert: myCert, + key: myKey, + }, + new Set(['ns-a']), + ); + + await expect(result).rejects.toThrow(/PEM/); + + expect(httpsRequest).toHaveBeenCalledTimes(2); + const [[{ agent }]] = httpsRequest.mock.calls; + expect(agent.options.ca.toString('base64')).toMatch('MOCKCA'); + expect(agent.options.cert).toEqual(myCert); + expect(agent.options.key).toEqual(myKey); + }); }); it('should use namespace if provided', async () => { @@ -895,7 +1018,7 @@ describe('KubernetesFetcher', () => { customResources: [], }); return expect(result).rejects.toThrow( - "no bearer token for cluster 'unauthenticated-cluster' and not running in Kubernetes", + "no bearer token or client cert for cluster 'unauthenticated-cluster' and not running in Kubernetes", ); }); }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts index 99501c48c6..b7354d54d4 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts @@ -216,21 +216,15 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { let requestInit: RequestInit; const authProvider = clusterDetails.authMetadata[ANNOTATION_KUBERNETES_AUTH_PROVIDER]; - if ( - authProvider === 'serviceAccount' && - !clusterDetails.authMetadata.serviceAccountToken && - fs.pathExistsSync(Config.SERVICEACCOUNT_CA_PATH) - ) { + + if (this.isServiceAccountAuthentication(authProvider, clusterDetails)) { [url, requestInit] = this.fetchArgsInCluster(credential); - } else if ( - credential.type === 'bearer token' || - authProvider === 'localKubectlProxy' - ) { + } else if (!this.isCredentialMissing(authProvider, credential)) { [url, requestInit] = this.fetchArgs(clusterDetails, credential); } else { return Promise.reject( new Error( - `no bearer token for cluster '${clusterDetails.name}' and not running in Kubernetes`, + `no bearer token or client cert for cluster '${clusterDetails.name}' and not running in Kubernetes`, ), ); } @@ -248,6 +242,26 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { return fetch(url, requestInit); } + private isServiceAccountAuthentication( + authProvider: string, + clusterDetails: ClusterDetails, + ) { + return ( + authProvider === 'serviceAccount' && + !clusterDetails.authMetadata.serviceAccountToken && + fs.pathExistsSync(Config.SERVICEACCOUNT_CA_PATH) + ); + } + + private isCredentialMissing( + authProvider: string, + credential: KubernetesCredential, + ) { + return ( + authProvider !== 'localKubectlProxy' && credential.type === 'anonymous' + ); + } + private fetchArgs( clusterDetails: ClusterDetails, credential: KubernetesCredential, @@ -272,6 +286,10 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { clusterDetails.caData, ) ?? undefined, rejectUnauthorized: !clusterDetails.skipTLSVerify, + ...(credential.type === 'x509 client certificate' && { + cert: credential.cert, + key: credential.key, + }), }); } return [url, requestInit]; diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index 9bee21867d..f2eb61e7f9 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -131,6 +131,7 @@ describe('KubernetesProxy', () => { >() .mockResolvedValue({ type: 'anonymous' }), validateCluster: jest.fn(), + presentAuthMetadata: jest.fn(), }; proxy = new KubernetesProxy({ logger, clusterSupplier, authStrategy }); permissionApi.authorize.mockResolvedValue([ @@ -514,6 +515,7 @@ describe('KubernetesProxy', () => { .fn() .mockReturnValue({ type: 'bearer token', token: 'MY_TOKEN3' }), validateCluster: jest.fn(), + presentAuthMetadata: jest.fn(), }; proxy = new KubernetesProxy({ @@ -820,6 +822,67 @@ describe('KubernetesProxy', () => { expect(ca).toMatch('MOCKCA'); }); }); + + it('should use a x509 client cert authentication strategy to consume kubeapi when backstage-kubernetes-auth field is not provided and the authStrategy enables x509 client cert authentication', async () => { + worker.use( + rest.get( + 'https://localhost:9999/api/v1/namespaces', + (req: any, res: any, ctx: any) => { + if (req.headers.get('Authorization')) { + return res(ctx.status(403)); + } + + return res( + ctx.status(200), + ctx.json({ + kind: 'NamespaceList', + apiVersion: 'v1', + items: [], + }), + ); + }, + ), + ); + + clusterSupplier.getClusters.mockResolvedValue([ + { + name: 'cluster1', + url: 'https://localhost:9999', + authMetadata: {}, + }, + ]); + + const myCert = 'MOCKCert'; + const myKey = 'MOCKKey'; + + authStrategy.getCredential.mockResolvedValue({ + type: 'x509 client certificate', + cert: myCert, + key: myKey, + }); + + const requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api/v1/namespaces', + + headers: { [HEADER_KUBERNETES_CLUSTER]: 'cluster1' }, + }); + + const response = await requestPromise; + + expect(authStrategy.getCredential).toHaveBeenCalledTimes(1); + expect(authStrategy.getCredential).toHaveBeenCalledWith( + expect.anything(), + {}, + ); + + const [[{ key, cert }]] = httpsRequest.mock.calls; + expect(cert).toEqual(myCert); + expect(key).toEqual(myKey); + + // 500 Since the key and cert are fake + expect(response.status).toEqual(500); + }); }); describe('WebSocket', () => { diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 8a07267cde..209d01b703 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -113,24 +113,6 @@ export class KubernetesProxy { return; } - const authHeader = req.header(HEADER_KUBERNETES_AUTH); - if (authHeader) { - req.headers.authorization = authHeader; - } else { - // Map Backstage-Kubernetes-Authorization-X-X headers to a KubernetesRequestAuth object - const authObj = KubernetesProxy.authHeadersToKubernetesRequestAuth( - req.headers, - ); - - const credential = await this.getClusterForRequest(req).then(cd => { - return this.authStrategy.getCredential(cd, authObj); - }); - - if (credential.type === 'bearer token') { - req.headers.authorization = `Bearer ${credential.token}`; - } - } - const middleware = await this.getMiddleware(req); // If req is an upgrade handshake, use middleware upgrade instead of http request handler https://github.com/chimurai/http-proxy-middleware#external-websocket-upgrade @@ -173,7 +155,7 @@ export class KubernetesProxy { const cluster = await this.getClusterForRequest(req); const url = new URL(cluster.url); - return { + const target: any = { protocol: url.protocol, host: url.hostname, port: url.port, @@ -182,6 +164,29 @@ export class KubernetesProxy { cluster.caData, )?.toString(), }; + + const authHeader = req.header(HEADER_KUBERNETES_AUTH); + if (authHeader) { + req.headers.authorization = authHeader; + } else { + // Map Backstage-Kubernetes-Authorization-X-X headers to a KubernetesRequestAuth object + const authObj = KubernetesProxy.authHeadersToKubernetesRequestAuth( + req.headers, + ); + + const credential = await this.getClusterForRequest(req).then(cd => { + return this.authStrategy.getCredential(cd, authObj); + }); + + if (credential.type === 'bearer token') { + req.headers.authorization = `Bearer ${credential.token}`; + } else if (credential.type === 'x509 client certificate') { + target.key = credential.key; + target.cert = credential.cert; + } + } + + return target; }, onError: (error, req, res) => { const wrappedError = new ForwardedError( diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index ac741897f4..e24b987e07 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.5 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-kubernetes-react@0.2.1 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.0.5-next.1 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 9f0e4c333f..cf4d5abdea 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-cluster", "description": "A Backstage plugin that shows details of Kubernetes clusters", - "version": "0.0.5-next.1", + "version": "0.0.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 725c5f7887..c49d14f2a8 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes-common +## 0.7.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/catalog-model@1.4.3 + - @backstage/types@1.1.1 + ## 0.7.3-next.0 ### Patch Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index e9f746f41a..994c8e3f88 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-common", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", - "version": "0.7.3-next.0", + "version": "0.7.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-node/CHANGELOG.md b/plugins/kubernetes-node/CHANGELOG.md index c7853c2c2f..1de200a3f3 100644 --- a/plugins/kubernetes-node/CHANGELOG.md +++ b/plugins/kubernetes-node/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-kubernetes-node +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/catalog-model@1.4.3 + - @backstage/types@1.1.1 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/kubernetes-node/api-report.md b/plugins/kubernetes-node/api-report.md index 2272035742..7afac72574 100644 --- a/plugins/kubernetes-node/api-report.md +++ b/plugins/kubernetes-node/api-report.md @@ -25,6 +25,8 @@ export interface AuthenticationStrategy { authConfig: KubernetesRequestAuth, ): Promise; // (undocumented) + presentAuthMetadata(authMetadata: AuthMetadata): AuthMetadata; + // (undocumented) validateCluster(authMetadata: AuthMetadata): Error[]; } @@ -100,6 +102,11 @@ export type KubernetesCredential = type: 'bearer token'; token: string; } + | { + type: 'x509 client certificate'; + cert: string; + key: string; + } | { type: 'anonymous'; }; diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index 8047b9fafa..317f75063d 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-node", "description": "Node.js library for the kubernetes plugin", - "version": "0.1.3-next.1", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-node/src/types/types.ts b/plugins/kubernetes-node/src/types/types.ts index a0f48d0c26..d7b2b67265 100644 --- a/plugins/kubernetes-node/src/types/types.ts +++ b/plugins/kubernetes-node/src/types/types.ts @@ -139,6 +139,7 @@ export interface KubernetesClustersSupplier { */ export type KubernetesCredential = | { type: 'bearer token'; token: string } + | { type: 'x509 client certificate'; cert: string; key: string } | { type: 'anonymous' }; /** @@ -151,6 +152,7 @@ export interface AuthenticationStrategy { authConfig: KubernetesRequestAuth, ): Promise; validateCluster(authMetadata: AuthMetadata): Error[]; + presentAuthMetadata(authMetadata: AuthMetadata): AuthMetadata; } /** diff --git a/plugins/kubernetes-react/CHANGELOG.md b/plugins/kubernetes-react/CHANGELOG.md index 17f96217c4..12e4f42147 100644 --- a/plugins/kubernetes-react/CHANGELOG.md +++ b/plugins/kubernetes-react/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-kubernetes-react +## 0.2.1 + +### Patch Changes + +- d5d2c67: Add `authuser` search parameter to GKE cluster link formatter in k8s plugin + + Thanks to this, people with multiple simultaneously logged-in accounts in their GCP console will automatically view objects with the same email as the one signed in to the Google auth provider in Backstage. + +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + ## 0.2.1-next.1 ### Patch Changes diff --git a/plugins/kubernetes-react/config.d.ts b/plugins/kubernetes-react/config.d.ts new file mode 100644 index 0000000000..2d2b790d05 --- /dev/null +++ b/plugins/kubernetes-react/config.d.ts @@ -0,0 +1,31 @@ +import { PodExecTerminal } from './src/components/PodExecTerminal/PodExecTerminal'; +/* + * 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 { + kubernetes?: { + /** + * Pod Exec Terminal config + */ + podExecTerminal?: { + /** + * Enable `PodExecTerminal` UI feature + * @visibility frontend + */ + enabled?: boolean; + }; + }; +} diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 75a832876b..d85cb7ba35 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-react", "description": "Web library for the kubernetes-react plugin", - "version": "0.2.1-next.1", + "version": "0.2.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -14,6 +14,7 @@ "role": "web-library" }, "sideEffects": false, + "configSchema": "config.d.ts", "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", @@ -60,6 +61,7 @@ "msw": "^1.3.1" }, "files": [ - "dist" + "dist", + "config.d.ts" ] } diff --git a/plugins/kubernetes-react/src/api/KubernetesBackendClient.test.ts b/plugins/kubernetes-react/src/api/KubernetesBackendClient.test.ts index fd999ab335..0535e404f6 100644 --- a/plugins/kubernetes-react/src/api/KubernetesBackendClient.test.ts +++ b/plugins/kubernetes-react/src/api/KubernetesBackendClient.test.ts @@ -448,6 +448,9 @@ describe('KubernetesBackendClient', () => { const response = await backendClient.proxy(request); await expect(response.json()).resolves.toStrictEqual(nsResponse); + expect(kubernetesAuthProvidersApi.getCredentials).toHaveBeenCalledWith( + 'oidc.okta', + ); }); it('hits the /proxy API with serviceAccount as auth provider', async () => { @@ -495,6 +498,42 @@ describe('KubernetesBackendClient', () => { const response = await backendClient.proxy(request); await expect(response.json()).resolves.toStrictEqual(nsResponse); + expect(kubernetesAuthProvidersApi.getCredentials).toHaveBeenCalledWith( + 'serviceAccount', + ); + }); + + it('ignores oidcTokenProvider for non-oidc auth provider', async () => { + worker.use( + rest.get( + 'http://localhost:1234/api/kubernetes/clusters', + (_, res, ctx) => + res( + ctx.json({ + items: [ + { + name: 'cluster-a', + authProvider: 'not oidc', + oidcTokenProvider: 'should be ignored', + }, + ], + }), + ), + ), + rest.get( + 'http://localhost:1234/api/kubernetes/proxy/api/v1/namespaces', + (_, res, ctx) => res(ctx.json([])), + ), + ); + + await backendClient.proxy({ + clusterName: 'cluster-a', + path: '/api/v1/namespaces', + }); + + expect(kubernetesAuthProvidersApi.getCredentials).toHaveBeenCalledWith( + 'not oidc', + ); }); it('hits /proxy api when signed in as a guest', async () => { diff --git a/plugins/kubernetes-react/src/api/KubernetesBackendClient.ts b/plugins/kubernetes-react/src/api/KubernetesBackendClient.ts index a769eb088d..461b1d1ffe 100644 --- a/plugins/kubernetes-react/src/api/KubernetesBackendClient.ts +++ b/plugins/kubernetes-react/src/api/KubernetesBackendClient.ts @@ -92,8 +92,13 @@ export class KubernetesBackendClient implements KubernetesApi { private async getCredentials( authProvider: string, + oidcTokenProvider?: string, ): Promise<{ token?: string }> { - return await this.kubernetesAuthProvidersApi.getCredentials(authProvider); + return await this.kubernetesAuthProvidersApi.getCredentials( + authProvider === 'oidc' + ? `${authProvider}.${oidcTokenProvider}` + : authProvider, + ); } async getObjectsByEntity( @@ -145,7 +150,10 @@ export class KubernetesBackendClient implements KubernetesApi { const { authProvider, oidcTokenProvider } = await this.getCluster( options.clusterName, ); - const kubernetesCredentials = await this.getCredentials(authProvider); + const kubernetesCredentials = await this.getCredentials( + authProvider, + oidcTokenProvider, + ); const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/proxy${ options.path }`; diff --git a/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.tsx b/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.tsx index f8106bd011..f67d79abb8 100644 --- a/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.tsx +++ b/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.tsx @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import 'xterm'; +import 'xterm/css/xterm.css'; import { discoveryApiRef, useApi } from '@backstage/core-plugin-api'; +import { createStyles, makeStyles, Theme } from '@material-ui/core'; import React, { useEffect, useMemo, useState } from 'react'; import { Terminal } from 'xterm'; import { FitAddon } from 'xterm-addon-fit'; @@ -37,12 +38,23 @@ export interface PodExecTerminalProps { const hasSocketProtocol = (url: string | URL) => /wss?:\/\//.test(url.toString()); +const useStyles = makeStyles((theme: Theme) => + createStyles({ + podExecTerminal: { + width: '100%', + height: '100%', + '& .xterm-screen': { padding: theme.spacing(1) }, + }, + }), +); + /** * Executes a `/bin/sh` process in the given pod's container and opens a terminal connected to it * * @public */ export const PodExecTerminal = (props: PodExecTerminalProps) => { + const classes = useStyles(); const { containerName, podNamespace, podName } = props; const [baseUrl, setBaseUrl] = useState(window.location.host); @@ -122,10 +134,7 @@ export const PodExecTerminal = (props: PodExecTerminalProps) => {
); }; diff --git a/plugins/kubernetes-react/src/components/Pods/PodDrawer/ContainerCard.tsx b/plugins/kubernetes-react/src/components/Pods/PodDrawer/ContainerCard.tsx index db70f92160..592a93e3ea 100644 --- a/plugins/kubernetes-react/src/components/Pods/PodDrawer/ContainerCard.tsx +++ b/plugins/kubernetes-react/src/components/Pods/PodDrawer/ContainerCard.tsx @@ -27,6 +27,7 @@ import { IContainer, IContainerStatus } from 'kubernetes-models/v1'; import { DateTime } from 'luxon'; import React from 'react'; +import { useIsPodExecTerminalEnabled } from '../../../hooks'; import { bytesToMiB, formatMillicores } from '../../../utils/resources'; import { PodExecTerminalDialog } from '../../PodExecTerminal/PodExecTerminalDialog'; import { ResourceUtilization } from '../../ResourceUtilization'; @@ -108,6 +109,8 @@ export const ContainerCard: React.FC = ({ containerStatus, containerMetrics, }: ContainerCardProps) => { + const isPodExecTerminalEnabled = useIsPodExecTerminalEnabled(); + // This should never be undefined if (containerSpec === undefined) { return error reading pod from cluster; @@ -228,12 +231,14 @@ export const ContainerCard: React.FC = ({ ...podScope, }} /> - + {isPodExecTerminalEnabled && ( + + )} ); diff --git a/plugins/kubernetes-react/src/hooks/index.ts b/plugins/kubernetes-react/src/hooks/index.ts index 141bc3815b..2bc519d69a 100644 --- a/plugins/kubernetes-react/src/hooks/index.ts +++ b/plugins/kubernetes-react/src/hooks/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +export * from './useIsPodExecTerminalEnabled'; export * from './useIsPodExecTerminalSupported'; export * from './useKubernetesObjects'; export * from './useCustomResources'; diff --git a/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalEnabled.test.tsx b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalEnabled.test.tsx new file mode 100644 index 0000000000..84e75ce529 --- /dev/null +++ b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalEnabled.test.tsx @@ -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 { ConfigReader } from '@backstage/core-app-api'; +import { configApiRef } from '@backstage/core-plugin-api'; +import { TestApiProvider } from '@backstage/test-utils'; +import { renderHook } from '@testing-library/react'; +import { PropsWithChildren } from 'react'; +import React from 'react'; + +import { useIsPodExecTerminalEnabled } from './useIsPodExecTerminalEnabled'; + +describe('useIsPodExecTerminalEnabled', () => { + let isPodExecTerminalEnabled: boolean | undefined; + + const apiWrapper = ({ children }: PropsWithChildren) => ( + + {children} + + ); + + it.each([ + { + condition: 'missing config', + returnValue: undefined, + }, + { condition: 'disabled', returnValue: false }, + { + condition: 'enabled', + returnValue: true, + }, + ])('Should return $returnValue if $condition', async ({ returnValue }) => { + isPodExecTerminalEnabled = returnValue; + + const { result } = renderHook(() => useIsPodExecTerminalEnabled(), { + wrapper: apiWrapper, + }); + + expect(result.current).toEqual(returnValue); + }); +}); diff --git a/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalEnabled.ts b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalEnabled.ts new file mode 100644 index 0000000000..7598e1c570 --- /dev/null +++ b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalEnabled.ts @@ -0,0 +1,27 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { configApiRef, useApi } from '@backstage/core-plugin-api'; + +/** + * Check if conditions for a pod exec call through the proxy endpoint are met + * + * @internal + */ +export const useIsPodExecTerminalEnabled = (): boolean | undefined => { + const configApi = useApi(configApiRef); + + return configApi.getOptionalBoolean('kubernetes.podExecTerminal.enabled'); +}; diff --git a/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.test.ts b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.test.ts index 93bfb6dd4d..c4df347c6f 100644 --- a/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.test.ts +++ b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.test.ts @@ -20,7 +20,7 @@ import { useIsPodExecTerminalSupported } from './useIsPodExecTerminalSupported'; jest.mock('@backstage/core-plugin-api'); -describe('useIsClusterShellEnabled', () => { +describe('useIsPodExecTerminalSupported', () => { let clusters: { authProvider: string }[] = []; beforeEach(() => { diff --git a/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.ts b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.ts index e881951059..2483bb9412 100644 --- a/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.ts +++ b/plugins/kubernetes-react/src/hooks/useIsPodExecTerminalSupported.ts @@ -15,6 +15,7 @@ */ import { useApi } from '@backstage/core-plugin-api'; import useAsync, { AsyncState } from 'react-use/lib/useAsync'; + import { kubernetesApiRef } from '../api/types'; /** diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 5f50c92d57..6f2cc8a23d 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-kubernetes +## 0.11.4 + +### Patch Changes + +- d5d2c67: Add `authuser` search parameter to GKE cluster link formatter in k8s plugin + + Thanks to this, people with multiple simultaneously logged-in accounts in their GCP console will automatically view objects with the same email as the one signed in to the Google auth provider in Backstage. + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-kubernetes-react@0.2.1 + - @backstage/plugin-kubernetes-common@0.7.3 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.11.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.11.4-next.1 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 555f3a43a2..858cc7a3c4 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.11.4-next.1", + "version": "0.11.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse-backend/CHANGELOG.md b/plugins/lighthouse-backend/CHANGELOG.md index 273aa94604..c41667aab4 100644 --- a/plugins/lighthouse-backend/CHANGELOG.md +++ b/plugins/lighthouse-backend/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-lighthouse-backend +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-lighthouse-common@0.1.4 + +## 0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.4.1-next.1 ### Patch Changes diff --git a/plugins/lighthouse-backend/package.json b/plugins/lighthouse-backend/package.json index 6556e5f7c0..ac9c844456 100644 --- a/plugins/lighthouse-backend/package.json +++ b/plugins/lighthouse-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-backend", "description": "Backend functionalities for lighthouse", - "version": "0.4.1-next.1", + "version": "0.4.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index d3565b2fbe..92d919b657 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-lighthouse +## 0.4.14 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-lighthouse-common@0.1.4 + +## 0.4.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.4.14-next.1 ### Patch Changes diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index f8c519bcc1..b71039ce2e 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse", "description": "A Backstage plugin that integrates towards Lighthouse", - "version": "0.4.14-next.1", + "version": "0.4.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist-backend/CHANGELOG.md b/plugins/linguist-backend/CHANGELOG.md index 4c3609c806..439c15066a 100644 --- a/plugins/linguist-backend/CHANGELOG.md +++ b/plugins/linguist-backend/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-linguist-backend +## 0.5.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-linguist-common@0.1.2 + +## 0.5.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.5.6-next.1 ### Patch Changes diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json index 00c07ef5d3..6f137ad5f6 100644 --- a/plugins/linguist-backend/package.json +++ b/plugins/linguist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist-backend", - "version": "0.5.6-next.1", + "version": "0.5.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist/.eslintrc.js b/plugins/linguist/.eslintrc.js index e2a53a6ad2..e487f765b2 100644 --- a/plugins/linguist/.eslintrc.js +++ b/plugins/linguist/.eslintrc.js @@ -1 +1,5 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/plugins/linguist/CHANGELOG.md b/plugins/linguist/CHANGELOG.md index 21684e7b6d..7e96d237e6 100644 --- a/plugins/linguist/CHANGELOG.md +++ b/plugins/linguist/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-linguist +## 0.1.14 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- 4f42918: Added alpha support for the New Frontend System (Declarative Integration) +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-linguist-common@0.1.2 + +## 0.1.14-next.2 + +### Patch Changes + +- 4f42918: Added alpha support for the New Frontend System (Declarative Integration) +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/linguist/package.json b/plugins/linguist/package.json index 97b2846ee0..ed38f881de 100644 --- a/plugins/linguist/package.json +++ b/plugins/linguist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist", - "version": "0.1.14-next.1", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist/src/components/LinguistCard/LinguistCard.tsx b/plugins/linguist/src/components/LinguistCard/LinguistCard.tsx index 6014487d30..6a07a958c2 100644 --- a/plugins/linguist/src/components/LinguistCard/LinguistCard.tsx +++ b/plugins/linguist/src/components/LinguistCard/LinguistCard.tsx @@ -14,15 +14,12 @@ * limitations under the License. */ -import { - Box, - Chip, - Tooltip, - Typography, - makeStyles, - Grid, - useTheme, -} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import Chip from '@material-ui/core/Chip'; +import Tooltip from '@material-ui/core/Tooltip'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; +import { makeStyles, useTheme } from '@material-ui/core/styles'; import { InfoCard, Progress } from '@backstage/core-components'; import Alert from '@material-ui/lab/Alert'; import { DateTime } from 'luxon'; diff --git a/plugins/microsoft-calendar/CHANGELOG.md b/plugins/microsoft-calendar/CHANGELOG.md index f8c0239398..86ea39fcff 100644 --- a/plugins/microsoft-calendar/CHANGELOG.md +++ b/plugins/microsoft-calendar/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-microsoft-calendar +## 0.1.11 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/errors@1.2.3 + ## 0.1.11-next.1 ### Patch Changes diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json index 8ccff05f5b..aec094c029 100644 --- a/plugins/microsoft-calendar/package.json +++ b/plugins/microsoft-calendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-microsoft-calendar", - "version": "0.1.11-next.1", + "version": "0.1.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index 0c2c496432..8b5a6e560a 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-newrelic-dashboard +## 0.3.4 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index 822ceae9bc..981441b479 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.3.4-next.1", + "version": "0.3.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md index dfe4f86fb9..8935f6c619 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-newrelic +## 0.3.44 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + ## 0.3.44-next.1 ### Patch Changes diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index 28c7b48870..a67a2203d5 100644 --- a/plugins/newrelic/package.json +++ b/plugins/newrelic/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-newrelic", "description": "A Backstage plugin that integrates towards New Relic", - "version": "0.3.44-next.1", + "version": "0.3.44", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/nomad-backend/CHANGELOG.md b/plugins/nomad-backend/CHANGELOG.md index 5aa055e074..786da63c37 100644 --- a/plugins/nomad-backend/CHANGELOG.md +++ b/plugins/nomad-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-nomad-backend +## 0.1.11 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 0.1.11-next.1 ### Patch Changes diff --git a/plugins/nomad-backend/package.json b/plugins/nomad-backend/package.json index 1ae8e124dd..d206b12398 100644 --- a/plugins/nomad-backend/package.json +++ b/plugins/nomad-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-nomad-backend", - "version": "0.1.11-next.1", + "version": "0.1.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/nomad/CHANGELOG.md b/plugins/nomad/CHANGELOG.md index 15fe3c8c81..2640dca7bc 100644 --- a/plugins/nomad/CHANGELOG.md +++ b/plugins/nomad/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-nomad +## 0.1.10 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/nomad/package.json b/plugins/nomad/package.json index f9c378f687..90df893a93 100644 --- a/plugins/nomad/package.json +++ b/plugins/nomad/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-nomad", - "version": "0.1.10-next.1", + "version": "0.1.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/octopus-deploy/CHANGELOG.md b/plugins/octopus-deploy/CHANGELOG.md index 51e22270ce..2acdc81710 100644 --- a/plugins/octopus-deploy/CHANGELOG.md +++ b/plugins/octopus-deploy/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-octopus-deploy +## 0.2.11 + +### Patch Changes + +- 7d96ba8: added install path and fixed import on plugin-octopus-deploy +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.2.11-next.2 + +### Patch Changes + +- 7d96ba8: added install path and fixed import on plugin-octopus-deploy +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.2.11-next.1 ### Patch Changes diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json index f77c1cee1c..03dd65d5e8 100644 --- a/plugins/octopus-deploy/package.json +++ b/plugins/octopus-deploy/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-octopus-deploy", - "version": "0.2.11-next.1", + "version": "0.2.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/opencost/CHANGELOG.md b/plugins/opencost/CHANGELOG.md index 01938b2d63..16d73b63d2 100644 --- a/plugins/opencost/CHANGELOG.md +++ b/plugins/opencost/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-opencost +## 0.2.4 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/opencost/package.json b/plugins/opencost/package.json index e6ab5dd553..1e1b4fb674 100644 --- a/plugins/opencost/package.json +++ b/plugins/opencost/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-opencost", - "version": "0.2.4-next.1", + "version": "0.2.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index b38003e41d..b56074f2cd 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-org-react +## 0.1.18 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.1.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.18-next.1 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 6358529fdf..07ae6b82b0 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.18-next.1", + "version": "0.1.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index d9245e5f11..c36bf88714 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-org +## 0.6.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-catalog-common@1.0.20 + +## 0.6.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.6.19-next.1 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index c4181cb09b..c4035a8498 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.6.19-next.1", + "version": "0.6.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md index 483370fc18..8e48fcf210 100644 --- a/plugins/pagerduty/CHANGELOG.md +++ b/plugins/pagerduty/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-pagerduty +## 0.7.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-home-react@0.1.7 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.7.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home-react@0.1.7-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.7.1-next.1 ### Patch Changes diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index 12f0d671d4..2526d7ca99 100644 --- a/plugins/pagerduty/package.json +++ b/plugins/pagerduty/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-pagerduty", "description": "This plugin has been deprecated, consider using [@pagerduty/backstage-plugin](https://github.com/pagerduty/backstage-plugin) instead.", - "version": "0.7.1-next.1", + "version": "0.7.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index 272792ed88..2a94efd57e 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-periskop-backend +## 0.2.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + +## 0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 0.2.7-next.1 ### Patch Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index 334f8b8fd3..992e047346 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop-backend", - "version": "0.2.7-next.1", + "version": "0.2.7", "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 d501fe7774..b29b672e96 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-periskop +## 0.1.27 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.1.27-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.27-next.1 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index da1d83c645..acb7a68241 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.27-next.1", + "version": "0.1.27", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md index 2caad57cb1..e5e4d93fa3 100644 --- a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md +++ b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-permission-backend-module-allow-all-policy +## 0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + ## 0.1.6-next.1 ### Patch Changes diff --git a/plugins/permission-backend-module-policy-allow-all/package.json b/plugins/permission-backend-module-policy-allow-all/package.json index 4e3b6291cd..f03a5481d3 100644 --- a/plugins/permission-backend-module-policy-allow-all/package.json +++ b/plugins/permission-backend-module-policy-allow-all/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-backend-module-allow-all-policy", "description": "Allow all policy backend module for the permission plugin.", - "version": "0.1.6-next.1", + "version": "0.1.6", "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 025e5f452d..43c5e85b4f 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-permission-backend +## 0.5.32 + +### Patch Changes + +- b1acd9b: Updated README +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.5.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + ## 0.5.32-next.1 ### Patch Changes diff --git a/plugins/permission-backend/README.md b/plugins/permission-backend/README.md index 59fe1730ba..b4f6124bf4 100644 --- a/plugins/permission-backend/README.md +++ b/plugins/permission-backend/README.md @@ -1,6 +1,3 @@ # @backstage/plugin-permission-backend -> NOTE: THIS PACKAGE IS EXPERIMENTAL, HERE BE DRAGONS - -Backend for Backstage authorization and permissions. For more information, see -the [authorization PRFC](https://github.com/backstage/backstage/pull/7761). +Backend for Backstage authorization and permissions. For more information, see the [permissions documentation on Backstage.io](https://backstage.io/docs/permissions/overview). diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index e619d58e9b..c8c908eccb 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.32-next.1", + "version": "0.5.32", "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 862e8db4a5..74bd6db59b 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-common +## 0.7.12 + +### Patch Changes + +- b1acd9b: Updated README +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + ## 0.7.11 ### Patch Changes diff --git a/plugins/permission-common/README.md b/plugins/permission-common/README.md index 7ba998bed5..fdb72b4be5 100644 --- a/plugins/permission-common/README.md +++ b/plugins/permission-common/README.md @@ -1,7 +1,3 @@ # @backstage/plugin-permission-common -> NOTE: THIS PACKAGE IS EXPERIMENTAL, HERE BE DRAGONS - -Isomorphic types and client for Backstage permissions and authorization. For -more information, see the [authorization -PRFC](https://github.com/backstage/backstage/pull/7761). +Isomorphic types and client for Backstage permissions and authorization. For more information, see the [permissions documentation on Backstage.io](https://backstage.io/docs/permissions/overview). diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index 2907347889..b0ca7d74bf 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.11", + "version": "0.7.12", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index a006ba04ad..5f66d4a337 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-permission-node +## 0.7.20 + +### Patch Changes + +- b1acd9b: Updated README +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.7.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.7.20-next.1 ### Patch Changes diff --git a/plugins/permission-node/README.md b/plugins/permission-node/README.md index 82dfe54f9c..39859d8f4c 100644 --- a/plugins/permission-node/README.md +++ b/plugins/permission-node/README.md @@ -1,7 +1,3 @@ # @backstage/plugin-permission-node -> NOTE: THIS PACKAGE IS EXPERIMENTAL, HERE BE DRAGONS - -Common permission and authorization utilities for backend plugins. For more -information, see the [authorization -PRFC](https://github.com/backstage/backstage/pull/7761). +Common permission and authorization utilities for backend plugins. For more information, see the [permissions documentation on Backstage.io](https://backstage.io/docs/permissions/overview). diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 320ab2b16e..5ce7217d6c 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.20-next.1", + "version": "0.7.20", "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 81be97c58f..a432970e3f 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-permission-react +## 0.4.19 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- b1acd9b: Updated README +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/config@1.1.1 + ## 0.4.19-next.1 ### Patch Changes diff --git a/plugins/permission-react/README.md b/plugins/permission-react/README.md index 72383f024d..de22b0dba0 100644 --- a/plugins/permission-react/README.md +++ b/plugins/permission-react/README.md @@ -1,5 +1,3 @@ -# permission +# @backstage/plugin-permission-react -**NOTE: THIS PACKAGE IS EXPERIMENTAL!** - -Components and hooks to help implement permissions in Backstage frontend plugins. For more information, see the [authorization PRFC](https://github.com/backstage/backstage/pull/7761). +Components and hooks to help implement permissions in Backstage frontend plugins. For more information, see the [permissions documentation on Backstage.io](https://backstage.io/docs/permissions/overview). diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index 10d0a8d3ae..7949433aa9 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.19-next.1", + "version": "0.4.19", "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 4922dab858..00e1c5be53 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-playlist-backend +## 0.3.13 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-playlist-common@0.1.14 + +## 0.3.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + ## 0.3.13-next.1 ### Patch Changes diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 18fd6ce6b5..8b872b6e67 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.13-next.1", + "version": "0.3.13", "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 3fcdbfc5bc..0b65ee551f 100644 --- a/plugins/playlist-common/CHANGELOG.md +++ b/plugins/playlist-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-playlist-common +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + ## 0.1.13 ### Patch Changes diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json index 7d42844986..9ab95c4c8a 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.13", + "version": "0.1.14", "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 50b1d5bd07..f35b2a149a 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-playlist +## 0.2.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-search-react@1.7.5 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-playlist-common@0.1.14 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index 216f0118af..34d2911685 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.2.3-next.1", + "version": "0.2.3", "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 61f35b8a19..e6649758f7 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-proxy-backend +## 0.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + +## 0.4.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 0.4.7-next.1 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 71deac06a2..1e042a1bdc 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.4.7-next.1", + "version": "0.4.7", "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 5eec383c3d..9e8b991e02 100644 --- a/plugins/puppetdb/CHANGELOG.md +++ b/plugins/puppetdb/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-puppetdb +## 0.1.12 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.12-next.1 ### Patch Changes diff --git a/plugins/puppetdb/package.json b/plugins/puppetdb/package.json index fec982800f..0d1cc3d44e 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.12-next.1", + "version": "0.1.12", "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 6d49ffc538..4c14f2c9f9 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-rollbar-backend +## 0.1.54 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config@1.1.1 + +## 0.1.54-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + ## 0.1.54-next.1 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index 843c9533f8..730bc3e6f3 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.54-next.1", + "version": "0.1.54", "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 cd99ed2246..494dce0fe9 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-rollbar +## 0.4.29 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.4.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.4.29-next.1 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index 03c0c8f4b7..a49254e366 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.29-next.1", + "version": "0.4.29", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index e279cecbfa..3f56f61339 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.1.1 + +### Patch Changes + +- d076ee4: Updated dependency `azure-devops-node-api` to `^12.0.0`. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index 6589621675..ce53811f15 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-azure", "description": "The azure module for @backstage/plugin-scaffolder-backend", - "version": "0.1.1-next.1", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md index edebcee304..c94898c953 100644 --- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket +## 0.1.1 + +### Patch Changes + +- a694f71: The Scaffolder builtin actions now contains an action for running pipelines from Bitbucket Cloud Rest API +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket/api-report.md b/plugins/scaffolder-backend-module-bitbucket/api-report.md index 8e58c5fe7e..0f5f09b5b8 100644 --- a/plugins/scaffolder-backend-module-bitbucket/api-report.md +++ b/plugins/scaffolder-backend-module-bitbucket/api-report.md @@ -8,6 +8,19 @@ import { JsonObject } from '@backstage/types'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +// @public +export const createBitbucketPipelinesRunAction: (options: { + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + workspace: string; + repo_slug: string; + body?: object | undefined; + token?: string | undefined; + }, + JsonObject +>; + // @public @deprecated export function createPublishBitbucketAction(options: { integrations: ScmIntegrationRegistry; diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json index 0564fbf389..03ebab43fc 100644 --- a/plugins/scaffolder-backend-module-bitbucket/package.json +++ b/plugins/scaffolder-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket", "description": "The bitbucket module for @backstage/plugin-scaffolder-backend", - "version": "0.1.1-next.1", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloud.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloud.ts index c69ae0b147..e9d815f5e8 100644 --- a/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloud.ts +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloud.ts @@ -25,6 +25,7 @@ import { import fetch, { Response, RequestInit } from 'node-fetch'; import { Config } from '@backstage/config'; +import { getAuthorizationHeader } from './helpers'; const createRepository = async (opts: { workspace: string; @@ -93,29 +94,6 @@ const createRepository = async (opts: { return { remoteUrl, repoContentsUrl }; }; -const getAuthorizationHeader = (config: { - username?: string; - appPassword?: string; - token?: string; -}) => { - if (config.username && config.appPassword) { - const buffer = Buffer.from( - `${config.username}:${config.appPassword}`, - 'utf8', - ); - - return `Basic ${buffer.toString('base64')}`; - } - - if (config.token) { - return `Bearer ${config.token}`; - } - - throw new Error( - `Authorization has not been provided for Bitbucket Cloud. Please add either username + appPassword to the Integrations config or a user login auth token`, - ); -}; - /** * Creates a new action that initializes a git repository of the content in the workspace * and publishes it to Bitbucket Cloud. diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.examples.test.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.examples.test.ts new file mode 100644 index 0000000000..90ae2c08b9 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.examples.test.ts @@ -0,0 +1,274 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getVoidLogger } from '@backstage/backend-common'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { PassThrough } from 'stream'; +import { createBitbucketPipelinesRunAction } from './bitbucketCloudPipelinesRun'; +import yaml from 'yaml'; +import { examples } from './bitbucketCloudPipelinesRun.examples'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; + +describe('bitbucket:pipelines:run', () => { + const config = new ConfigReader({ + integrations: { + bitbucketCloud: [ + { + username: 'u', + appPassword: 'p', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + const action = createBitbucketPipelinesRunAction({ integrations }); + const mockContext = { + input: {}, + workspacePath: 'wsp', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + const responseJson = { + repository: { + links: { + html: { href: 'https://bitbucket.org/test-workspace/test-repo-slug' }, + }, + }, + build_number: 1, + }; + const worker = setupServer(); + setupRequestMockHandlers(worker); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should trigger a pipeline for a branch', async () => { + expect.assertions(2); + worker.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/test-workspace/test-repo-slug/pipelines', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Basic dTpw'); + expect(req.body).toEqual({ + target: { + ref_type: 'branch', + type: 'pipeline_ref_target', + ref_name: 'master', + }, + }); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseJson), + ); + }, + ), + ); + const ctx = Object.assign({}, mockContext, { + input: yaml.parse(examples[0].example).steps[0].input, + }); + await action.handler(ctx); + }); + + it('should trigger a pipeline for a commit on a branch', async () => { + expect.assertions(2); + worker.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/test-workspace/test-repo-slug/pipelines', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Basic dTpw'); + expect(req.body).toEqual({ + target: { + commit: { + type: 'commit', + hash: 'ce5b7431602f7cbba007062eeb55225c6e18e956', + }, + ref_type: 'branch', + type: 'pipeline_ref_target', + ref_name: 'master', + }, + }); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseJson), + ); + }, + ), + ); + const ctx = Object.assign({}, mockContext, { + input: yaml.parse(examples[1].example).steps[0].input, + }); + await action.handler(ctx); + }); + + it('should trigger a specific pipeline definition for a commit', async () => { + expect.assertions(2); + worker.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/test-workspace/test-repo-slug/pipelines', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Basic dTpw'); + expect(req.body).toEqual({ + target: { + commit: { + type: 'commit', + hash: 'a3c4e02c9a3755eccdc3764e6ea13facdf30f923', + }, + selector: { + type: 'custom', + pattern: 'Deploy to production', + }, + type: 'pipeline_commit_target', + }, + }); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseJson), + ); + }, + ), + ); + const ctx = Object.assign({}, mockContext, { + input: yaml.parse(examples[2].example).steps[0].input, + }); + await action.handler(ctx); + }); + + it('should trigger a specific pipeline definition for a commit on a branch or tag', async () => { + expect.assertions(2); + worker.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/test-workspace/test-repo-slug/pipelines', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Basic dTpw'); + expect(req.body).toEqual({ + target: { + commit: { + type: 'commit', + hash: 'a3c4e02c9a3755eccdc3764e6ea13facdf30f923', + }, + selector: { + type: 'custom', + pattern: 'Deploy to production', + }, + type: 'pipeline_ref_target', + ref_name: 'master', + ref_type: 'branch', + }, + }); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseJson), + ); + }, + ), + ); + const ctx = Object.assign({}, mockContext, { + input: yaml.parse(examples[3].example).steps[0].input, + }); + await action.handler(ctx); + }); + + it('should trigger a custom pipeline with variables', async () => { + expect.assertions(2); + worker.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/test-workspace/test-repo-slug/pipelines', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Basic dTpw'); + expect(req.body).toEqual({ + target: { + type: 'pipeline_ref_target', + ref_name: 'master', + ref_type: 'branch', + selector: { + type: 'custom', + pattern: 'Deploy to production', + }, + }, + variables: [ + { key: 'var1key', value: 'var1value', secured: true }, + { + key: 'var2key', + value: 'var2value', + }, + ], + }); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseJson), + ); + }, + ), + ); + const ctx = Object.assign({}, mockContext, { + input: yaml.parse(examples[4].example).steps[0].input, + }); + await action.handler(ctx); + }); + + it('should trigger a pull request pipeline', async () => { + expect.assertions(2); + worker.use( + rest.post( + 'https://api.bitbucket.org/2.0/repositories/test-workspace/test-repo-slug/pipelines', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Basic dTpw'); + expect(req.body).toEqual({ + target: { + type: 'pipeline_pullrequest_target', + source: 'pull-request-branch', + destination: 'master', + destination_commit: { + hash: '9f848b7', + }, + commit: { + hash: '1a372fc', + }, + pull_request: { + id: '3', + }, + selector: { + type: 'pull-requests', + pattern: '**', + }, + }, + }); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseJson), + ); + }, + ), + ); + const ctx = Object.assign({}, mockContext, { + input: yaml.parse(examples[5].example).steps[0].input, + }); + await action.handler(ctx); + }); +}); diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.examples.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.examples.ts new file mode 100644 index 0000000000..d6255526af --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.examples.ts @@ -0,0 +1,202 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: 'Trigger a pipeline for a branch', + example: yaml.stringify({ + steps: [ + { + action: 'bitbucket:pipelines:run', + id: 'run-bitbucket-pipeline', + name: 'Run an example bitbucket pipeline', + input: { + workspace: 'test-workspace', + repo_slug: 'test-repo-slug', + body: { + target: { + ref_type: 'branch', + type: 'pipeline_ref_target', + ref_name: 'master', + }, + }, + }, + }, + ], + }), + }, + { + description: 'Trigger a pipeline for a commit on a branch', + example: yaml.stringify({ + steps: [ + { + action: 'bitbucket:pipelines:run', + id: 'run-bitbucket-pipeline', + name: 'Run an example bitbucket pipeline', + input: { + workspace: 'test-workspace', + repo_slug: 'test-repo-slug', + body: { + target: { + commit: { + type: 'commit', + hash: 'ce5b7431602f7cbba007062eeb55225c6e18e956', + }, + ref_type: 'branch', + type: 'pipeline_ref_target', + ref_name: 'master', + }, + }, + }, + }, + ], + }), + }, + { + description: 'Trigger a specific pipeline definition for a commit', + example: yaml.stringify({ + steps: [ + { + action: 'bitbucket:pipelines:run', + id: 'run-bitbucket-pipeline', + name: 'Run an example bitbucket pipeline', + input: { + workspace: 'test-workspace', + repo_slug: 'test-repo-slug', + body: { + target: { + commit: { + type: 'commit', + hash: 'a3c4e02c9a3755eccdc3764e6ea13facdf30f923', + }, + selector: { + type: 'custom', + pattern: 'Deploy to production', + }, + type: 'pipeline_commit_target', + }, + }, + }, + }, + ], + }), + }, + { + description: + 'Trigger a specific pipeline definition for a commit on a branch or tag', + example: yaml.stringify({ + steps: [ + { + action: 'bitbucket:pipelines:run', + id: 'run-bitbucket-pipeline', + name: 'Run an example bitbucket pipeline', + input: { + workspace: 'test-workspace', + repo_slug: 'test-repo-slug', + body: { + target: { + commit: { + type: 'commit', + hash: 'a3c4e02c9a3755eccdc3764e6ea13facdf30f923', + }, + selector: { + type: 'custom', + pattern: 'Deploy to production', + }, + type: 'pipeline_ref_target', + ref_name: 'master', + ref_type: 'branch', + }, + }, + }, + }, + ], + }), + }, + { + description: 'Trigger a custom pipeline with variables', + example: yaml.stringify({ + steps: [ + { + action: 'bitbucket:pipelines:run', + id: 'run-bitbucket-pipeline', + name: 'Run an example bitbucket pipeline', + input: { + workspace: 'test-workspace', + repo_slug: 'test-repo-slug', + body: { + target: { + type: 'pipeline_ref_target', + ref_name: 'master', + ref_type: 'branch', + selector: { + type: 'custom', + pattern: 'Deploy to production', + }, + }, + variables: [ + { key: 'var1key', value: 'var1value', secured: true }, + { + key: 'var2key', + value: 'var2value', + }, + ], + }, + }, + }, + ], + }), + }, + { + description: 'Trigger a pull request pipeline', + example: yaml.stringify({ + steps: [ + { + action: 'bitbucket:pipelines:run', + id: 'run-bitbucket-pipeline', + name: 'Run an example bitbucket pipeline', + input: { + workspace: 'test-workspace', + repo_slug: 'test-repo-slug', + body: { + target: { + type: 'pipeline_pullrequest_target', + source: 'pull-request-branch', + destination: 'master', + destination_commit: { + hash: '9f848b7', + }, + commit: { + hash: '1a372fc', + }, + pull_request: { + id: '3', + }, + selector: { + type: 'pull-requests', + pattern: '**', + }, + }, + }, + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.test.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.test.ts new file mode 100644 index 0000000000..dc76a79898 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.test.ts @@ -0,0 +1,156 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getVoidLogger } from '@backstage/backend-common'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { PassThrough } from 'stream'; +import { createBitbucketPipelinesRunAction } from './bitbucketCloudPipelinesRun'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; + +describe('bitbucket:pipelines:run', () => { + const config = new ConfigReader({ + integrations: { + bitbucketCloud: [ + { + username: 'u', + appPassword: 'p', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + const action = createBitbucketPipelinesRunAction({ integrations }); + const mockContext = { + input: {}, + workspacePath: 'wsp', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + const workspace = 'test-workspace'; + const repo_slug = 'test-repo-slug'; + const responseJson = { + repository: { + links: { + html: { href: 'https://bitbucket.org/test-workspace/test-repo-slug' }, + }, + }, + build_number: 1, + }; + const worker = setupServer(); + setupRequestMockHandlers(worker); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should throw if there is no integration credentials or token provided', async () => { + const configNoCreds = new ConfigReader({ + integrations: { + bitbucketCloud: [], + }, + }); + + const integrationsNoCreds = ScmIntegrations.fromConfig(configNoCreds); + const actionNoCreds = createBitbucketPipelinesRunAction({ + integrations: integrationsNoCreds, + }); + const testContext = Object.assign({}, mockContext, { + input: { workspace, repo_slug }, + }); + await expect(actionNoCreds.handler(testContext)).rejects.toThrow( + /Authorization has not been provided for Bitbucket Cloud/, + ); + }); + + it('should call the bitbucket api for running a pipeline with integration credentials', async () => { + expect.assertions(1); + worker.use( + rest.post( + `https://api.bitbucket.org/2.0/repositories/${workspace}/${repo_slug}/pipelines`, + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Basic dTpw'); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseJson), + ); + }, + ), + ); + + const testContext = Object.assign({}, mockContext, { + input: { workspace, repo_slug }, + }); + await action.handler(testContext); + }); + + it('should call the bitbucket api for running a pipeline with input token', async () => { + expect.assertions(1); + worker.use( + rest.post( + `https://api.bitbucket.org/2.0/repositories/${workspace}/${repo_slug}/pipelines`, + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Bearer abc'); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseJson), + ); + }, + ), + ); + + const testContext = Object.assign({}, mockContext, { + input: { workspace, repo_slug, token: 'abc' }, + }); + await action.handler(testContext); + }); + + it('should call outputs with the correct data', async () => { + worker.use( + rest.post( + `https://api.bitbucket.org/2.0/repositories/${workspace}/${repo_slug}/pipelines`, + (_, res, ctx) => { + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseJson), + ); + }, + ), + ); + + const testContext = Object.assign({}, mockContext, { + input: { workspace, repo_slug, token: 'abc' }, + }); + await action.handler(testContext); + expect(testContext.output).toHaveBeenCalledWith('buildNumber', 1); + expect(testContext.output).toHaveBeenCalledWith( + 'repoUrl', + 'https://bitbucket.org/test-workspace/test-repo-slug', + ); + expect(testContext.output).toHaveBeenCalledWith( + 'pipelinesUrl', + 'https://bitbucket.org/test-workspace/test-repo-slug/pipelines', + ); + }); +}); diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.ts new file mode 100644 index 0000000000..c44fdcc824 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/bitbucketCloudPipelinesRun.ts @@ -0,0 +1,117 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { examples } from './bitbucketCloudPipelinesRun.examples'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import fetch, { Response } from 'node-fetch'; +import * as inputProps from './inputProperties'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { getAuthorizationHeader } from './helpers'; + +const id = 'bitbucket:pipelines:run'; +/** + * Creates a new action that triggers a run of a bitbucket pipeline + * + * @public + */ +export const createBitbucketPipelinesRunAction = (options: { + integrations: ScmIntegrationRegistry; +}) => { + const { integrations } = options; + return createTemplateAction<{ + workspace: string; + repo_slug: string; + body?: object; + token?: string; + }>({ + id, + description: 'Run a bitbucket cloud pipeline', + examples, + schema: { + input: { + type: 'object', + required: ['workspace', 'repo_slug'], + properties: { + workspace: inputProps.workspace, + repo_slug: inputProps.repo_slug, + body: inputProps.pipelinesRunBody, + token: inputProps.token, + }, + }, + output: { + type: 'object', + properties: { + buildNumber: { + title: 'Build number', + type: 'number', + }, + repoUrl: { + title: 'A URL to the pipeline repositry', + type: 'string', + }, + repoContentsUrl: { + title: 'A URL to the pipeline', + type: 'string', + }, + }, + }, + }, + supportsDryRun: false, + async handler(ctx) { + const { workspace, repo_slug, body, token } = ctx.input; + const host = 'bitbucket.org'; + const integrationConfig = integrations.bitbucketCloud.byHost(host); + + const authorization = getAuthorizationHeader( + token ? { token } : integrationConfig!.config, + ); + let response: Response; + try { + response = await fetch( + `https://api.bitbucket.org/2.0/repositories/${workspace}/${repo_slug}/pipelines`, + { + method: 'POST', + headers: { + Authorization: authorization, + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body) ?? {}, + }, + ); + } catch (e) { + throw new Error(`Unable to run pipeline, ${e}`); + } + + if (response.status !== 201) { + throw new Error( + `Unable to run pipeline, ${response.status} ${ + response.statusText + }, ${await response.text()}`, + ); + } + + const responseObject = await response.json(); + + ctx.output('buildNumber', responseObject.build_number); + ctx.output('repoUrl', responseObject.repository.links.html.href); + ctx.output( + 'pipelinesUrl', + `${responseObject.repository.links.html.href}/pipelines`, + ); + }, + }); +}; diff --git a/plugins/scaffolder/src/legacy/MultistepJsonForm/FieldOverrides/DescriptionField.tsx b/plugins/scaffolder-backend-module-bitbucket/src/actions/helpers.ts similarity index 51% rename from plugins/scaffolder/src/legacy/MultistepJsonForm/FieldOverrides/DescriptionField.tsx rename to plugins/scaffolder-backend-module-bitbucket/src/actions/helpers.ts index eded38beee..efa6fd64f4 100644 --- a/plugins/scaffolder/src/legacy/MultistepJsonForm/FieldOverrides/DescriptionField.tsx +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/helpers.ts @@ -14,9 +14,25 @@ * limitations under the License. */ -import React from 'react'; -import { MarkdownContent } from '@backstage/core-components'; -import { FieldProps } from '@rjsf/utils'; +export const getAuthorizationHeader = (config: { + username?: string; + appPassword?: string; + token?: string; +}) => { + if (config.username && config.appPassword) { + const buffer = Buffer.from( + `${config.username}:${config.appPassword}`, + 'utf8', + ); -export const DescriptionField = ({ description }: FieldProps) => - description && ; + return `Basic ${buffer.toString('base64')}`; + } + + if (config.token) { + return `Bearer ${config.token}`; + } + + throw new Error( + `Authorization has not been provided for Bitbucket Cloud. Please add either username + appPassword to the Integrations config or a user login auth token`, + ); +}; diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/index.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/index.ts index 1093b07785..9b009255fd 100644 --- a/plugins/scaffolder-backend-module-bitbucket/src/actions/index.ts +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/index.ts @@ -17,3 +17,4 @@ export * from './bitbucket'; export * from './bitbucketCloud'; export * from './bitbucketServer'; export * from './bitbucketServerPullRequest'; +export { createBitbucketPipelinesRunAction } from './bitbucketCloudPipelinesRun'; diff --git a/plugins/scaffolder-backend-module-bitbucket/src/actions/inputProperties.ts b/plugins/scaffolder-backend-module-bitbucket/src/actions/inputProperties.ts new file mode 100644 index 0000000000..d37426e982 --- /dev/null +++ b/plugins/scaffolder-backend-module-bitbucket/src/actions/inputProperties.ts @@ -0,0 +1,155 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const workspace = { + title: 'Workspace', + description: `The workspace name`, + type: 'string', +}; + +const repo_slug = { + title: 'Repository name', + description: 'The repository name', + type: 'string', +}; + +const ref_type = { + title: 'ref_type', + type: 'string', +}; + +const type = { + title: 'type', + type: 'string', +}; + +const ref_name = { + title: 'ref_name', + type: 'string', +}; +const source = { + title: 'source', + type: 'string', +}; +const destination = { + title: 'destination', + type: 'string', +}; +const hash = { + title: 'hash', + type: 'string', +}; + +const pattern = { + title: 'pattern', + type: 'string', +}; + +const id = { + title: 'id', + type: 'string', +}; + +const key = { + title: 'key', + type: 'string', +}; +const value = { + title: 'value', + type: 'string', +}; +const secured = { + title: 'secured', + type: 'boolean', +}; + +const token = { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to BitBucket Cloud', +}; + +const destination_commit = { + title: 'destination_commit', + type: 'object', + properties: { + hash, + }, +}; + +const commit = { + title: 'commit', + type: 'object', + properties: { + type, + hash, + }, +}; + +const selector = { + title: 'selector', + type: 'object', + properties: { + type, + pattern, + }, +}; + +const pull_request = { + title: 'pull_request', + type: 'object', + properties: { + id, + }, +}; + +const pipelinesRunBody = { + title: 'Request Body', + description: + 'Request body properties: see Bitbucket Cloud Rest API documentation for more details', + type: 'object', + properties: { + target: { + title: 'target', + type: 'object', + properties: { + ref_type, + type, + ref_name, + source, + destination, + destination_commit, + commit, + selector, + pull_request, + }, + }, + variables: { + title: 'variables', + type: 'array', + items: { + type: 'object', + properties: { + key, + value, + secured, + }, + }, + }, + }, +}; + +export { workspace, repo_slug, pipelinesRunBody, token }; diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index 8ea73ffba3..075d8db3b9 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.2.10 + +### Patch Changes + +- 7acbb5a: Removed `mock-fs` dev dependency. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + ## 0.2.10-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 06be2562c4..2f0bd5188c 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.2.10-next.1", + "version": "0.2.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 3b5bb69dec..541255a2d0 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.33 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + +## 0.2.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + ## 0.2.33-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 1f598f9a8f..98e96a491d 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.33-next.1", + "version": "0.2.33", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md index 1ced6ce62d..361549275a 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index 878eb6c36c..59159560b5 100644 --- a/plugins/scaffolder-backend-module-gerrit/package.json +++ b/plugins/scaffolder-backend-module-gerrit/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gerrit", "description": "The gerrit module for @backstage/plugin-scaffolder-backend", - "version": "0.1.1-next.1", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md index 10b3907e99..0f0ce0a045 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.1.1 + +### Patch Changes + +- 5470300: Ensure `teamReviewers` list is unique before calling API +- bf92ae3: Updated dependency `octokit` to `^3.0.0`. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index 25dfb654b6..b035096dad 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-github", "description": "The github module for @backstage/plugin-scaffolder-backend", - "version": "0.1.1-next.1", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts index 23ac4bda45..c5b1038a01 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts @@ -377,7 +377,7 @@ describe('createPublishGithubPullRequestAction', () => { branchName: 'new-app', description: 'This PR is really good', reviewers: ['foobar'], - teamReviewers: ['team-foo'], + teamReviewers: ['team-foo', 'team-foo', 'team-bar'], }; mockDir.setContent({ [workspacePath]: {} }); @@ -401,7 +401,7 @@ describe('createPublishGithubPullRequestAction', () => { repo: 'myrepo', pull_number: 123, reviewers: ['foobar'], - team_reviewers: ['team-foo'], + team_reviewers: ['team-foo', 'team-bar'], }); }); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts index 0763d4a474..2d8dc7ce8d 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts @@ -372,7 +372,7 @@ export const createPublishGithubPullRequestAction = ( repo: pr.repo, pull_number: pr.number, reviewers, - team_reviewers: teamReviewers, + team_reviewers: teamReviewers ? [...new Set(teamReviewers)] : undefined, }); const addedUsers = result.data.requested_reviewers?.join(', ') ?? ''; const addedTeams = result.data.requested_teams?.join(', ') ?? ''; diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index f8c32ffb5e..9c7d462cda 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.2.12 + +### Patch Changes + +- 604c9dd: Add Scaffolder custom action that creates GitLab issues called `gitlab:issues:create` +- 7c522c5: Add `gitlab:repo:push` scaffolder action to push files to arbitrary branch without creating a Merge Request +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + ## 0.2.12-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/README.md b/plugins/scaffolder-backend-module-gitlab/README.md index 340b57bbf8..c946c8b476 100644 --- a/plugins/scaffolder-backend-module-gitlab/README.md +++ b/plugins/scaffolder-backend-module-gitlab/README.md @@ -24,6 +24,7 @@ import { createGitlabProjectDeployTokenAction, createGitlabProjectVariableAction, createGitlabGroupEnsureExistsAction, + createGitlabIssueAction, } from '@backstage/plugin-scaffolder-backend-module-gitlab'; // Create BuiltIn Actions @@ -41,6 +42,7 @@ const actions = [ createGitlabProjectDeployTokenAction({ integrations: integrations }), createGitlabProjectVariableAction({ integrations: integrations }), createGitlabGroupEnsureExistsAction({ integrations: integrations }), + createGitlabIssueAction({ integrations: integrations }), ]; // Create Scaffolder Router @@ -160,8 +162,26 @@ spec: repoContentsUrl: ${{ steps['publish'].output.repoContentsUrl }} catalogInfoPath: '/catalog-info.yaml' + - id: gitlabIssue + name: Issues + action: gitlab:issues:create + input: + repoUrl: ${{ parameters.repoUrl }} + token: ${{ secrets.USER_OAUTH_TOKEN }} + projectId: 1111111 + title: Test Issue + assignees: + - 2222222 + description: This is the description of the issue + confidential: true + createdAt: 2022-09-27 18:00:00.000 + dueDate: 2024-09-28 12:00:00.000 + epicId: 3333333 + labels: phase1:label1,phase2:label2 output: links: - title: Repository url: ${{ steps['publish'].output.remoteUrl }} + - title: Link to new issue + url: ${{ steps['gitlabIssue'].output.issueUrl }} ``` diff --git a/plugins/scaffolder-backend-module-gitlab/api-report.md b/plugins/scaffolder-backend-module-gitlab/api-report.md index debc31412a..9b3eec5cdf 100644 --- a/plugins/scaffolder-backend-module-gitlab/api-report.md +++ b/plugins/scaffolder-backend-module-gitlab/api-report.md @@ -22,6 +22,34 @@ export const createGitlabGroupEnsureExistsAction: (options: { } >; +// @public +export const createGitlabIssueAction: (options: { + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + title: string; + repoUrl: string; + projectId: number; + token?: string | undefined; + assignees?: number[] | undefined; + confidential?: boolean | undefined; + description?: string | undefined; + createdAt?: string | undefined; + dueDate?: string | undefined; + discussionToResolve?: string | undefined; + epicId?: number | undefined; + labels?: string | undefined; + issueType?: IssueType | undefined; + mergeRequestToResolveDiscussionsOf?: number | undefined; + milestoneId?: number | undefined; + weight?: number | undefined; + }, + { + issueUrl: string; + issueId: number; + } +>; + // @public export const createGitlabProjectAccessTokenAction: (options: { integrations: ScmIntegrationRegistry; @@ -76,6 +104,22 @@ export const createGitlabProjectVariableAction: (options: { JsonObject >; +// @public +export const createGitlabRepoPushAction: (options: { + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + repoUrl: string; + branchName: string; + commitMessage: string; + sourcePath?: string | undefined; + targetPath?: string | undefined; + token?: string | undefined; + commitAction?: 'update' | 'delete' | 'create' | undefined; + }, + JsonObject +>; + // @public export function createPublishGitlabAction(options: { integrations: ScmIntegrationRegistry; @@ -146,4 +190,14 @@ export const createPublishGitlabMergeRequestAction: (options: { }, JsonObject >; + +// @public +export enum IssueType { + // (undocumented) + INCIDENT = 'incident', + // (undocumented) + ISSUE = 'issue', + // (undocumented) + TEST = 'test_case', +} ``` diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index 2025269de5..ca7e90f8c8 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.2.12-next.1", + "version": "0.2.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,13 +38,15 @@ "@backstage/plugin-scaffolder-node": "workspace:^", "@gitbeaker/core": "^35.8.0", "@gitbeaker/node": "^35.8.0", + "@gitbeaker/rest": "^39.25.0", "yaml": "^2.0.0", "zod": "^3.22.4" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", - "@backstage/core-app-api": "workspace:^" + "@backstage/core-app-api": "workspace:^", + "jest-date-mock": "^1.0.8" }, "files": [ "dist" diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabIssueAction.examples.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabIssueAction.examples.ts new file mode 100644 index 0000000000..760caf0f9f --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabIssueAction.examples.ts @@ -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 { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; +import { commonGitlabConfigExample } from '../commonGitlabConfig'; + +export const examples: TemplateExample[] = [ + { + description: 'Create a GitLab issue with minimal options', + example: yaml.stringify({ + steps: [ + { + id: 'gitlabIssue', + name: 'Issues', + action: 'gitlab:issues:create', + input: { + ...commonGitlabConfigExample, + projectId: 12, + title: 'Test Issue', + description: 'This is the description of the issue', + }, + }, + ], + }), + }, + { + description: 'Create a GitLab issue with assignees and date options', + example: yaml.stringify({ + steps: [ + { + id: 'gitlabIssue', + name: 'Issues', + action: 'gitlab:issues:create', + input: { + ...commonGitlabConfigExample, + projectId: 12, + title: 'Test Issue', + assignees: [18], + description: 'This is the description of the issue', + createdAt: '2022-09-27 18:00:00.000', + dueDate: '2022-09-28 12:00:00.000', + }, + }, + ], + }), + }, + { + description: 'Create a GitLab Issue with several options', + example: yaml.stringify({ + steps: [ + { + id: 'gitlabIssue', + name: 'Issues', + action: 'gitlab:issues:create', + input: { + ...commonGitlabConfigExample, + projectId: 12, + title: 'Test Issue', + assignees: [18, 15], + description: 'This is the description of the issue', + confidential: false, + createdAt: '2022-09-27 18:00:00.000', + dueDate: '2022-09-28 12:00:00.000', + discussionToResolve: 1, + epicId: 1, + labels: 'phase1:label1,phase2:label2', + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabIssueAction.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabIssueAction.test.ts new file mode 100644 index 0000000000..fe9e556656 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabIssueAction.test.ts @@ -0,0 +1,217 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { PassThrough } from 'stream'; +import { getVoidLogger } from '@backstage/backend-common'; +import { createGitlabIssueAction, IssueType } from './createGitlabIssueAction'; +import { ConfigReader } from '@backstage/core-app-api'; +import { ScmIntegrations } from '@backstage/integration'; +import { advanceTo, clear } from 'jest-date-mock'; + +const mockGitlabClient = { + Issues: { + create: jest.fn(), + }, +}; +jest.mock('@gitbeaker/rest', () => ({ + Gitlab: class { + constructor() { + return mockGitlabClient; + } + }, +})); + +describe('gitlab:issues:create', () => { + beforeEach(() => { + jest.clearAllMocks(); + advanceTo(new Date(1988, 5, 3, 12, 0, 0)); // Set the desired date and time + }); + + afterEach(() => { + clear(); // Reset the date mock after each test + }); + + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'gitlab.com', + token: 'myIntegrationsToken', + apiBaseUrl: 'https://gitlab.com/api/v4', + }, + ], + }, + }); + const integrations = ScmIntegrations.fromConfig(config); + + const action = createGitlabIssueAction({ integrations }); + + it('should return a Gitlab issue when called with minimal input params', async () => { + const mockContext = { + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: 123, + title: 'Computer banks to rule the world', + }, + workspacePath: 'seen2much', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + mockGitlabClient.Issues.create.mockResolvedValue({ + id: 42, + web_url: 'https://gitlab.com/hangar18-/issues/42', + }); + + await action.handler({ + ...mockContext, + }); + + expect(mockGitlabClient.Issues.create).toHaveBeenCalledWith( + 123, + 'Computer banks to rule the world', + { + issueType: undefined, + description: '', + assigneeIds: [], + confidential: false, + epicId: undefined, + labels: '', + createdAt: new Date().toISOString(), + dueDate: undefined, + discussionToResolve: '', + mergeRequestToResolveDiscussionsOf: undefined, + milestoneId: undefined, + weight: undefined, + }, + ); + + expect(mockContext.output).toHaveBeenCalledWith('issueId', 42); + expect(mockContext.output).toHaveBeenCalledWith( + 'issueUrl', + 'https://gitlab.com/hangar18-/issues/42', + ); + }); + + it('should return a Gitlab issue when called with oAuth Token', async () => { + const mockContext = { + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: 123, + title: 'Computer banks to rule the world', + token: 'myAwesomeToken', + }, + workspacePath: 'seen2much', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + mockGitlabClient.Issues.create.mockResolvedValue({ + id: 42, + web_url: 'https://gitlab.com/hangar18-/issues/42', + }); + + await action.handler({ + ...mockContext, + }); + + expect(mockGitlabClient.Issues.create).toHaveBeenCalledWith( + 123, + 'Computer banks to rule the world', + { + issueType: undefined, + description: '', + assigneeIds: [], + confidential: false, + epicId: undefined, + labels: '', + createdAt: new Date().toISOString(), + dueDate: undefined, + discussionToResolve: '', + mergeRequestToResolveDiscussionsOf: undefined, + milestoneId: undefined, + weight: undefined, + }, + ); + + expect(mockContext.output).toHaveBeenCalledWith('issueId', 42); + expect(mockContext.output).toHaveBeenCalledWith( + 'issueUrl', + 'https://gitlab.com/hangar18-/issues/42', + ); + }); + + it('should return a Gitlab issue when called with several input params', async () => { + const mockContext = { + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: 123, + issueType: IssueType.INCIDENT, + title: 'Computer banks to rule the world', + description: + 'this issue should kickstart research on instruments to sight the stars', + dueDate: '1990-08-20T23:59:59Z', + token: 'myAwesomeToken', + assignees: [3, 14, 15], + labels: 'operation:mindcrime', + }, + workspacePath: 'seen2much', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + mockGitlabClient.Issues.create.mockResolvedValue({ + id: 42, + web_url: 'https://gitlab.com/hangar18-/issues/42', + }); + + await action.handler({ + ...mockContext, + }); + + expect(mockGitlabClient.Issues.create).toHaveBeenCalledWith( + 123, + 'Computer banks to rule the world', + { + issueType: 'incident', + description: + 'this issue should kickstart research on instruments to sight the stars', + assigneeIds: [3, 14, 15], + confidential: false, + epicId: undefined, + labels: 'operation:mindcrime', + createdAt: new Date().toISOString(), + dueDate: '1990-08-20T23:59:59.000Z', + discussionToResolve: '', + mergeRequestToResolveDiscussionsOf: undefined, + milestoneId: undefined, + weight: undefined, + }, + ); + + expect(mockContext.output).toHaveBeenCalledWith('issueId', 42); + expect(mockContext.output).toHaveBeenCalledWith( + 'issueUrl', + 'https://gitlab.com/hangar18-/issues/42', + ); + }); +}); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabIssueAction.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabIssueAction.ts new file mode 100644 index 0000000000..bc9c796253 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabIssueAction.ts @@ -0,0 +1,209 @@ +/* + * 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 { InputError } from '@backstage/errors'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import commonGitlabConfig from '../commonGitlabConfig'; +import { examples } from './createGitlabIssueAction.examples'; +import { z } from 'zod'; +import { checkEpicScope, convertDate, getClient, parseRepoUrl } from '../util'; +import { Gitlab, CreateIssueOptions, IssueSchema } from '@gitbeaker/rest'; + +/** + * Gitlab issue types + * + * @public + */ +export enum IssueType { + ISSUE = 'issue', + INCIDENT = 'incident', + TEST = 'test_case', +} + +const issueInputProperties = z.object({ + projectId: z.number().describe('Project Id'), + title: z.string({ description: 'Title of the issue' }), + assignees: z + .array(z.number(), { + description: 'IDs of the users to assign the issue to.', + }) + .optional(), + confidential: z.boolean({ description: 'Issue Confidentiality' }).optional(), + description: z.string().describe('Issue description').max(1048576).optional(), + createdAt: z + .string() + .describe('Creation date/time') + .regex( + /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/, + 'Invalid date format. Use YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ', + ) + .optional(), + dueDate: z + .string() + .describe('Due date/time') + .regex( + /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/, + 'Invalid date format. Use YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ', + ) + .optional(), + discussionToResolve: z + .string({ + description: + 'Id of a discussion to resolve. Use in combination with "merge_request_to_resolve_discussions_of"', + }) + .optional(), + epicId: z + .number({ description: 'Id of the linked Epic' }) + .min(0, 'Valid values should be equal or greater than zero') + .optional(), + labels: z.string({ description: 'Labels to apply' }).optional(), + issueType: z + .nativeEnum(IssueType, { + description: 'Type of the issue', + }) + .optional(), + mergeRequestToResolveDiscussionsOf: z + .number({ + description: 'IID of a merge request in which to resolve all issues', + }) + .optional(), + milestoneId: z + .number({ description: 'Global ID of a milestone to assign the issue' }) + .optional(), + weight: z + .number({ description: 'The issue weight' }) + .min(0) + .refine(value => { + const isValid = value >= 0; + if (!isValid) { + return { + message: 'Valid values should be equal or greater than zero', + }; + } + return isValid; + }) + .optional(), +}); + +const issueOutputProperties = z.object({ + issueUrl: z.string({ description: 'Issue Url' }), + issueId: z.number({ description: 'Issue Id' }), +}); + +/** + * Creates a `gitlab:issues:create` Scaffolder action. + * + * @param options - Templating configuration. + * @public + */ +export const createGitlabIssueAction = (options: { + integrations: ScmIntegrationRegistry; +}) => { + const { integrations } = options; + return createTemplateAction({ + id: 'gitlab:issues:create', + description: 'Creates a Gitlab issue.', + examples, + schema: { + input: commonGitlabConfig.merge(issueInputProperties), + output: issueOutputProperties, + }, + async handler(ctx) { + try { + const { + repoUrl, + projectId, + title, + description = '', + confidential = false, + assignees = [], + createdAt = '', + dueDate, + discussionToResolve = '', + epicId, + labels = '', + issueType, + mergeRequestToResolveDiscussionsOf, + milestoneId, + weight, + token, + } = commonGitlabConfig.merge(issueInputProperties).parse(ctx.input); + + const { host } = parseRepoUrl(repoUrl, integrations); + const api = getClient({ host, integrations, token }); + + let isEpicScoped = false; + + if (epicId) { + isEpicScoped = await checkEpicScope( + api as any as InstanceType, + projectId, + epicId, + ); + + if (isEpicScoped) { + ctx.logger.info('Epic is within Project Scope'); + } else { + ctx.logger.warn( + 'Chosen epic is not within the Project Scope. The issue will be created without an associated epic.', + ); + } + } + const mappedCreatedAt = convertDate( + String(createdAt), + new Date().toISOString(), + ); + const mappedDueDate = dueDate + ? convertDate(String(dueDate), new Date().toISOString()) + : undefined; + + const issueOptions: CreateIssueOptions = { + description, + assigneeIds: assignees, + confidential, + epicId: isEpicScoped ? epicId : undefined, + labels, + createdAt: mappedCreatedAt, + dueDate: mappedDueDate, + discussionToResolve, + issueType, + mergeRequestToResolveDiscussionsOf, + milestoneId, + weight, + }; + + const response = (await api.Issues.create( + projectId, + title, + issueOptions, + )) as IssueSchema; + + ctx.output('issueId', response.id); + ctx.output('issueUrl', response.web_url); + } catch (error: any) { + if (error instanceof z.ZodError) { + // Handling Zod validation errors + throw new InputError(`Validation error: ${error.message}`, { + validationErrors: error.errors, + }); + } + // Handling other errors + throw new InputError(`Failed to create GitLab issue: ${error.message}`); + } + }, + }); +}; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts index f6c4734729..86f69ee357 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts @@ -19,12 +19,12 @@ import { parseRepoUrl, serializeDirectoryContents, } from '@backstage/plugin-scaffolder-node'; -import { Gitlab } from '@gitbeaker/node'; import { Types } from '@gitbeaker/core'; import path from 'path'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { InputError } from '@backstage/errors'; import { resolveSafeChildPath } from '@backstage/backend-common'; +import { createGitlabApi } from './helpers'; /** * Create a new action that creates a gitlab merge request. @@ -158,33 +158,16 @@ export const createPublishGitlabMergeRequestAction = (options: { targetPath, sourcePath, title, - token: providedToken, + token, } = ctx.input; - const { host, owner, repo, project } = parseRepoUrl( - repoUrl, - integrations, - ); + const { owner, repo, project } = parseRepoUrl(repoUrl, integrations); const repoID = project ? project : `${owner}/${repo}`; - const integrationConfig = integrations.gitlab.byHost(host); - - if (!integrationConfig) { - throw new InputError( - `No matching integration configuration for host ${host}, please check your integrations config`, - ); - } - - if (!integrationConfig.config.token && !providedToken) { - throw new InputError(`No token available for host ${host}`); - } - - const token = providedToken ?? integrationConfig.config.token!; - const tokenType = providedToken ? 'oauthToken' : 'token'; - - const api = new Gitlab({ - host: integrationConfig.config.baseUrl, - [tokenType]: token, + const api = createGitlabApi({ + integrations, + token, + repoUrl, }); let assigneeId = undefined; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.test.ts new file mode 100644 index 0000000000..840f506540 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.test.ts @@ -0,0 +1,436 @@ +/* + * 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 { createRootLogger, getRootLogger } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { Writable } from 'stream'; +import { createMockDirectory } from '@backstage/backend-test-utils'; +import { createGitlabRepoPushAction } from './gitlabRepoPush'; + +// Make sure root logger is initialized ahead of FS mock +createRootLogger(); + +const mockGitlabClient = { + Projects: { + create: jest.fn(), + show: jest.fn(async (_: any) => { + return { + default_branch: 'main', + }; + }), + }, + Branches: { + create: jest.fn(), + show: jest.fn(), + }, + Commits: { + create: jest.fn(async (_: any) => ({ + id: 'bb6bce457ed069a38ef8d16ef38602972c7735c5', + })), + }, +}; + +jest.mock('@gitbeaker/node', () => ({ + Gitlab: class { + constructor() { + return mockGitlabClient; + } + }, +})); + +describe('createGitLabCommit', () => { + let instance: TemplateAction; + + const mockDir = createMockDirectory(); + const workspacePath = mockDir.resolve('workspace'); + + beforeEach(() => { + mockDir.clear(); + + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'gitlab.com', + token: 'token', + apiBaseUrl: 'https://api.gitlab.com', + }, + { + host: 'hosted.gitlab.com', + apiBaseUrl: 'https://api.hosted.gitlab.com', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + instance = createGitlabRepoPushAction({ integrations }); + }); + + describe('createGitLabCommitWithoutCommitAction', () => { + it('default commitAction is create', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + commitMessage: 'Create my new commit', + branchName: 'some-branch', + }; + mockDir.setContent({ + [workspacePath]: { + 'foo.txt': 'Hello there!', + }, + }); + const ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledTimes(0); + expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith( + 'owner/repo', + 'some-branch', + 'Create my new commit', + [ + { + action: 'create', + filePath: 'foo.txt', + content: 'SGVsbG8gdGhlcmUh', + encoding: 'base64', + execute_filemode: false, + }, + ], + ); + expect(ctx.output).toHaveBeenCalledWith( + 'commitHash', + 'bb6bce457ed069a38ef8d16ef38602972c7735c5', + ); + }); + }); + + describe('createGitLabCommitWithCommitAction', () => { + it('commitAction is create when create is passed in options', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + commitMessage: 'Create my new commit', + branchName: 'some-branch', + commitAction: 'create', + }; + mockDir.setContent({ + [workspacePath]: { + 'foo.txt': 'Hello there!', + }, + }); + + const ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledTimes(0); + expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith( + 'owner/repo', + 'some-branch', + 'Create my new commit', + [ + { + action: 'create', + filePath: 'foo.txt', + content: 'SGVsbG8gdGhlcmUh', + encoding: 'base64', + execute_filemode: false, + }, + ], + ); + expect(ctx.output).toHaveBeenCalledWith( + 'commitHash', + 'bb6bce457ed069a38ef8d16ef38602972c7735c5', + ); + }); + + it('commitAction is update when update is passed in options', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + commitMessage: 'Create my new commit', + branchName: 'some-branch', + commitAction: 'update', + }; + mockDir.setContent({ + [workspacePath]: { + 'foo.txt': 'Hello there!', + }, + }); + + const ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledTimes(0); + expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith( + 'owner/repo', + 'some-branch', + 'Create my new commit', + [ + { + action: 'update', + filePath: 'foo.txt', + content: 'SGVsbG8gdGhlcmUh', + encoding: 'base64', + execute_filemode: false, + }, + ], + ); + expect(ctx.output).toHaveBeenCalledWith( + 'commitHash', + 'bb6bce457ed069a38ef8d16ef38602972c7735c5', + ); + }); + + it('commitAction is delete when delete is passed in options', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + commitMessage: 'Create my new commit', + branchName: 'some-branch', + commitAction: 'delete', + }; + mockDir.setContent({ + [workspacePath]: { + 'foo.txt': 'Hello there!', + }, + }); + + const ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledTimes(0); + expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith( + 'owner/repo', + 'some-branch', + 'Create my new commit', + [ + { + action: 'delete', + filePath: 'foo.txt', + content: 'SGVsbG8gdGhlcmUh', + encoding: 'base64', + execute_filemode: false, + }, + ], + ); + expect(ctx.output).toHaveBeenCalledWith( + 'commitHash', + 'bb6bce457ed069a38ef8d16ef38602972c7735c5', + ); + }); + }); + + describe('with sourcePath', () => { + it('creates a commit with only relevant files', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + commitMessage: 'Create my new commit', + branchName: 'some-branch', + sourcePath: 'source', + commitAction: 'create', + }; + + mockDir.setContent({ + [workspacePath]: { + source: { 'foo.txt': 'Hello there!' }, + irrelevant: { 'bar.txt': 'Nothing to see here' }, + }, + }); + + const ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledTimes(0); + expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith( + 'owner/repo', + 'some-branch', + 'Create my new commit', + [ + { + action: 'create', + filePath: 'foo.txt', + content: 'SGVsbG8gdGhlcmUh', + encoding: 'base64', + execute_filemode: false, + }, + ], + ); + expect(ctx.output).toHaveBeenCalledWith( + 'commitHash', + 'bb6bce457ed069a38ef8d16ef38602972c7735c5', + ); + }); + + it('creates a commit with only relevant files placed under different targetPath', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + commitMessage: 'Create my new commit', + branchName: 'some-branch', + sourcePath: 'source', + targetPath: 'target', + commitAction: 'create', + }; + + mockDir.setContent({ + [workspacePath]: { + source: { 'foo.txt': 'Hello there!' }, + irrelevant: { 'bar.txt': 'Nothing to see here' }, + }, + }); + + const ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledTimes(0); + expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith( + 'owner/repo', + 'some-branch', + 'Create my new commit', + [ + { + action: 'create', + filePath: 'target/foo.txt', + content: 'SGVsbG8gdGhlcmUh', + encoding: 'base64', + execute_filemode: false, + }, + ], + ); + expect(ctx.output).toHaveBeenCalledWith( + 'commitHash', + 'bb6bce457ed069a38ef8d16ef38602972c7735c5', + ); + }); + + it('should not allow to use files outside of the workspace', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + commitMessage: 'Create my new commit', + branchName: 'some-branch', + sourcePath: '../../test', + commitAction: 'create', + }; + + const ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + + await expect(instance.handler(ctx)).rejects.toThrow( + 'Relative path is not allowed to refer to a directory outside its parent', + ); + }); + }); + + describe('createCommitToBranchThatDoesNotExist', () => { + it('should create a new branch', async () => { + mockGitlabClient.Branches.show.mockRejectedValue({ + response: { + statusCode: 404, + }, + }); + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + commitMessage: 'Create my new commit', + branchName: 'some-branch', + }; + mockDir.setContent({ + [workspacePath]: { + 'foo.txt': 'Hello there!', + }, + }); + const ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + await instance.handler(ctx); + + expect(mockGitlabClient.Branches.create).toHaveBeenCalledWith( + 'owner/repo', + 'some-branch', + 'main', + ); + expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith( + 'owner/repo', + 'some-branch', + 'Create my new commit', + [ + { + action: 'create', + filePath: 'foo.txt', + content: 'SGVsbG8gdGhlcmUh', + encoding: 'base64', + execute_filemode: false, + }, + ], + ); + expect(ctx.output).toHaveBeenCalledWith( + 'commitHash', + 'bb6bce457ed069a38ef8d16ef38602972c7735c5', + ); + }); + }); +}); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts new file mode 100644 index 0000000000..330d0f6f08 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts @@ -0,0 +1,194 @@ +/* + * 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 { + createTemplateAction, + parseRepoUrl, + serializeDirectoryContents, +} from '@backstage/plugin-scaffolder-node'; +import { Types } from '@gitbeaker/core'; +import path from 'path'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { InputError } from '@backstage/errors'; +import { resolveSafeChildPath } from '@backstage/backend-common'; +import { createGitlabApi } from './helpers'; + +/** + * Create a new action that commits into a gitlab repository. + * + * @public + */ +export const createGitlabRepoPushAction = (options: { + integrations: ScmIntegrationRegistry; +}) => { + const { integrations } = options; + + return createTemplateAction<{ + repoUrl: string; + branchName: string; + commitMessage: string; + sourcePath?: string; + targetPath?: string; + token?: string; + commitAction?: 'create' | 'delete' | 'update'; + }>({ + id: 'gitlab:repo:push', + schema: { + input: { + required: ['repoUrl', 'branchName', 'commitMessage'], + type: 'object', + properties: { + repoUrl: { + type: 'string', + title: 'Repository Location', + 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`, + }, + branchName: { + type: 'string', + title: 'Source Branch Name', + description: 'The branch name for the commit', + }, + commitMessage: { + type: 'string', + title: 'Commit Message', + description: `The commit message`, + }, + sourcePath: { + type: 'string', + title: 'Working Subdirectory', + description: + 'Subdirectory of working directory to copy changes from', + }, + targetPath: { + type: 'string', + title: 'Repository Subdirectory', + description: 'Subdirectory of repository to apply changes to', + }, + token: { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to GitLab', + }, + commitAction: { + title: 'Commit action', + type: 'string', + enum: ['create', 'update', 'delete'], + description: + 'The action to be used for git commit. Defaults to create.', + }, + }, + }, + output: { + type: 'object', + properties: { + projectid: { + title: 'Gitlab Project id/Name(slug)', + type: 'string', + }, + projectPath: { + title: 'Gitlab Project path', + type: 'string', + }, + commitHash: { + title: 'The git commit hash of the commit', + type: 'string', + }, + }, + }, + }, + async handler(ctx) { + const { + branchName, + repoUrl, + targetPath, + sourcePath, + token, + commitAction, + } = ctx.input; + + const { owner, repo, project } = parseRepoUrl(repoUrl, integrations); + const repoID = project ? project : `${owner}/${repo}`; + + const api = createGitlabApi({ + integrations, + token, + repoUrl, + }); + + let fileRoot: string; + if (sourcePath) { + fileRoot = resolveSafeChildPath(ctx.workspacePath, sourcePath); + } else { + fileRoot = ctx.workspacePath; + } + + const fileContents = await serializeDirectoryContents(fileRoot, { + gitignore: true, + }); + + const actions: Types.CommitAction[] = fileContents.map(file => ({ + action: commitAction ?? 'create', + filePath: targetPath + ? path.posix.join(targetPath, file.path) + : file.path, + encoding: 'base64', + content: file.content.toString('base64'), + execute_filemode: file.executable, + })); + + let branchExists = false; + try { + await api.Branches.show(repoID, branchName); + branchExists = true; + } catch (e: any) { + if (e.response?.statusCode !== 404) { + throw new InputError( + `Failed to check status of branch '${branchName}'. Please make sure that branch already exists or Backstage has permissions to create one. ${e}`, + ); + } + } + + if (!branchExists) { + // create a branch using the default branch as ref + try { + const projects = await api.Projects.show(repoID); + const { default_branch: defaultBranch } = projects; + await api.Branches.create(repoID, branchName, String(defaultBranch)); + } catch (e) { + throw new InputError( + `The branch '${branchName}' was not found and creation failed with error. Please make sure that branch already exists or Backstage has permissions to create one. ${e}`, + ); + } + } + + try { + const commit = await api.Commits.create( + repoID, + branchName, + ctx.input.commitMessage, + actions, + ); + ctx.output('projectid', repoID); + ctx.output('projectPath', repoID); + ctx.output('commitHash', commit.id); + } catch (e) { + throw new InputError( + `Committing the changes to ${branchName} failed. Please check that none of the files created by the template already exists. ${e}`, + ); + } + }, + }); +}; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/helpers.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/helpers.ts new file mode 100644 index 0000000000..1d12a6d394 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/helpers.ts @@ -0,0 +1,50 @@ +/* + * 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 { parseRepoUrl } from '@backstage/plugin-scaffolder-node'; +import { InputError } from '@backstage/errors'; +import { Gitlab } from '@gitbeaker/node'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { Resources } from '@gitbeaker/core'; + +export function createGitlabApi(options: { + integrations: ScmIntegrationRegistry; + token?: string; + repoUrl: string; +}): Resources.Gitlab { + const { integrations, token: providedToken, repoUrl } = options; + + const { host } = parseRepoUrl(repoUrl, integrations); + + const integrationConfig = integrations.gitlab.byHost(host); + + if (!integrationConfig) { + throw new InputError( + `No matching integration configuration for host ${host}, please check your integrations config`, + ); + } + + if (!integrationConfig.config.token && !providedToken) { + throw new InputError(`No token available for host ${host}`); + } + + const token = providedToken ?? integrationConfig.config.token!; + const tokenType = providedToken ? 'oauthToken' : 'token'; + + return new Gitlab({ + host: integrationConfig.config.baseUrl, + [tokenType]: token, + }); +} diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts index e915293860..4a5ca06c98 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/index.ts @@ -17,5 +17,7 @@ export * from './createGitlabGroupEnsureExistsAction'; export * from './createGitlabProjectDeployTokenAction'; export * from './createGitlabProjectAccessTokenAction'; export * from './createGitlabProjectVariableAction'; +export * from './createGitlabIssueAction'; export * from './gitlab'; export * from './gitlabMergeRequest'; +export * from './gitlabRepoPush'; diff --git a/plugins/scaffolder-backend-module-gitlab/src/commonGitlabConfig.ts b/plugins/scaffolder-backend-module-gitlab/src/commonGitlabConfig.ts index 02724a3674..3c83eacf19 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/commonGitlabConfig.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/commonGitlabConfig.ts @@ -24,3 +24,8 @@ const commonGitlabConfig = z.object({ }); export default commonGitlabConfig; + +export const commonGitlabConfigExample = { + repoUrl: 'gitlab.com?owner=namespace-or-owner&repo=project-name', + token: '${{ secrets.USER_OAUTH_TOKEN }}', +}; diff --git a/plugins/scaffolder-backend-module-gitlab/src/util.test.ts b/plugins/scaffolder-backend-module-gitlab/src/util.test.ts new file mode 100644 index 0000000000..61c61e87c3 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/util.test.ts @@ -0,0 +1,388 @@ +/* + * 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 * as util from './util'; +import { Gitlab, GroupSchema } from '@gitbeaker/rest'; +import { InputError } from '@backstage/errors'; + +// Mock the Gitlab client and its methods +const mockGitlabClient = { + Groups: { + show: jest.fn(), + }, + Projects: { + show: jest.fn(), + }, + Epics: { + all: jest.fn(), + }, +}; + +jest.mock('@gitbeaker/rest', () => ({ + Gitlab: class { + constructor() { + return mockGitlabClient; + } + }, +})); + +const mockConfig = { + gitlab: [ + { + host: 'gitlab.com', + token: 'withToken', + apiBaseUrl: 'gitlab.com/api/v4', + }, + { + host: 'gitlab.com', + apiBaseUrl: 'gitlab.com/api/v4', + }, + ], +}; +describe('getTopLevelParentGroup', () => { + afterEach(() => jest.resetAllMocks()); + + // Mocked nested groups + const mockGroups: GroupSchema[] = [ + { + id: 789, + parent_id: 0, + path: '', + description: '', + visibility: '', + share_with_group_lock: false, + require_two_factor_authentication: false, + two_factor_grace_period: 0, + project_creation_level: '', + subgroup_creation_level: '', + lfs_enabled: false, + default_branch_protection: 0, + request_access_enabled: false, + created_at: '', + avatar_url: '', + full_name: '', + full_path: '', + web_url: '', + name: '', + }, + { + id: 456, + parent_id: 789, + path: '', + description: '', + visibility: '', + share_with_group_lock: false, + require_two_factor_authentication: false, + two_factor_grace_period: 0, + project_creation_level: '', + subgroup_creation_level: '', + lfs_enabled: false, + default_branch_protection: 0, + request_access_enabled: false, + created_at: '', + avatar_url: '', + full_name: '', + full_path: '', + web_url: '', + name: '', + }, + { + id: 123, + parent_id: 456, + path: '', + description: '', + visibility: '', + share_with_group_lock: false, + require_two_factor_authentication: false, + two_factor_grace_period: 0, + project_creation_level: '', + subgroup_creation_level: '', + lfs_enabled: false, + default_branch_protection: 0, + request_access_enabled: false, + created_at: '', + avatar_url: '', + full_name: '', + full_path: '', + web_url: '', + name: '', + }, + ]; + + // Top level group + const mockTopParentGroup: GroupSchema = { + id: 789, + parent_id: 0, + path: '', + description: '', + visibility: '', + share_with_group_lock: false, + require_two_factor_authentication: false, + two_factor_grace_period: 0, + project_creation_level: '', + subgroup_creation_level: '', + lfs_enabled: false, + default_branch_protection: 0, + request_access_enabled: false, + created_at: '', + avatar_url: '', + full_name: '', + full_path: '', + web_url: '', + name: '', + }; + + it('should return the top-level parent group if the input group has a parent in the hierarchy', async () => { + // Instance with token + const apiClient = new Gitlab({ + host: mockConfig.gitlab[0].host, + token: mockConfig.gitlab[0].token!, + }); + + const showSpy = jest.spyOn(mockGitlabClient.Groups, 'show'); + + // Mock implementation of Groups.show + showSpy.mockImplementation( + async (groupId: string | number): Promise => { + const id = + typeof groupId === 'number' ? groupId : parseInt(groupId, 10); + const mockGroup = mockGroups.find(group => group.id === id) || null; + return mockGroup as GroupSchema; + }, + ); + + const action = util.getTopLevelParentGroup(apiClient, 123); + + const result = await action; + expect(result).toEqual(mockTopParentGroup); + }); + + it('should return the input group if it has no parents in the hierarchy', async () => { + // Instance with token + const apiClient = new Gitlab({ + host: mockConfig.gitlab[0].host, + token: mockConfig.gitlab[0].token!, + }); + + const showSpy = jest.spyOn(mockGitlabClient.Groups, 'show'); + + // Mock implementation of Groups.show + showSpy.mockImplementation( + async (groupId: string | number): Promise => { + const id = + typeof groupId === 'number' ? groupId : parseInt(groupId, 10); + const mockGroup = mockGroups.find(group => group.id === id) || null; + return mockGroup as GroupSchema; + }, + ); + + const action = util.getTopLevelParentGroup(apiClient, 789); + + const result = await action; + expect(result).toEqual(mockTopParentGroup); + }); +}); + +describe('checkEpicScope', () => { + afterEach(() => jest.resetAllMocks()); + + it('should return true if the project is inside the epic scope', async () => { + const apiClient = new Gitlab({ + host: mockConfig.gitlab[0].host, + token: mockConfig.gitlab[0].token!, + }); + + const projectId = 123; + const epicId = 456; + + // Mock project, top-level parent group, and epic + const mockProject = { + id: 123, + name: 'You learn', + namespace: { id: 789 }, + path_with_namespace: 'at-once/you-learn', + }; + const mockTopParentGroup = { + id: 789, + name: 'LivingTwice', + full_path: 'at-once/you-learn', + }; + const mockEpic = { id: epicId, group_id: 789 }; + + mockGitlabClient.Projects.show.mockResolvedValue(mockProject); + mockGitlabClient.Groups.show.mockResolvedValue(mockTopParentGroup); + mockGitlabClient.Epics.all.mockResolvedValue([mockEpic]); + + const result = await util.checkEpicScope(apiClient, projectId, epicId); + + expect(result).toBe(true); + expect(mockGitlabClient.Projects.show).toHaveBeenCalledWith(projectId); + expect(mockGitlabClient.Groups.show).toHaveBeenCalledWith( + mockProject.namespace.id, + ); + expect(mockGitlabClient.Epics.all).toHaveBeenCalledWith( + mockTopParentGroup.id, + ); + }); + + it('should return false if the project is not inside the epic scope', async () => { + const apiClient = new Gitlab({ + host: mockConfig.gitlab[0].host, + token: mockConfig.gitlab[0].token!, + }); + + const projectId = 123; + const epicId = 45; + + // Mock project, top-level parent group, and epic + const mockProject = { + id: 123, + name: 'You learn', + namespace: { id: 32 }, + path_with_namespace: 'at-once/you-learn', + }; + const mockTopParentGroup = { + id: 32, + name: 'TheWalls', + full_path: 'you-built/within', + }; + + const mockEpic = { id: epicId, group_id: 32 }; + + mockGitlabClient.Projects.show.mockResolvedValue(mockProject); + mockGitlabClient.Groups.show.mockResolvedValue(mockTopParentGroup); + mockGitlabClient.Epics.all.mockResolvedValue([mockEpic]); + + const result = await util.checkEpicScope(apiClient, projectId, epicId); + + expect(result).toBe(false); + expect(mockGitlabClient.Projects.show).toHaveBeenCalledWith(projectId); + expect(mockGitlabClient.Groups.show).toHaveBeenCalledWith( + mockProject.namespace.id, + ); + expect(mockGitlabClient.Epics.all).toHaveBeenCalledWith( + mockTopParentGroup.id, + ); + }); + + it('should throw an InputError if the project is not found', async () => { + const apiClient = new Gitlab({ + host: mockConfig.gitlab[0].host, + token: mockConfig.gitlab[0].token!, + }); + + const projectId = 123; + const epicId = 456; + + mockGitlabClient.Projects.show.mockResolvedValue(null); + + await expect( + util.checkEpicScope(apiClient, projectId, epicId), + ).rejects.toThrow(InputError); + expect(mockGitlabClient.Projects.show).toHaveBeenCalledWith(projectId); + }); + + it('should throw an InputError if the top-level parent group is not found', async () => { + const apiClient = new Gitlab({ + host: mockConfig.gitlab[0].host, + token: mockConfig.gitlab[0].token!, + }); + + const projectId = 123; + const epicId = 456; + + mockGitlabClient.Projects.show.mockResolvedValue({ + id: 123, + name: 'You learn', + namespace: { id: 789 }, + path_with_namespace: 'at-once/you-learn', + }); + mockGitlabClient.Groups.show.mockResolvedValue(null); + + await expect( + util.checkEpicScope(apiClient, projectId, epicId), + ).rejects.toThrow(InputError); + expect(mockGitlabClient.Projects.show).toHaveBeenCalledWith(projectId); + expect(mockGitlabClient.Groups.show).toHaveBeenCalledWith(789); + }); + + it('should throw an InputError if the epic is not found', async () => { + const apiClient = new Gitlab({ + host: mockConfig.gitlab[0].host, + token: mockConfig.gitlab[0].token!, + }); + + const projectId = 123; + const epicId = 456; + + mockGitlabClient.Projects.show.mockResolvedValue({ + id: 123, + name: 'You learn', + namespace: { id: 789 }, + path_with_namespace: 'at-once/you-learn', + }); + mockGitlabClient.Groups.show.mockResolvedValue({ + id: 789, + name: 'LivingTwice', + full_path: 'at-once/you-learn', + }); + mockGitlabClient.Epics.all.mockResolvedValue([]); + + await expect( + util.checkEpicScope(apiClient, projectId, epicId), + ).rejects.toThrow(InputError); + expect(mockGitlabClient.Projects.show).toHaveBeenCalledWith(projectId); + expect(mockGitlabClient.Groups.show).toHaveBeenCalledWith(789); + expect(mockGitlabClient.Epics.all).toHaveBeenCalledWith(789); + }); +}); + +describe('convertDate', () => { + it('should convert a valid input date with miliseconds to an ISO string', () => { + const inputDate = '1970-01-01T12:00:00.000Z'; + const defaultDate = '1978-10-09T12:00:00Z'; + + const result = util.convertDate(inputDate, defaultDate); + + expect(result).toEqual('1970-01-01T12:00:00.000Z'); + }); + + it('should convert a valid input date to an ISO string', () => { + const inputDate = '1970-01-01T12:00:00Z'; + const defaultDate = '1978-10-09T12:00:00Z'; + + const result = util.convertDate(inputDate, defaultDate); + + expect(result).toEqual('1970-01-01T12:00:00.000Z'); + }); + + it('should use default date if input date is undefined', () => { + const inputDate = undefined; + const defaultDate = '1970-01-01T12:00:00Z'; + + const result = util.convertDate(inputDate, defaultDate); + + expect(result).toEqual('1970-01-01T12:00:00.000Z'); + }); + + it('should throw an InputError if input date is invalid', () => { + const inputDate = 'invalidDate'; + const defaultDate = '2023-02-01T12:00:00Z'; + + // Expecting an InputError to be thrown + expect(() => util.convertDate(inputDate, defaultDate)).toThrow(InputError); + }); +}); diff --git a/plugins/scaffolder-backend-module-gitlab/src/util.ts b/plugins/scaffolder-backend-module-gitlab/src/util.ts index 13c95e48e8..a4d819d490 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/util.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/util.ts @@ -21,6 +21,8 @@ import { } from '@backstage/integration'; import { z } from 'zod'; import commonGitlabConfig from './commonGitlabConfig'; +import { Gitlab, GroupSchema } from '@gitbeaker/rest'; +import * as util from './util'; export const parseRepoHost = (repoUrl: string): string => { let parsed; @@ -56,3 +58,138 @@ export const getToken = ( return { token: token, integrationConfig: integrationConfig }; }; + +export type RepoSpec = { + repo: string; + host: string; + owner?: string; +}; + +export const parseRepoUrl = ( + repoUrl: string, + integrations: ScmIntegrationRegistry, +): RepoSpec => { + let parsed; + try { + parsed = new URL(`https://${repoUrl}`); + } catch (error) { + throw new InputError( + `Invalid repo URL passed to publisher, got ${repoUrl}, ${error}`, + ); + } + const host = parsed.host; + const owner = parsed.searchParams.get('owner') ?? undefined; + const repo: string = parsed.searchParams.get('repo')!; + + const type = integrations.byHost(host)?.type; + + if (!type) { + throw new InputError( + `No matching integration configuration for host ${host}, please check your integrations config`, + ); + } + + return { host, owner, repo }; +}; + +export function getClient(props: { + host: string; + token?: string; + integrations: ScmIntegrationRegistry; +}): InstanceType { + const { host, token, integrations } = props; + const integrationConfig = integrations.gitlab.byHost(host); + + if (!integrationConfig) { + throw new InputError( + `No matching integration configuration for host ${host}, please check your integrations config`, + ); + } + + const { config } = integrationConfig; + + if (!config.token && !token) { + throw new InputError(`No token available for host ${host}`); + } + + const requestToken = token || config.token!; + const tokenType = token ? 'oauthToken' : 'token'; + + const gitlabOptions: any = { + host: config.baseUrl, + }; + + gitlabOptions[tokenType] = requestToken; + return new Gitlab(gitlabOptions); +} + +export function convertDate( + inputDate: string | undefined, + defaultDate: string, +) { + try { + return inputDate + ? new Date(inputDate).toISOString() + : new Date(defaultDate).toISOString(); + } catch (error) { + throw new InputError(`Error converting input date - ${error}`); + } +} + +export async function getTopLevelParentGroup( + client: InstanceType, + groupId: number, +): Promise { + try { + const topParentGroup = await client.Groups.show(groupId); + if (topParentGroup.parent_id) { + return util.getTopLevelParentGroup( + client, + topParentGroup.parent_id as number, + ); + } + return topParentGroup as GroupSchema; + } catch (error: any) { + throw new InputError( + `Error finding top-level parent group ID: ${error.message}`, + ); + } +} + +export async function checkEpicScope( + client: InstanceType, + projectId: number, + epicId: number, +) { + try { + // If project exists, get the top level group id + const project = await client.Projects.show(projectId); + if (!project) { + throw new InputError( + `Project with id ${projectId} not found. Check your GitLab instance.`, + ); + } + const topParentGroup = await getTopLevelParentGroup( + client, + project.namespace.id, + ); + if (!topParentGroup) { + throw new InputError(`Couldn't find a suitable top-level parent group.`); + } + // Get the epic + const epic = (await client.Epics.all(topParentGroup.id)).find( + (x: any) => x.id === epicId, + ); + if (!epic) { + throw new InputError( + `Epic with id ${epicId} not found in the top-level parent group ${topParentGroup.name}.`, + ); + } + + const epicGroup = await client.Groups.show(epic.group_id as number); + const projectNamespace: string = project.path_with_namespace as string; + return projectNamespace.startsWith(epicGroup.full_path as string); + } catch (error: any) { + throw new InputError(`Could not find epic scope: ${error.message}`); + } +} diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index d6cf866b5e..a923feec27 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.26 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + +## 0.4.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + ## 0.4.26-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/Rails.dockerfile b/plugins/scaffolder-backend-module-rails/Rails.dockerfile index 921faa601d..8ea3fc370a 100644 --- a/plugins/scaffolder-backend-module-rails/Rails.dockerfile +++ b/plugins/scaffolder-backend-module-rails/Rails.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.2 +FROM ruby:3.3 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 3caa338e02..65969643c1 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.26-next.1", + "version": "0.4.26", "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 45fed0f711..5ba8dd0f05 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.17 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.1.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + ## 0.1.17-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 79c782ee12..7828713d08 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.17-next.1", + "version": "0.1.17", "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 2ed7330538..1b4858dec9 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.30 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/types@1.1.1 + +## 0.2.30-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + ## 0.2.30-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 8147c2b61d..94883084e4 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.30-next.1", + "version": "0.2.30", "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 600b264f83..2fb35e3d24 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-scaffolder-backend +## 1.20.0 + +### Minor Changes + +- a694f71: The Scaffolder builtin actions now contains an action for running pipelines from Bitbucket Cloud Rest API +- 7c522c5: Add `gitlab:repo:push` scaffolder action to push files to arbitrary branch without creating a Merge Request + +### Patch Changes + +- e9ab1c4: Fixed an issue where not passing a `value` to any of the action's permission conditions caused an error. +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-backend-module-github@0.1.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.12 + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.1.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-scaffolder-backend-module-azure@0.1.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.1.1 + - @backstage/plugin-scaffolder-node@0.2.10 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + +## 1.19.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-scaffolder-node@0.2.10-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/plugin-scaffolder-backend-module-azure@0.1.1-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.1.1-next.2 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.1.1-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.1.1-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.12-next.2 + ## 1.19.3-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index f45f26b42c..24325449b3 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.19.3-next.1", + "version": "1.20.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index dfef2d3c92..02b96e9fa7 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -60,6 +60,7 @@ import { createPublishBitbucketCloudAction, createPublishBitbucketServerAction, createPublishBitbucketServerPullRequestAction, + createBitbucketPipelinesRunAction, } from '@backstage/plugin-scaffolder-backend-module-bitbucket'; import { @@ -69,6 +70,7 @@ import { import { createPublishGitlabAction, + createGitlabRepoPushAction, createPublishGitlabMergeRequestAction, } from '@backstage/plugin-scaffolder-backend-module-gitlab'; @@ -165,6 +167,9 @@ export const createBuiltinActions = ( createPublishGitlabMergeRequestAction({ integrations, }), + createGitlabRepoPushAction({ + integrations, + }), createPublishBitbucketAction({ integrations, config, @@ -223,6 +228,9 @@ export const createBuiltinActions = ( integrations, githubCredentialsProvider, }), + createBitbucketPipelinesRunAction({ + integrations, + }), ]; return actions as TemplateAction[]; diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 35d5782df7..dfc6b310ed 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-common +## 1.4.5 + +### Patch Changes + +- 178b8d8: Updated Template.v1beta3.schema.json, added a missing "presentation" field +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/catalog-model@1.4.3 + - @backstage/types@1.1.1 + ## 1.4.4 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index 73fa8e760e..699867fbb1 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.4.4", + "version": "1.4.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-common/src/Template.v1beta3.schema.json b/plugins/scaffolder-common/src/Template.v1beta3.schema.json index d4be9b7538..d7698511d8 100644 --- a/plugins/scaffolder-common/src/Template.v1beta3.schema.json +++ b/plugins/scaffolder-common/src/Template.v1beta3.schema.json @@ -139,6 +139,24 @@ } ] }, + "presentation": { + "type": "object", + "description": "A way to redefine the labels for actionable buttons.", + "properties": { + "backButtonText": { + "type": "string", + "description": "A button which return the user to one step back." + }, + "createButtonText": { + "type": "string", + "description": "A button which start the execution of the template." + }, + "reviewButtonText": { + "type": "string", + "description": "A button which open the review step to verify the input prior to start the execution." + } + } + }, "steps": { "type": "array", "description": "A list of steps to execute.", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index 5d0db461a5..49ea604b11 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-scaffolder-node +## 0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 0.2.10-next.1 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index dd1bb85ec6..b4c843ce65 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.2.10-next.1", + "version": "0.2.10", "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 35eb469a6f..89468800e8 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/plugin-scaffolder-react +## 1.7.1 + +### Patch Changes + +- c28f281: Scaffolder form now shows a list of errors at the top of the form. +- 0b9ce2b: Fix for a step with no properties +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- 4016f21: Remove some unused dependencies +- d16f85f: Show first scaffolder output text by default +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.7.1-next.2 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 1.7.1-next.1 ### Patch Changes diff --git a/plugins/scaffolder-react/api-report-alpha.md b/plugins/scaffolder-react/api-report-alpha.md index 615b54df84..6976951670 100644 --- a/plugins/scaffolder-react/api-report-alpha.md +++ b/plugins/scaffolder-react/api-report-alpha.md @@ -7,11 +7,8 @@ import { ApiHolder } from '@backstage/core-plugin-api'; import { ComponentType } from 'react'; -import { CustomFieldExtensionSchema } from '@backstage/plugin-scaffolder-react'; import { CustomFieldValidator } from '@backstage/plugin-scaffolder-react'; import { Dispatch } from 'react'; -import { Extension } from '@backstage/core-plugin-api'; -import { FieldExtensionComponent } from '@backstage/plugin-scaffolder-react'; import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { FieldValidation } from '@rjsf/utils'; import { FormProps } from '@backstage/plugin-scaffolder-react'; @@ -24,7 +21,6 @@ import { default as React_2 } from 'react'; import { ReactElement } from 'react'; import { ReactNode } from 'react'; import { ReviewStepProps } from '@backstage/plugin-scaffolder-react'; -import { ScaffolderRJSFFieldProps } from '@backstage/plugin-scaffolder-react'; import { ScaffolderRJSFFormProps } from '@backstage/plugin-scaffolder-react'; import { ScaffolderStep } from '@backstage/plugin-scaffolder-react'; import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; @@ -51,14 +47,6 @@ export const createAsyncValidators: ( // @alpha export const createFieldValidation: () => FieldValidation; -// @alpha -export function createLegacyScaffolderFieldExtension< - TReturnValue = unknown, - TInputProps = unknown, ->( - options: LegacyFieldExtensionOptions, -): Extension>; - // @alpha export const DefaultTemplateOutputs: (props: { output?: ScaffolderTaskOutput; @@ -83,39 +71,6 @@ export type FormValidation = { [name: string]: FieldValidation | FormValidation; }; -// @alpha -export type LegacyCustomFieldValidator = ( - data: TFieldReturnValue, - field: FieldValidation, - context: { - apiHolder: ApiHolder; - }, -) => void | Promise; - -// @alpha -export interface LegacyFieldExtensionComponentProps< - TFieldReturnValue, - TUiOptions = unknown, -> extends ScaffolderRJSFFieldProps { - // (undocumented) - uiSchema: ScaffolderRJSFFieldProps['uiSchema'] & { - 'ui:options'?: TUiOptions; - }; -} - -// @alpha -export type LegacyFieldExtensionOptions< - TFieldReturnValue = unknown, - TInputProps = unknown, -> = { - name: string; - component: ( - props: LegacyFieldExtensionComponentProps, - ) => JSX.Element | null; - validation?: LegacyCustomFieldValidator; - schema?: CustomFieldExtensionSchema; -}; - // @alpha export interface ParsedTemplateSchema { // (undocumented) diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 6f87b4002e..f8390667be 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.7.1-next.1", + "version": "1.7.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-react/src/alpha.ts b/plugins/scaffolder-react/src/alpha.ts index 224ee97c06..36c3fcf264 100644 --- a/plugins/scaffolder-react/src/alpha.ts +++ b/plugins/scaffolder-react/src/alpha.ts @@ -15,4 +15,3 @@ */ export * from './next'; -export * from './legacy'; diff --git a/plugins/scaffolder-react/src/legacy/extensions/index.tsx b/plugins/scaffolder-react/src/legacy/extensions/index.tsx deleted file mode 100644 index 870d797fc4..0000000000 --- a/plugins/scaffolder-react/src/legacy/extensions/index.tsx +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - LegacyCustomFieldValidator, - LegacyFieldExtensionOptions, - LegacyFieldExtensionComponentProps, -} from './types'; -import { Extension, attachComponentData } from '@backstage/core-plugin-api'; -import { FIELD_EXTENSION_KEY } from '../../extensions/keys'; -import { FieldExtensionComponent } from '@backstage/plugin-scaffolder-react'; - -/** - * Method for creating field extensions that can be used in the scaffolder - * frontend form. - * @alpha - */ -export function createLegacyScaffolderFieldExtension< - TReturnValue = unknown, - TInputProps = unknown, ->( - options: LegacyFieldExtensionOptions, -): Extension> { - return { - expose() { - const FieldExtensionDataHolder: any = () => null; - - attachComponentData( - FieldExtensionDataHolder, - FIELD_EXTENSION_KEY, - options, - ); - - return FieldExtensionDataHolder; - }, - }; -} - -export type { - LegacyCustomFieldValidator, - LegacyFieldExtensionOptions, - LegacyFieldExtensionComponentProps, -}; diff --git a/plugins/scaffolder-react/src/legacy/extensions/types.ts b/plugins/scaffolder-react/src/legacy/extensions/types.ts deleted file mode 100644 index 54c38ad2cd..0000000000 --- a/plugins/scaffolder-react/src/legacy/extensions/types.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ApiHolder } from '@backstage/core-plugin-api'; -import { FieldValidation } from '@rjsf/utils'; -import { - CustomFieldExtensionSchema, - ScaffolderRJSFFieldProps, -} from '@backstage/plugin-scaffolder-react'; - -/** - * Field validation type for Custom Field Extensions. - * - * @alpha - */ -export type LegacyCustomFieldValidator = ( - data: TFieldReturnValue, - field: FieldValidation, - context: { apiHolder: ApiHolder }, -) => void | Promise; - -/** - * Type for the Custom Field Extension with the - * name and components and validation function. - * - * @alpha - */ -export type LegacyFieldExtensionOptions< - TFieldReturnValue = unknown, - TInputProps = unknown, -> = { - name: string; - component: ( - props: LegacyFieldExtensionComponentProps, - ) => JSX.Element | null; - validation?: LegacyCustomFieldValidator; - schema?: CustomFieldExtensionSchema; -}; - -/** - * Type for field extensions and being able to type - * incoming props easier. - * - * @alpha - */ -export interface LegacyFieldExtensionComponentProps< - TFieldReturnValue, - TUiOptions = unknown, -> extends ScaffolderRJSFFieldProps { - uiSchema: ScaffolderRJSFFieldProps['uiSchema'] & { - 'ui:options'?: TUiOptions; - }; -} diff --git a/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.test.tsx index 8366dcadf8..4c631b86b0 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.test.tsx @@ -25,7 +25,10 @@ describe('', () => { it('should render template output', async () => { const output = { links: [{ title: 'Link 1', url: 'https://backstage.io/' }], - text: [{ title: 'Text 1', content: 'Hello, **world**!' }], + text: [ + { title: 'Text 1', content: 'Hello, **world**!' }, + { title: 'Text 2', content: 'Hello, **mars**!' }, + ], }; const { getByRole } = await renderInTestApp( @@ -37,6 +40,11 @@ describe('', () => { }, ); + // first text output default visible + expect(getByRole('heading', { level: 2 }).innerHTML).toBe( + output.text[0].title, + ); + // test link outputs for (const link of output.links ?? []) { expect( diff --git a/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx index a495e4ca9e..c105c5a571 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx @@ -28,17 +28,18 @@ import { TextOutputs } from './TextOutputs'; export const DefaultTemplateOutputs = (props: { output?: ScaffolderTaskOutput; }) => { - const [textOutputIndex, setTextOutputIndex] = useState(); + const { output } = props; + const [textOutputIndex, setTextOutputIndex] = useState( + output?.text?.length ? 0 : undefined, + ); const textOutput = useMemo( () => - textOutputIndex !== undefined - ? props.output?.text?.[textOutputIndex] - : null, - [props.output, textOutputIndex], + textOutputIndex !== undefined ? output?.text?.[textOutputIndex] : null, + [output, textOutputIndex], ); - if (!props.output) { + if (!output) { return null; } @@ -48,11 +49,11 @@ export const DefaultTemplateOutputs = (props: { - + diff --git a/plugins/scaffolder-react/src/next/components/TemplateOutputs/TextOutputs.tsx b/plugins/scaffolder-react/src/next/components/TemplateOutputs/TextOutputs.tsx index 7e64603e92..8f61aa6a30 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateOutputs/TextOutputs.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateOutputs/TextOutputs.tsx @@ -47,7 +47,11 @@ export const TextOutputs = (props: { startIcon={} component="div" color="primary" - onClick={() => setIndex?.(index !== i ? i : undefined)} + onClick={() => { + if (index !== i) { + setIndex?.(i); + } + }} variant={index === i ? 'outlined' : undefined} > {title} diff --git a/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx index ac55d73a04..d1d86ab977 100644 --- a/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx +++ b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx @@ -263,6 +263,118 @@ describe('useTemplateSchema', () => { expect(first.schema).toEqual({ type: 'object', + properties: {}, + }); + }); + + it('should deal with dependencies and oneOf options', () => { + const firstStepDependencies = { + preconditions: { + oneOf: [ + { + title: 'About', + description: 'you have chosen option A', + properties: { + preconditions: { + enum: ['optionA'], + }, + }, + }, + { + title: 'About', + description: 'you have chosen option B', + properties: { + preconditions: { + enum: ['optionB'], + }, + }, + }, + ], + }, + }; + + const secondStepDependencies = { + preconditions: { + oneOf: [ + { + required: ['inputA'], + properties: { + preconditions: { + enum: ['optionA'], + }, + inputA: { + title: 'Input A', + type: 'string', + }, + }, + }, + { + required: ['inputB'], + properties: { + preconditions: { + enum: ['optionB'], + }, + inputA: { + title: 'Input B', + type: 'string', + }, + }, + }, + ], + }, + }; + + const manifest: TemplateParameterSchema = { + title: 'Test Template', + description: 'Test Template Description', + steps: [ + { + title: 'First step', + schema: { + type: 'object', + properties: { + preconditions: { + title: 'Preconditions', + type: 'string', + description: 'Choose an option', + enum: ['optionA', 'optionB'], + enumNames: ['Option A', 'Option B'], + }, + }, + dependencies: firstStepDependencies, + }, + }, + { + title: 'Second step', + schema: { + dependencies: secondStepDependencies, + }, + }, + ], + }; + + const { result } = renderHook(() => useTemplateSchema(manifest), { + wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + false }]]} + > + {children} + + ), + }); + + const [first, second] = result.current.steps; + + expect(first.schema).toEqual({ + dependencies: firstStepDependencies, + properties: expect.anything(), + title: undefined, + type: 'object', + }); + + expect(second.schema).toEqual({ + dependencies: secondStepDependencies, + title: undefined, }); }); }); diff --git a/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts index aa5cefbaec..af004910be 100644 --- a/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts +++ b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts @@ -69,9 +69,9 @@ export const useTemplateSchema = ( }, } as ParsedTemplateSchema; - if (step.schema?.properties) { + if (step.schema?.properties || !step.schema?.dependencies) { strippedSchema.schema.properties = Object.fromEntries( - Object.entries((step.schema?.properties ?? []) as JsonObject).filter( + Object.entries((step.schema?.properties ?? {}) as JsonObject).filter( ([key]) => { const stepFeatureFlag = step.uiSchema[key]?.['ui:backstage']?.featureFlag; diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 849af8f681..8482d41538 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,43 @@ # @backstage/plugin-scaffolder +## 1.17.1 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- 4016f21: Remove some unused dependencies +- df4bc9d: Minor internal refactor +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.7.1 + - @backstage/core-components@0.13.10 + - @backstage/plugin-scaffolder-common@1.4.5 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + +## 1.17.1-next.2 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.7.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/integration-react@1.1.23-next.0 + ## 1.17.1-next.1 ### Patch Changes diff --git a/plugins/scaffolder/api-report-alpha.md b/plugins/scaffolder/api-report-alpha.md index 6a1e0648a4..3f0b60cd95 100644 --- a/plugins/scaffolder/api-report-alpha.md +++ b/plugins/scaffolder/api-report-alpha.md @@ -3,61 +3,52 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -/// - -import { ComponentType } from 'react'; -import { Entity } from '@backstage/catalog-model'; +import { BackstagePlugin } from '@backstage/frontend-plugin-api'; +import { ExternalRouteRef } from '@backstage/frontend-plugin-api'; import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import type { FormProps as FormProps_2 } from '@rjsf/core'; import { FormProps as FormProps_3 } from '@backstage/plugin-scaffolder-react'; -import { JSX as JSX_2 } from 'react'; import { LayoutOptions } from '@backstage/plugin-scaffolder-react'; -import { PropsWithChildren } from 'react'; +import { PathParams } from '@backstage/core-plugin-api'; import { default as React_2 } from 'react'; import { ReviewStepProps } from '@backstage/plugin-scaffolder-react'; +import { RouteRef } from '@backstage/frontend-plugin-api'; +import { SubRouteRef } from '@backstage/frontend-plugin-api'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react'; +// @alpha (undocumented) +const _default: BackstagePlugin< + { + root: RouteRef; + selectedTemplate: SubRouteRef< + PathParams<'/templates/:namespace/:templateName'> + >; + ongoingTask: SubRouteRef>; + actions: SubRouteRef; + listTasks: SubRouteRef; + edit: SubRouteRef; + }, + { + registerComponent: ExternalRouteRef; + viewTechDoc: ExternalRouteRef< + { + name: string; + kind: string; + namespace: string; + }, + true + >; + } +>; +export default _default; + // @alpha @deprecated export type FormProps = Pick< FormProps_2, 'transformErrors' | 'noHtml5Validate' >; -// @alpha -export const LegacyRouter: (props: LegacyRouterProps) => React_2.JSX.Element; - -// @alpha -export type LegacyRouterProps = { - components?: { - ReviewStepComponent?: ComponentType; - TemplateCardComponent?: - | ComponentType<{ - template: TemplateEntityV1beta3; - }> - | undefined; - TaskPageComponent?: ComponentType>; - }; - groups?: Array<{ - title?: React_2.ReactNode; - filter: (entity: Entity) => boolean; - }>; - templateFilter?: (entity: TemplateEntityV1beta3) => boolean; - defaultPreviewTemplate?: string; - headerOptions?: { - pageTitleOverride?: string; - title?: string; - subtitle?: string; - }; - contextMenu?: { - editor?: boolean; - actions?: boolean; - }; -}; - -// @alpha -export const LegacyScaffolderPage: (props: LegacyRouterProps) => JSX_2.Element; - // @alpha (undocumented) export type TemplateListPageProps = { TemplateCardComponent?: React_2.ComponentType<{ diff --git a/plugins/scaffolder/dev/index.tsx b/plugins/scaffolder/dev/index.tsx index b683345ff5..e4425b04bf 100644 --- a/plugins/scaffolder/dev/index.tsx +++ b/plugins/scaffolder/dev/index.tsx @@ -24,7 +24,7 @@ import { } from '@backstage/plugin-catalog-react'; import React from 'react'; import { scaffolderApiRef, ScaffolderClient } from '../src'; -import { ScaffolderPage, LegacyScaffolderPage } from '../src/plugin'; +import { ScaffolderPage } from '../src/plugin'; import { discoveryApiRef, fetchApiRef, @@ -68,11 +68,6 @@ createDevApp() title: 'Create', element: , }) - .addPage({ - path: '/legacy-create', - title: 'Create (next)', - element: , - }) .addPage({ path: '/create-groups', title: 'Groups', @@ -91,22 +86,4 @@ createDevApp() /> ), }) - .addPage({ - path: '/legacy-create-groups', - title: 'Groups (next)', - element: ( - e.metadata.tags?.includes('techdocs') || false, - title: 'Techdocs', - }, - { - filter: e => e.metadata.tags?.includes('react') || false, - title: 'React', - }, - ]} - /> - ), - }) .render(); diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 48b83a5ecf..8652c380ba 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.17.1-next.1", + "version": "1.17.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,13 +10,13 @@ }, "exports": { ".": "./src/index.ts", - "./alpha": "./src/alpha.ts", + "./alpha": "./src/alpha.tsx", "./package.json": "./package.json" }, "typesVersions": { "*": { "alpha": [ - "src/alpha.ts" + "src/alpha.tsx" ], "package.json": [ "package.json" @@ -48,9 +48,11 @@ "dependencies": { "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", + "@backstage/core-compat-api": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", + "@backstage/frontend-plugin-api": "workspace:^", "@backstage/integration": "workspace:^", "@backstage/integration-react": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", diff --git a/plugins/scaffolder/src/alpha.tsx b/plugins/scaffolder/src/alpha.tsx new file mode 100644 index 0000000000..37e2978802 --- /dev/null +++ b/plugins/scaffolder/src/alpha.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 { + createApiExtension, + createApiFactory, + createNavItemExtension, + createPageExtension, + createPlugin, + discoveryApiRef, + fetchApiRef, + identityApiRef, +} from '@backstage/frontend-plugin-api'; +import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; +import { + compatWrapper, + convertLegacyRouteRef, + convertLegacyRouteRefs, +} from '@backstage/core-compat-api'; +import { scmIntegrationsApiRef } from '@backstage/integration-react'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; +import { ScaffolderClient } from './api'; +import { + registerComponentRouteRef, + rootRouteRef, + viewTechDocRouteRef, + selectedTemplateRouteRef, + scaffolderTaskRouteRef, + scaffolderListTaskRouteRef, + actionsRouteRef, + editRouteRef, +} from './routes'; + +export { + type FormProps, + type TemplateListPageProps, + type TemplateWizardPageProps, +} from './next'; + +const scaffolderApi = createApiExtension({ + factory: createApiFactory({ + api: scaffolderApiRef, + deps: { + discoveryApi: discoveryApiRef, + scmIntegrationsApi: scmIntegrationsApiRef, + fetchApi: fetchApiRef, + identityApi: identityApiRef, + }, + factory: ({ discoveryApi, scmIntegrationsApi, fetchApi, identityApi }) => + new ScaffolderClient({ + discoveryApi, + scmIntegrationsApi, + fetchApi, + identityApi, + }), + }), +}); + +const scaffolderPage = createPageExtension({ + routeRef: convertLegacyRouteRef(rootRouteRef), + defaultPath: '/create', + loader: () => + import('./components/Router').then(m => compatWrapper()), +}); + +const scaffolderNavItem = createNavItemExtension({ + routeRef: convertLegacyRouteRef(rootRouteRef), + title: 'Create...', + icon: CreateComponentIcon, +}); + +/** @alpha */ +export default createPlugin({ + id: 'scaffolder', + routes: convertLegacyRouteRefs({ + root: rootRouteRef, + selectedTemplate: selectedTemplateRouteRef, + ongoingTask: scaffolderTaskRouteRef, + actions: actionsRouteRef, + listTasks: scaffolderListTaskRouteRef, + edit: editRouteRef, + }), + externalRoutes: convertLegacyRouteRefs({ + registerComponent: registerComponentRouteRef, + viewTechDoc: viewTechDocRouteRef, + }), + extensions: [scaffolderApi, scaffolderPage, scaffolderNavItem], +}); diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx index 5a78cf6195..51844f02ff 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx @@ -72,7 +72,7 @@ export const RepoUrlPickerHost = (props: { > - handleSelectionChange( - e.target.value as LegacyFieldExtensionOptions, - ) - } - > - {fieldOptions.map((option, idx) => ( - - {option.name} - - ))} - - - - - - -
-
- - - -
handleFieldConfigChange(e.formData)} - validator={validator} - schema={selectedField.schema?.uiOptions || {}} - experimental_defaultFormStateBehavior={{ - allOf: 'populateDefaults', - }} - > - -
-
-
-
-
- - - - - - - null} - /> -
- - ); -}; diff --git a/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateEditor.tsx b/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateEditor.tsx deleted file mode 100644 index f6e7b38d7d..0000000000 --- a/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateEditor.tsx +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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 { makeStyles } from '@material-ui/core'; -import React, { useState } from 'react'; -import { LegacyFieldExtensionOptions } from '@backstage/plugin-scaffolder-react/alpha'; -import { TemplateDirectoryAccess } from '../../lib/filesystem'; -import { LayoutOptions } from '@backstage/plugin-scaffolder-react'; -import { DirectoryEditorProvider } from '../../next/TemplateEditorPage/DirectoryEditorContext'; -import { DryRunProvider } from '../../next/TemplateEditorPage/DryRunContext'; -import { TemplateEditorBrowser } from '../../next/TemplateEditorPage/TemplateEditorBrowser'; -import { TemplateEditorTextArea } from '../../next/TemplateEditorPage/TemplateEditorTextArea'; -import { TemplateEditorForm } from './TemplateEditorForm'; -import { DryRunResults } from '../../next/TemplateEditorPage/DryRunResults'; - -const useStyles = makeStyles({ - // Reset and fix sizing to make sure scrolling behaves correctly - root: { - gridArea: 'pageContent', - - display: 'grid', - gridTemplateAreas: ` - "browser editor preview" - "results results results" - `, - gridTemplateColumns: '1fr 3fr 2fr', - gridTemplateRows: '1fr auto', - }, - browser: { - gridArea: 'browser', - overflow: 'auto', - }, - editor: { - gridArea: 'editor', - overflow: 'auto', - }, - preview: { - gridArea: 'preview', - overflow: 'auto', - }, - results: { - gridArea: 'results', - }, -}); - -export const TemplateEditor = (props: { - directory: TemplateDirectoryAccess; - fieldExtensions?: LegacyFieldExtensionOptions[]; - layouts?: LayoutOptions[]; - onClose?: () => void; -}) => { - const classes = useStyles(); - - const [errorText, setErrorText] = useState(); - - return ( - - -
-
- -
-
- -
-
- -
-
- -
-
-
-
- ); -}; diff --git a/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateEditorForm.tsx b/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateEditorForm.tsx deleted file mode 100644 index df05efc921..0000000000 --- a/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateEditorForm.tsx +++ /dev/null @@ -1,261 +0,0 @@ -/* - * 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 { useApiHolder } from '@backstage/core-plugin-api'; -import { JsonObject, JsonValue } from '@backstage/types'; -import { makeStyles } from '@material-ui/core/styles'; -import React, { Component, ReactNode, useMemo, useState } from 'react'; -import useDebounce from 'react-use/lib/useDebounce'; -import yaml from 'yaml'; -import { - LayoutOptions, - TemplateParameterSchema, -} from '@backstage/plugin-scaffolder-react'; - -import { useDryRun } from '../../next/TemplateEditorPage/DryRunContext'; -import { useDirectoryEditor } from '../../next/TemplateEditorPage/DirectoryEditorContext'; -import { MultistepJsonForm } from '../MultistepJsonForm'; -import { createValidator } from '../TemplatePage'; -import { LegacyFieldExtensionOptions } from '@backstage/plugin-scaffolder-react/alpha'; - -const useStyles = makeStyles({ - containerWrapper: { - position: 'relative', - width: '100%', - height: '100%', - }, - container: { - position: 'absolute', - top: 0, - bottom: 0, - left: 0, - right: 0, - overflow: 'auto', - }, -}); - -interface ErrorBoundaryProps { - invalidator: unknown; - setErrorText(errorText: string | undefined): void; - children: ReactNode; -} - -interface ErrorBoundaryState { - shouldRender: boolean; -} - -class ErrorBoundary extends Component { - state = { - shouldRender: true, - }; - - componentDidUpdate(prevProps: { invalidator: unknown }) { - if (prevProps.invalidator !== this.props.invalidator) { - this.setState({ shouldRender: true }); - } - } - - componentDidCatch(error: Error) { - this.props.setErrorText(error.message); - this.setState({ shouldRender: false }); - } - - render() { - return this.state.shouldRender ? this.props.children : null; - } -} - -interface TemplateEditorFormProps { - content?: string; - /** Setting this to true will cause the content to be parsed as if it is the template entity spec */ - contentIsSpec?: boolean; - data: JsonObject; - onUpdate: (data: JsonObject) => void; - setErrorText: (errorText?: string) => void; - - onDryRun?: (data: JsonObject) => Promise; - fieldExtensions?: LegacyFieldExtensionOptions[]; - layouts?: LayoutOptions[]; -} - -function isJsonObject(value: JsonValue | undefined): value is JsonObject { - return typeof value === 'object' && value !== null && !Array.isArray(value); -} - -/** Shows the a template form that is parsed from the provided content */ -export function TemplateEditorForm(props: TemplateEditorFormProps) { - const { - content, - contentIsSpec, - data, - onUpdate, - onDryRun, - setErrorText, - fieldExtensions = [], - layouts = [], - } = props; - const classes = useStyles(); - const apiHolder = useApiHolder(); - - const [steps, setSteps] = useState(); - - const fields = useMemo(() => { - return Object.fromEntries( - fieldExtensions.map(({ name, component }) => [name, component]), - ); - }, [fieldExtensions]); - - useDebounce( - () => { - try { - if (!content) { - setSteps(undefined); - return; - } - const parsed: JsonValue = yaml - .parseAllDocuments(content) - .filter(c => c) - .map(c => c.toJSON())[0]; - - if (!isJsonObject(parsed)) { - setSteps(undefined); - return; - } - - let rootObj = parsed; - if (!contentIsSpec) { - const isTemplate = - String(parsed.kind).toLocaleLowerCase('en-US') === 'template'; - if (!isTemplate) { - setSteps(undefined); - return; - } - - rootObj = isJsonObject(parsed.spec) ? parsed.spec : {}; - } - - const { parameters } = rootObj; - - if (!Array.isArray(parameters)) { - setErrorText('Template parameters must be an array'); - setSteps(undefined); - return; - } - - const fieldValidators = Object.fromEntries( - fieldExtensions.map(({ name, validation }) => [name, validation]), - ); - - setErrorText(); - setSteps( - parameters.flatMap(param => - isJsonObject(param) - ? [ - { - title: String(param.title), - schema: param, - validate: createValidator(param, fieldValidators, { - apiHolder, - }), - }, - ] - : [], - ), - ); - } catch (e) { - setErrorText(e.message); - } - }, - 250, - [contentIsSpec, content, apiHolder], - ); - - if (!steps) { - return null; - } - - return ( -
-
- - onUpdate(e.formData)} - onReset={() => onUpdate({})} - finishButtonLabel={onDryRun && 'Try It'} - onFinish={onDryRun && (() => onDryRun(data))} - layouts={layouts} - /> - -
-
- ); -} - -/** A version of the TemplateEditorForm that is connected to the DirectoryEditor and DryRun contexts */ -export function TemplateEditorFormDirectoryEditorDryRun( - props: Pick< - TemplateEditorFormProps, - 'setErrorText' | 'fieldExtensions' | 'layouts' - >, -) { - const { setErrorText, fieldExtensions = [], layouts } = props; - const dryRun = useDryRun(); - - const directoryEditor = useDirectoryEditor(); - const { selectedFile } = directoryEditor; - - const [data, setData] = useState({}); - - const handleDryRun = async () => { - if (!selectedFile) { - return; - } - - try { - await dryRun.execute({ - templateContent: selectedFile.content, - values: data, - files: directoryEditor.files, - }); - setErrorText(); - } catch (e) { - setErrorText(String(e.cause || e)); - throw e; - } - }; - - const content = - selectedFile && selectedFile.path.match(/\.ya?ml$/) - ? selectedFile.content - : undefined; - - return ( - - ); -} - -TemplateEditorForm.DirectoryEditorDryRun = - TemplateEditorFormDirectoryEditorDryRun; diff --git a/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateEditorPage.tsx b/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateEditorPage.tsx deleted file mode 100644 index 127c73dcf5..0000000000 --- a/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateEditorPage.tsx +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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 React, { useState } from 'react'; -import { Content, Header, Page } from '@backstage/core-components'; -import { - TemplateDirectoryAccess, - WebFileSystemAccess, -} from '../../lib/filesystem'; -import { type LayoutOptions } from '@backstage/plugin-scaffolder-react'; -import { LegacyFieldExtensionOptions } from '@backstage/plugin-scaffolder-react/alpha'; -import { TemplateEditorIntro } from '../../next/TemplateEditorPage/TemplateEditorIntro'; -import { TemplateEditor } from './TemplateEditor'; -import { TemplateFormPreviewer } from './TemplateFormPreviewer'; -import { CustomFieldExplorer } from './CustomFieldExplorer'; - -type Selection = - | { - type: 'local'; - directory: TemplateDirectoryAccess; - } - | { - type: 'form'; - } - | { - type: 'field-explorer'; - }; - -interface TemplateEditorPageProps { - defaultPreviewTemplate?: string; - customFieldExtensions?: LegacyFieldExtensionOptions[]; - layouts?: LayoutOptions[]; -} - -export function TemplateEditorPage(props: TemplateEditorPageProps) { - const [selection, setSelection] = useState(); - - let content: JSX.Element | null = null; - if (selection?.type === 'local') { - content = ( - setSelection(undefined)} - layouts={props.layouts} - /> - ); - } else if (selection?.type === 'form') { - content = ( - setSelection(undefined)} - layouts={props.layouts} - /> - ); - } else if (selection?.type === 'field-explorer') { - content = ( - setSelection(undefined)} - /> - ); - } else { - content = ( - - { - if (option === 'local') { - WebFileSystemAccess.requestDirectoryAccess() - .then(directory => setSelection({ type: 'local', directory })) - .catch(() => {}); - } else if (option === 'form') { - setSelection({ type: 'form' }); - } else if (option === 'field-explorer') { - setSelection({ type: 'field-explorer' }); - } - }} - /> - - ); - } - - return ( - -
- {content} - - ); -} diff --git a/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateFormPreviewer.tsx b/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateFormPreviewer.tsx deleted file mode 100644 index 9e92d12d93..0000000000 --- a/plugins/scaffolder/src/legacy/TemplateEditorPage/TemplateFormPreviewer.tsx +++ /dev/null @@ -1,221 +0,0 @@ -/* - * 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 { Entity } from '@backstage/catalog-model'; -import { alertApiRef, useApi } from '@backstage/core-plugin-api'; -import { - catalogApiRef, - humanizeEntityRef, -} from '@backstage/plugin-catalog-react'; -import { - FormControl, - IconButton, - InputLabel, - LinearProgress, - makeStyles, - MenuItem, - Select, -} from '@material-ui/core'; -import CloseIcon from '@material-ui/icons/Close'; -import React, { useCallback, useState } from 'react'; -import useAsync from 'react-use/lib/useAsync'; -import yaml from 'yaml'; -import { LayoutOptions } from '@backstage/plugin-scaffolder-react'; -import { LegacyFieldExtensionOptions } from '@backstage/plugin-scaffolder-react/alpha'; -import { TemplateEditorTextArea } from '../../next/TemplateEditorPage/TemplateEditorTextArea'; -import { TemplateEditorForm } from './TemplateEditorForm'; - -const EXAMPLE_TEMPLATE_PARAMS_YAML = `# Edit the template parameters below to see how they will render in the scaffolder form UI -parameters: - - title: Fill in some steps - required: - - name - properties: - name: - title: Name - type: string - description: Unique name of the component - owner: - title: Owner - type: string - description: Owner of the component - ui:field: OwnerPicker - ui:options: - catalogFilter: - kind: Group - - title: Choose a location - required: - - repoUrl - properties: - repoUrl: - title: Repository Location - type: string - ui:field: RepoUrlPicker - ui:options: - allowedHosts: - - github.com -steps: - - id: fetch-base - name: Fetch Base - action: fetch:template - input: - url: ./template - values: - name: \${{parameters.name}} -`; - -type TemplateOption = { - label: string; - value: Entity; -}; - -const useStyles = makeStyles(theme => ({ - root: { - gridArea: 'pageContent', - display: 'grid', - gridTemplateAreas: ` - "controls controls" - "textArea preview" - `, - gridTemplateRows: 'auto 1fr', - gridTemplateColumns: '1fr 1fr', - }, - controls: { - gridArea: 'controls', - display: 'flex', - flexFlow: 'row nowrap', - alignItems: 'center', - margin: theme.spacing(1), - }, - textArea: { - gridArea: 'textArea', - }, - preview: { - gridArea: 'preview', - }, -})); - -export const TemplateFormPreviewer = ({ - defaultPreviewTemplate = EXAMPLE_TEMPLATE_PARAMS_YAML, - customFieldExtensions = [], - onClose, - layouts = [], -}: { - defaultPreviewTemplate?: string; - customFieldExtensions?: LegacyFieldExtensionOptions[]; - onClose?: () => void; - layouts?: LayoutOptions[]; -}) => { - const classes = useStyles(); - const alertApi = useApi(alertApiRef); - const catalogApi = useApi(catalogApiRef); - const [selectedTemplate, setSelectedTemplate] = useState(''); - const [errorText, setErrorText] = useState(); - const [templateOptions, setTemplateOptions] = useState([]); - const [templateYaml, setTemplateYaml] = useState(defaultPreviewTemplate); - const [formState, setFormState] = useState({}); - - const { loading } = useAsync( - () => - catalogApi - .getEntities({ - filter: { kind: 'template' }, - fields: [ - 'kind', - 'metadata.namespace', - 'metadata.name', - 'metadata.title', - 'spec.parameters', - 'spec.steps', - 'spec.output', - ], - }) - .then(({ items }) => - setTemplateOptions( - items.map(template => ({ - label: - template.metadata.title ?? - humanizeEntityRef(template, { defaultKind: 'template' }), - value: template, - })), - ), - ) - .catch(e => - alertApi.post({ - message: `Error loading exisiting templates: ${e.message}`, - severity: 'error', - }), - ), - [catalogApi], - ); - - const handleSelectChange = useCallback( - // TODO(Rugvip): Afaik this should be Entity, but didn't want to make runtime changes while fixing types - (selected: any) => { - setSelectedTemplate(selected); - setTemplateYaml(yaml.stringify(selected.spec)); - }, - [setTemplateYaml], - ); - - return ( - <> - {loading && } -
-
- - - Load Existing Template - - - - - - - -
-
- -
-
- -
-
- - ); -}; diff --git a/plugins/scaffolder/src/legacy/TemplateList/TemplateList.test.tsx b/plugins/scaffolder/src/legacy/TemplateList/TemplateList.test.tsx deleted file mode 100644 index c65613d2f5..0000000000 --- a/plugins/scaffolder/src/legacy/TemplateList/TemplateList.test.tsx +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { screen } from '@testing-library/react'; -import React from 'react'; -import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; -import { TemplateList } from './TemplateList'; -import { rootRouteRef } from '../../routes'; -import { - ScmIntegrationsApi, - scmIntegrationsApiRef, -} from '@backstage/integration-react'; -import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; - -jest.mock('@backstage/plugin-catalog-react', () => ({ - useEntityList: jest.fn().mockReturnValue({ - loading: false, - entities: [ - { - apiVersion: 'scaffolder.backstage.io/v1beta3', - kind: 'Template', - metadata: { - name: 't1', - }, - spec: {}, - }, - { - apiVersion: 'scaffolder.backstage.io/v1beta3', - kind: 'Template', - metadata: { - name: 't2', - }, - spec: {}, - }, - ], - }), - getEntityRelations: jest.fn().mockImplementation(() => []), - getEntitySourceLocation: jest.fn().mockImplementation(() => ({})), -})); - -describe('TemplateList', () => { - const mockIntegrationsApi: Partial = { - byHost: () => ({ type: 'github' }), - }; - - it('should filter out templates based on provided filter condition', async () => { - const TemplateCardComponent = ({ - template, - }: { - template: TemplateEntityV1beta3; - }) => ( -
{template.metadata.name}
- ); - - await renderInTestApp( - -
- e.metadata.name === 't1'} - TemplateCardComponent={TemplateCardComponent} - /> -
-
, - { mountedRoutes: { '/': rootRouteRef } }, - ); - - expect(() => screen.getByTestId('t2')).toThrow(); - expect(screen.getByTestId('t1')).toBeDefined(); - }); -}); diff --git a/plugins/scaffolder/src/legacy/TemplateList/TemplateList.tsx b/plugins/scaffolder/src/legacy/TemplateList/TemplateList.tsx deleted file mode 100644 index c925cdf6ef..0000000000 --- a/plugins/scaffolder/src/legacy/TemplateList/TemplateList.tsx +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React, { ComponentType } from 'react'; -import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; -import { - isTemplateEntityV1beta3, - TemplateEntityV1beta3, -} from '@backstage/plugin-scaffolder-common'; -import { - Content, - ContentHeader, - ItemCardGrid, - Link, - Progress, - WarningPanel, -} from '@backstage/core-components'; -import { useEntityList } from '@backstage/plugin-catalog-react'; -import { Typography } from '@material-ui/core'; -import { TemplateCard } from '../TemplateCard'; - -/** - * @internal - */ -export type TemplateListProps = { - TemplateCardComponent?: - | ComponentType<{ template: TemplateEntityV1beta3 }> - | undefined; - group?: { - title?: React.ReactNode; - filter: (entity: TemplateEntityV1beta3) => boolean; - }; - templateFilter?: (entity: TemplateEntityV1beta3) => boolean; -}; - -/** - * @internal - */ -export const TemplateList = ({ - TemplateCardComponent, - group, - templateFilter, -}: TemplateListProps) => { - const { loading, error, entities } = useEntityList(); - const Card = TemplateCardComponent || TemplateCard; - const templateEntities = entities.filter(isTemplateEntityV1beta3); - const maybeFilteredEntities = ( - group ? templateEntities.filter(group.filter) : templateEntities - ).filter(e => (templateFilter ? templateFilter(e) : true)); - - const titleComponent: React.ReactNode = (() => { - if (group && group.title) { - if (typeof group.title === 'string') { - return ; - } - return group.title; - } - - return ; - })(); - - if (group && maybeFilteredEntities.length === 0) { - return null; - } - return ( - <> - {loading && } - - {error && ( - - {error.message} - - )} - - {!error && !loading && !entities.length && ( - - No templates found that match your filter. Learn more about{' '} - - adding templates - - . - - )} - - - {titleComponent} - - {maybeFilteredEntities && - maybeFilteredEntities?.length > 0 && - maybeFilteredEntities.map((template: Entity) => ( - - ))} - - - - ); -}; diff --git a/plugins/scaffolder/src/legacy/TemplateList/index.ts b/plugins/scaffolder/src/legacy/TemplateList/index.ts deleted file mode 100644 index 0b62f9cbb1..0000000000 --- a/plugins/scaffolder/src/legacy/TemplateList/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export { TemplateList } from './TemplateList'; -export type { TemplateListProps } from './TemplateList'; diff --git a/plugins/scaffolder/src/legacy/TemplatePage/TemplatePage.test.tsx b/plugins/scaffolder/src/legacy/TemplatePage/TemplatePage.test.tsx deleted file mode 100644 index 344929fa43..0000000000 --- a/plugins/scaffolder/src/legacy/TemplatePage/TemplatePage.test.tsx +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - MockAnalyticsApi, - renderInTestApp, - TestApiRegistry, -} from '@backstage/test-utils'; -import { act, fireEvent, screen, within } from '@testing-library/react'; -import React from 'react'; -import { Route, Routes } from 'react-router-dom'; -import { - scaffolderApiRef, - ScaffolderApi, - SecretsContextProvider, -} from '@backstage/plugin-scaffolder-react'; -import { TemplatePage } from './TemplatePage'; -import { - featureFlagsApiRef, - FeatureFlagsApi, - analyticsApiRef, -} from '@backstage/core-plugin-api'; -import { ApiProvider } from '@backstage/core-app-api'; -import { errorApiRef } from '@backstage/core-plugin-api'; -import { rootRouteRef } from '../../routes'; - -jest.mock('react-router-dom', () => { - return { - ...(jest.requireActual('react-router-dom') as any), - useParams: () => ({ - templateName: 'test', - }), - }; -}); - -const scaffolderApiMock: jest.Mocked = { - cancelTask: jest.fn(), - scaffold: jest.fn(), - getTemplateParameterSchema: jest.fn(), - getIntegrationsList: jest.fn(), - getTask: jest.fn(), - streamLogs: jest.fn(), - listActions: jest.fn(), - listTasks: jest.fn(), -}; - -const featureFlagsApiMock: jest.Mocked = { - isActive: jest.fn(), - registerFlag: jest.fn(), - getRegisteredFlags: jest.fn(), - save: jest.fn(), -}; - -const errorApiMock = { post: jest.fn(), error$: jest.fn() }; - -const analyticsMock = new MockAnalyticsApi(); - -const schemaMockValue = { - title: 'my-schema', - steps: [ - { - title: 'Fill in some steps', - schema: { - title: 'Fill in some steps', - 'backstage:featureFlag': 'experimental-feature', - properties: { - name: { - title: 'Name', - type: 'string', - 'backstage:featureFlag': 'should-show-some-stuff-first-option', - }, - description: { - title: 'Description', - type: 'string', - description: 'A description for the component', - }, - owner: { - title: 'Owner', - type: 'string', - description: 'Owner of the component', - }, - }, - type: 'object', - }, - }, - { - title: 'Send data', - schema: { - title: 'Send data', - properties: { - user: { - title: 'User', - type: 'string', - }, - }, - type: 'object', - }, - }, - ], -}; - -const apis = TestApiRegistry.from( - [scaffolderApiRef, scaffolderApiMock], - [errorApiRef, errorApiMock], - [featureFlagsApiRef, featureFlagsApiMock], - [analyticsApiRef, analyticsMock], -); - -describe('TemplatePage', () => { - beforeEach(() => jest.resetAllMocks()); - - it('renders correctly', async () => { - scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue({ - title: 'React SSR Template', - steps: [], - }); - const rendered = await renderInTestApp( - - - - - , - { - mountedRoutes: { - '/create': rootRouteRef, - }, - }, - ); - - expect(rendered.getByText('Create a New Component')).toBeInTheDocument(); - expect(rendered.getByText('React SSR Template')).toBeInTheDocument(); - }); - - it('renders spinner while loading', async () => { - let resolve: Function; - const promise = new Promise(res => { - resolve = res; - }); - scaffolderApiMock.getTemplateParameterSchema.mockReturnValueOnce(promise); - const rendered = await renderInTestApp( - - - - - , - { - mountedRoutes: { - '/create': rootRouteRef, - }, - }, - ); - - expect(rendered.getByText('Create a New Component')).toBeInTheDocument(); - expect(rendered.getByTestId('loading-progress')).toBeInTheDocument(); - - await act(async () => { - resolve!({ - title: 'React SSR Template', - steps: [], - }); - }); - }); - - it('captures expected analytics events', async () => { - scaffolderApiMock.scaffold.mockResolvedValue({ taskId: 'xyz' }); - scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue({ - title: 'schema-4-analytics', - steps: [ - { - title: 'Fill in some steps', - schema: { - properties: { - name: { - title: 'Name', - type: 'string', - }, - }, - required: ['name'], - }, - }, - ], - }); - const { findByLabelText, findByText } = await renderInTestApp( - - - - - , - { - mountedRoutes: { - '/create': rootRouteRef, - }, - }, - ); - - // Fill out the name field - expect(await findByText('Fill in some steps')).toBeInTheDocument(); - fireEvent.change(await findByLabelText('Name', { exact: false }), { - target: { value: 'expected-name' }, - }); - - // Go to the final page - fireEvent.click(await findByText('Next step')); - expect(await findByText('Reset')).toBeInTheDocument(); - - // Create the software - await act(async () => { - fireEvent.click(await findByText('Create')); - }); - - // The "Next Step" button should have fired an event - expect(analyticsMock.getEvents()[0]).toMatchObject({ - action: 'click', - subject: 'Next Step (1)', - context: { entityRef: 'template:default/test' }, - }); - - // And the "Create" button should have fired an event - expect(analyticsMock.getEvents()[1]).toMatchObject({ - action: 'create', - subject: 'expected-name', - context: { entityRef: 'template:default/test' }, - }); - }); - - it('navigates away if no template was loaded', async () => { - scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue( - undefined as any, - ); - - const rendered = await renderInTestApp( - - - - - - } - /> - This is root} /> - - , - { - routeEntries: ['/create'], - mountedRoutes: { '/create': rootRouteRef }, - }, - ); - - expect( - rendered.queryByText('Create a New Component'), - ).not.toBeInTheDocument(); - expect(rendered.getByText('This is root')).toBeInTheDocument(); - }); - - it('display template with oneOf', async () => { - scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue({ - title: 'my-schema', - steps: [ - { - title: 'Fill in some steps', - schema: { - oneOf: [ - { - title: 'First', - properties: { - name: { - title: 'Name', - type: 'string', - }, - }, - required: ['name'], - }, - { - title: 'Second', - properties: { - something: { - title: 'Something', - type: 'string', - }, - }, - required: ['something'], - }, - ], - }, - }, - ], - }); - - const { findByText, findByLabelText, findAllByRole, findByRole } = - await renderInTestApp( - - - - - , - { - mountedRoutes: { - '/create/actions': rootRouteRef, - }, - }, - ); - - expect(await findByText('Fill in some steps')).toBeInTheDocument(); - - // Fill the first option - fireEvent.change(await findByLabelText('Name', { exact: false }), { - target: { value: 'my-name' }, - }); - - // Switch to second option - fireEvent.mouseDown((await findAllByRole('button'))[0]); - const listbox = within(await findByRole('listbox')); - fireEvent.click(listbox.getByText(/Second/i)); - - // Fill the second option - fireEvent.change(await findByLabelText('Something', { exact: false }), { - target: { value: 'my-something' }, - }); - - // Go to the final page - fireEvent.click(await findByText('Next step')); - expect(await findByText('Reset')).toBeInTheDocument(); - }); - - it('should display a section or property based on a feature flag', async () => { - featureFlagsApiMock.isActive.mockImplementation(flag => { - return flag === 'experimental-feature'; - }); - scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue( - schemaMockValue, - ); - - await renderInTestApp( - - - - - , - { - mountedRoutes: { - '/create/actions': rootRouteRef, - }, - }, - ); - - expect(screen.queryByText('Name')).not.toBeInTheDocument(); - expect(screen.getByText('Description')).toBeInTheDocument(); - expect(screen.getByText('Owner')).toBeInTheDocument(); - expect(screen.getByText('Send data')).toBeInTheDocument(); - }); -}); diff --git a/plugins/scaffolder/src/legacy/TemplatePage/TemplatePage.tsx b/plugins/scaffolder/src/legacy/TemplatePage/TemplatePage.tsx deleted file mode 100644 index ffb754bae3..0000000000 --- a/plugins/scaffolder/src/legacy/TemplatePage/TemplatePage.tsx +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { LinearProgress } from '@material-ui/core'; -import { IChangeEvent } from '@rjsf/core'; -import qs from 'qs'; -import React, { ComponentType, useCallback, useState } from 'react'; -import { Navigate, useNavigate } from 'react-router-dom'; -import useAsync from 'react-use/lib/useAsync'; -import { - type LayoutOptions, - scaffolderApiRef, - useTemplateSecrets, - ReviewStepProps, -} from '@backstage/plugin-scaffolder-react'; -import { MultistepJsonForm } from '../MultistepJsonForm'; -import { createValidator } from './createValidator'; - -import { Content, Header, InfoCard, Page } from '@backstage/core-components'; -import { - AnalyticsContext, - errorApiRef, - useApi, - useApiHolder, - useRouteRef, - useRouteRefParams, -} from '@backstage/core-plugin-api'; -import { stringifyEntityRef } from '@backstage/catalog-model'; -import { - rootRouteRef, - scaffolderTaskRouteRef, - selectedTemplateRouteRef, -} from '../../routes'; -import { LegacyFieldExtensionOptions } from '@backstage/plugin-scaffolder-react/alpha'; - -const useTemplateParameterSchema = (templateRef: string) => { - const scaffolderApi = useApi(scaffolderApiRef); - const { value, loading, error } = useAsync( - () => scaffolderApi.getTemplateParameterSchema(templateRef), - [scaffolderApi, templateRef], - ); - return { schema: value, loading, error }; -}; - -type Props = { - ReviewStepComponent?: ComponentType; - customFieldExtensions?: LegacyFieldExtensionOptions[]; - layouts?: LayoutOptions[]; - headerOptions?: { - pageTitleOverride?: string; - title?: string; - subtitle?: string; - }; -}; - -export const TemplatePage = ({ - ReviewStepComponent, - customFieldExtensions = [], - layouts = [], - headerOptions, -}: Props) => { - const apiHolder = useApiHolder(); - const secretsContext = useTemplateSecrets(); - const errorApi = useApi(errorApiRef); - const scaffolderApi = useApi(scaffolderApiRef); - const { templateName, namespace } = useRouteRefParams( - selectedTemplateRouteRef, - ); - const templateRef = stringifyEntityRef({ - name: templateName, - kind: 'template', - namespace, - }); - const navigate = useNavigate(); - const scaffolderTaskRoute = useRouteRef(scaffolderTaskRouteRef); - const rootRoute = useRouteRef(rootRouteRef); - const { schema, loading, error } = useTemplateParameterSchema(templateRef); - const [formState, setFormState] = useState>(() => { - const query = qs.parse(window.location.search, { - ignoreQueryPrefix: true, - }); - - try { - return JSON.parse(query.formData as string); - } catch (e) { - return query.formData ?? {}; - } - }); - const handleFormReset = () => setFormState({}); - const handleChange = useCallback( - (e: IChangeEvent) => setFormState(e.formData), - [setFormState], - ); - - const handleCreate = async () => { - const { taskId } = await scaffolderApi.scaffold({ - templateRef, - values: formState, - secrets: secretsContext?.secrets, - }); - - const formParams = qs.stringify( - { formData: formState }, - { addQueryPrefix: true }, - ); - const newUrl = `${window.location.pathname}${formParams}`; - // We use direct history manipulation since useSearchParams and - // useNavigate in react-router-dom cause unnecessary extra rerenders. - // Also make sure to replace the state rather than pushing to avoid - // extra back/forward slots. - window.history?.replaceState(null, document.title, newUrl); - - navigate(scaffolderTaskRoute({ taskId })); - }; - - if (error) { - errorApi.post(new Error(`Failed to load template, ${error}`)); - return ; - } - if (!loading && !schema) { - errorApi.post(new Error('Template was not found.')); - return ; - } - - const customFieldComponents = Object.fromEntries( - customFieldExtensions.map(({ name, component }) => [name, component]), - ); - - const customFieldValidators = Object.fromEntries( - customFieldExtensions.map(({ name, validation }) => [name, validation]), - ); - - return ( - - -
- - {loading && } - {schema && ( - - { - return { - ...step, - validate: createValidator( - step.schema, - customFieldValidators, - { apiHolder }, - ), - }; - })} - /> - - )} - - - - ); -}; diff --git a/plugins/scaffolder/src/legacy/TemplatePage/createValidator.test.ts b/plugins/scaffolder/src/legacy/TemplatePage/createValidator.test.ts deleted file mode 100644 index d6a5cd7499..0000000000 --- a/plugins/scaffolder/src/legacy/TemplatePage/createValidator.test.ts +++ /dev/null @@ -1,200 +0,0 @@ -/* - * 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 { createValidator } from './createValidator'; -import { LegacyCustomFieldValidator } from '@backstage/plugin-scaffolder-react/alpha'; -import { ApiHolder } from '@backstage/core-plugin-api'; -import { FieldValidation, FormValidation } from '@rjsf/utils'; - -type CustomLinkType = { - url: string; - title: string; - icon: string; -}; - -describe('createValidator', () => { - const validators: Record< - string, - undefined | LegacyCustomFieldValidator - > = { - CustomPicker: ( - value: unknown, - fieldValidation: FieldValidation, - _context: { apiHolder: ApiHolder }, - ) => { - if (!value || !(value as { value?: unknown }).value) { - fieldValidation.addError('Error !'); - } - }, - CustomLink: ( - values: unknown, - fieldValidation: FieldValidation, - _context: { apiHolder: ApiHolder }, - ) => { - const input = values as CustomLinkType[]; - for (const item of input) { - const validGitlabUrlRegex = - /gitlab\.(?:stg\.)?spotify\.com\?owner=.*&repo=.*/; - - if (!item || !validGitlabUrlRegex.test(item.url)) { - fieldValidation.addError( - `Make sure to put in a valid gitlab clone url.`, - ); - } - } - }, - TagPicker: ( - values: unknown, - fieldValidation: FieldValidation, - _context: { apiHolder: ApiHolder }, - ) => { - const input = values as string[]; - for (const item of input) { - if (!/^[a-z0-9-]+$/.test(item)) { - fieldValidation.addError( - 'A tag name can only contain lowercase letters, numeric characters or dashes', - ); - } - } - }, - }; - - const apiHolderMock: jest.Mocked = { - get: jest.fn().mockImplementation(() => { - return null; - }), - }; - - const context = { - apiHolder: apiHolderMock, - }; - - it('should call validator for object property from a custom field extension', () => { - /* GIVEN */ - const rootSchema = { - title: 'Title', - properties: { - p1: { - title: 'PropertyOn', - type: 'object', - 'ui:field': 'CustomPicker', - }, - }, - }; - const validator = createValidator(rootSchema, validators, context); - - const formData = { - p1: {}, - }; - const errors = { - addError: jest.fn(), - p1: { - addError: jest.fn(), - } as unknown as FormValidation, - } as unknown as FormValidation; - - /* WHEN */ - const result = validator(formData, errors); - - /* THEN */ - expect(result).not.toBeNull(); - expect(result.p1?.addError).toHaveBeenCalledTimes(1); - }); - - it('should call validator for array property from a custom field extension', () => { - /* GIVEN */ - const rootSchema = { - title: 'My form', - properties: { - tags: { - title: 'Tags', - type: 'array', - items: { - type: 'string', - 'ui:field': 'TagPicker', - }, - }, - }, - }; - const validator = createValidator(rootSchema, validators, context); - - const formData = { - tags: ['invalid-tag$$'], - }; - const errors = { - addError: jest.fn(), - tags: { - addError: jest.fn(), - } as unknown as FormValidation, - } as unknown as FormValidation; - - /* WHEN */ - const result = validator(formData, errors); - - /* THEN */ - expect(result).not.toBeNull(); - expect(result.tags?.addError).toHaveBeenCalledTimes(1); - }); - - it('should call validator for array object property from a custom field extension', () => { - /* GIVEN */ - const rootSchema = { - title: 'My links', - properties: { - links: { - title: 'Links', - type: 'array', - items: { - type: 'object', - required: ['url', 'title', 'icon'], - properties: { - url: { - title: 'url', - description: 'url', - type: 'object', - 'ui:field': 'CustomLink', - }, - }, - }, - }, - }, - }; - const validator = createValidator(rootSchema, validators, context); - - const formData = { - links: [ - { - url: 'http://gitlab.spotify.nl/owener=me&repo=test', - icon: 'subject', - title: 'My repository for testing features', - } as CustomLinkType, - ], - }; - const errors = { - addError: jest.fn(), - links: { - addError: jest.fn(), - } as unknown as FormValidation, - } as unknown as FormValidation; - - /* WHEN */ - const result = validator(formData, errors); - - /* THEN */ - expect(result).not.toBeNull(); - expect(result.links?.addError).toHaveBeenCalledTimes(1); - }); -}); diff --git a/plugins/scaffolder/src/legacy/TemplatePage/createValidator.ts b/plugins/scaffolder/src/legacy/TemplatePage/createValidator.ts deleted file mode 100644 index ae0b834fe9..0000000000 --- a/plugins/scaffolder/src/legacy/TemplatePage/createValidator.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* - * 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 { LegacyCustomFieldValidator } from '@backstage/plugin-scaffolder-react/alpha'; -import { FieldValidation, FormValidation } from '@rjsf/utils'; -import { JsonObject, JsonValue } from '@backstage/types'; -import { ApiHolder } from '@backstage/core-plugin-api'; - -function isObject(obj: unknown): obj is JsonObject { - return typeof obj === 'object' && obj !== null && !Array.isArray(obj); -} - -function isArray(obj: unknown): obj is JsonObject { - return typeof obj === 'object' && obj !== null && Array.isArray(obj); -} - -export const createValidator = ( - rootSchema: JsonObject, - validators: Record>, - context: { - apiHolder: ApiHolder; - }, -) => { - function validate( - schema: JsonObject, - formData: JsonObject, - errors: FormValidation, - ) { - const schemaProps = schema.properties; - const customObject = schema.type === 'object' && schemaProps === undefined; - - if (!isObject(schemaProps) && !customObject) { - return; - } - - if (schemaProps) { - for (const [key, propData] of Object.entries(formData)) { - const propValidation = errors[key]; - - const doValidate = (item: JsonValue | undefined) => { - if (item && isObject(item)) { - const fieldName = item['ui:field'] as string; - if (fieldName && typeof validators[fieldName] === 'function') { - validators[fieldName]!( - propData as JsonObject[], - propValidation as FieldValidation, - context, - ); - } - } - }; - - const propSchemaProps = schemaProps[key]; - if (isObject(propData) && isObject(propSchemaProps)) { - validate( - propSchemaProps, - propData as JsonObject, - propValidation as FormValidation, - ); - } else if (isArray(propData)) { - if (isObject(propSchemaProps)) { - const { items } = propSchemaProps; - if (isObject(items)) { - if (items.type === 'object') { - const properties = (items?.properties ?? []) as JsonObject[]; - for (const [, value] of Object.entries(properties)) { - doValidate(value); - } - } else { - doValidate(items); - } - } - } - } else { - doValidate(propSchemaProps); - } - } - } else if (customObject) { - const fieldName = schema['ui:field'] as string; - if (fieldName && typeof validators[fieldName] === 'function') { - validators[fieldName]!(formData, errors, context); - } - } - } - - return (formData: JsonObject, errors: FormValidation) => { - validate(rootSchema, formData, errors); - return errors; - }; -}; diff --git a/plugins/scaffolder/src/legacy/TemplatePage/index.ts b/plugins/scaffolder/src/legacy/TemplatePage/index.ts deleted file mode 100644 index d3ae24504b..0000000000 --- a/plugins/scaffolder/src/legacy/TemplatePage/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export { TemplatePage } from './TemplatePage'; -export { createValidator } from './createValidator'; diff --git a/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/DryRunResultsView.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/DryRunResultsView.tsx index 68ed6f906f..fb69dabe13 100644 --- a/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/DryRunResultsView.tsx +++ b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/DryRunResultsView.tsx @@ -27,8 +27,8 @@ import React, { useEffect, useMemo, useState } from 'react'; import { useDryRun } from '../DryRunContext'; import { DryRunResultsSplitView } from './DryRunResultsSplitView'; import { FileBrowser } from '../../../components/FileBrowser'; -import { TaskPageLinks } from '../../../legacy/TaskPage/TaskPageLinks'; -import { TaskStatusStepper } from '../../../legacy/TaskPage/TaskPage'; +import { TaskPageLinks } from './TaskPageLinks'; +import { TaskStatusStepper } from './TaskStatusStepper'; const useStyles = makeStyles({ root: { diff --git a/plugins/scaffolder/src/legacy/TaskPage/IconLink.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/IconLink.tsx similarity index 97% rename from plugins/scaffolder/src/legacy/TaskPage/IconLink.tsx rename to plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/IconLink.tsx index dd0b3da876..6676c622fa 100644 --- a/plugins/scaffolder/src/legacy/TaskPage/IconLink.tsx +++ b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/IconLink.tsx @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * Copyright 2024 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. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import React from 'react'; import { Grid, LinkProps, makeStyles, Typography } from '@material-ui/core'; import LanguageIcon from '@material-ui/icons/Language'; diff --git a/plugins/scaffolder/src/legacy/TaskPage/TaskPageLinks.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskPageLinks.tsx similarity index 100% rename from plugins/scaffolder/src/legacy/TaskPage/TaskPageLinks.tsx rename to plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskPageLinks.tsx diff --git a/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskStatusStepper.tsx b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskStatusStepper.tsx new file mode 100644 index 0000000000..f776d133e0 --- /dev/null +++ b/plugins/scaffolder/src/next/TemplateEditorPage/DryRunResults/TaskStatusStepper.tsx @@ -0,0 +1,199 @@ +/* + * Copyright 2024 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 { memo } from 'react'; +import Step from '@material-ui/core/Step'; +import StepLabel from '@material-ui/core/StepLabel'; +import Stepper from '@material-ui/core/Stepper'; +import { ScaffolderTaskStatus } from '@backstage/plugin-scaffolder-react'; +import { + StepButton, + StepIconProps, + Theme, + createStyles, + makeStyles, + CircularProgress, +} from '@material-ui/core'; +import Cancel from '@material-ui/icons/Cancel'; +import Check from '@material-ui/icons/Check'; +import FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord'; +import Typography from '@material-ui/core/Typography'; +import { DateTime, Interval } from 'luxon'; +import useInterval from 'react-use/lib/useInterval'; +import humanizeDuration from 'humanize-duration'; +import classNames from 'classnames'; + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + root: { + width: '100%', + }, + button: { + marginBottom: theme.spacing(2), + marginLeft: theme.spacing(2), + }, + actionsContainer: { + marginBottom: theme.spacing(2), + }, + resetContainer: { + padding: theme.spacing(3), + }, + labelWrapper: { + display: 'flex', + flex: 1, + flexDirection: 'row', + justifyContent: 'space-between', + }, + stepWrapper: { + width: '100%', + }, + }), +); + +type TaskStep = { + id: string; + name: string; + status: ScaffolderTaskStatus; + startedAt?: string; + endedAt?: string; +}; + +const useStepIconStyles = makeStyles(theme => + createStyles({ + root: { + color: theme.palette.text.disabled, + display: 'flex', + height: 22, + alignItems: 'center', + }, + completed: { + color: theme.palette.status.ok, + }, + error: { + color: theme.palette.status.error, + }, + }), +); + +const StepTimeTicker = ({ step }: { step: TaskStep }) => { + const [time, setTime] = useState(''); + + useInterval(() => { + if (!step.startedAt) { + setTime(''); + return; + } + + const end = step.endedAt + ? DateTime.fromISO(step.endedAt) + : DateTime.local(); + + const startedAt = DateTime.fromISO(step.startedAt); + const formatted = Interval.fromDateTimes(startedAt, end) + .toDuration() + .valueOf(); + + setTime(humanizeDuration(formatted, { round: true })); + }, 1000); + + return {time}; +}; + +function TaskStepIconComponent(props: StepIconProps) { + const classes = useStepIconStyles(); + const { active, completed, error } = props; + + const getMiddle = () => { + if (active) { + return ; + } + if (completed) { + return ; + } + if (error) { + return ; + } + return ; + }; + + return ( +
+ {getMiddle()} +
+ ); +} + +export const TaskStatusStepper = memo( + (props: { + steps: TaskStep[]; + currentStepId: string | undefined; + onUserStepChange: (id: string) => void; + classes?: { + root?: string; + }; + }) => { + const { steps, currentStepId, onUserStepChange } = props; + const classes = useStyles(props); + + return ( +
+ s.id === currentStepId)} + orientation="vertical" + nonLinear + > + {steps.map((step, index) => { + const isCancelled = step.status === 'cancelled'; + const isActive = step.status === 'processing'; + const isCompleted = step.status === 'completed'; + const isFailed = step.status === 'failed'; + const isSkipped = step.status === 'skipped'; + + return ( + + onUserStepChange(step.id)}> + +
+ {step.name} + {isSkipped ? ( + Skipped + ) : ( + + )} +
+
+
+
+ ); + })} +
+
+ ); + }, +); diff --git a/plugins/scaffolder/src/plugin.tsx b/plugins/scaffolder/src/plugin.tsx index fdde81695d..7fa7dc1521 100644 --- a/plugins/scaffolder/src/plugin.tsx +++ b/plugins/scaffolder/src/plugin.tsx @@ -212,15 +212,3 @@ export const EntityTagsPickerFieldExtension = scaffolderPlugin.provide( schema: EntityTagsPickerSchema, }), ); - -/** - * @alpha - * The Router and main entrypoint to the Alpha Scaffolder plugin. - */ -export const LegacyScaffolderPage = scaffolderPlugin.provide( - createRoutableExtension({ - name: 'LegacyScaffolderPage', - component: () => import('./legacy/Router').then(m => m.LegacyRouter), - mountPoint: rootRouteRef, - }), -); diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index c14a4bad32..23827255ac 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-search-backend-module-catalog +## 0.1.13 + +### Patch Changes + +- 2e6c56b: Update wording to show that the backend system no longer is in alpha +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-search-common@1.2.10 + +## 0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.13-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index dd99acb5d1..0b70450eb3 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.13-next.1", + "version": "0.1.13", "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 9aa4984be1..6fd51ed2c3 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.3.12 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/integration-aws-node@0.1.8 + - @backstage/plugin-search-common@1.2.10 + +## 1.3.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + ## 1.3.12-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index ce17e1e20e..3a902ef255 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.12-next.1", + "version": "1.3.12", "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 c701f2b289..42465f4002 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-search-backend-module-explore +## 0.1.13 + +### Patch Changes + +- 2e6c56b: Update wording to show that the backend system no longer is in alpha +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/plugin-explore-common@0.0.2 + - @backstage/plugin-search-common@1.2.10 + +## 0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.13-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index 2d2944b422..d238ca0c68 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.13-next.1", + "version": "0.1.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index ca5953da74..b186b5f409 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/plugin-search-common@1.2.10 + +## 0.5.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + ## 0.5.18-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index f7971c46b7..17db1d9e38 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.18-next.1", + "version": "0.5.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md index 74a60dd371..49ddce1d45 100644 --- a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md +++ b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-search-backend-module-stack-overflow-collator +## 0.1.2 + +### Patch Changes + +- 2e6c56b: Update wording to show that the backend system no longer is in alpha +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/plugin-search-common@1.2.10 + +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.2-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-stack-overflow-collator/package.json b/plugins/search-backend-module-stack-overflow-collator/package.json index de84bfdabe..2c5508384c 100644 --- a/plugins/search-backend-module-stack-overflow-collator/package.json +++ b/plugins/search-backend-module-stack-overflow-collator/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-stack-overflow-collator", "description": "A module for the search backend that exports stack overflow modules", - "version": "0.1.2-next.1", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index 4959e5fa70..48ca80346c 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.1.13 + +### Patch Changes + +- 2e6c56b: Update wording to show that the backend system no longer is in alpha +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/plugin-techdocs-node@1.11.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-search-common@1.2.10 + +## 0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/plugin-techdocs-node@1.11.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.1.13-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index c11f5c91e0..7db87300cf 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.13-next.1", + "version": "0.1.13", "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 6e0f119156..d9ada5e4ed 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-search-backend-node +## 1.2.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/backend-tasks@0.5.14 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-search-common@1.2.10 + +## 1.2.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 1.2.13-next.1 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 4a52dd6d5d..b598793b88 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.13-next.1", + "version": "1.2.13", "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 2920c07ca3..334c303d03 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-search-backend +## 1.4.9 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-openapi-utils@0.1.2 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-search-common@1.2.10 + +## 1.4.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-openapi-utils@0.1.2-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + ## 1.4.9-next.1 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index c44ad5bfc0..bea288f6b2 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.4.9-next.1", + "version": "1.4.9", "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 3263e8305c..d14a8e37b3 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-common +## 1.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.12 + - @backstage/types@1.1.1 + ## 1.2.9 ### Patch Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index 7f02f8a359..e753ea764c 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.9", + "version": "1.2.10", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index f967dad8e9..08cb2bee1e 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-search-react +## 1.7.5 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + - @backstage/plugin-search-common@1.2.10 + +## 1.7.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + ## 1.7.5-next.1 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 8fd51bf533..c62e5e19b9 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.7.5-next.1", + "version": "1.7.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 9f62896be0..5acf5eea57 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-search +## 1.4.5 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-search-react@1.7.5 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + - @backstage/plugin-search-common@1.2.10 + +## 1.4.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + ## 1.4.5-next.1 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 0422c5b9c9..20ad8319e8 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.4.5-next.1", + "version": "1.4.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search/src/alpha.tsx b/plugins/search/src/alpha.tsx index a3a5023693..4f654548f5 100644 --- a/plugins/search/src/alpha.tsx +++ b/plugins/search/src/alpha.tsx @@ -70,6 +70,7 @@ import { UrlUpdater } from './components/SearchPage/SearchPage'; import { compatWrapper, convertLegacyRouteRef, + convertLegacyRouteRefs, } from '@backstage/core-compat-api'; /** @alpha */ @@ -248,7 +249,7 @@ export const searchNavItem = createNavItemExtension({ export default createPlugin({ id: 'search', extensions: [searchApi, searchPage, searchNavItem], - routes: { - root: convertLegacyRouteRef(rootRouteRef), - }, + routes: convertLegacyRouteRefs({ + root: rootRouteRef, + }), }); diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index 74f89a4039..2ed4f848cf 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-sentry +## 0.5.14 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.5.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.5.14-next.1 ### Patch Changes diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index 3401ae9ea2..f6bf651f69 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.14-next.1", + "version": "0.5.14", "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 b8bf81789c..d819ae5921 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-shortcuts +## 0.3.18 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + ## 0.3.18-next.1 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index a1abfccc3c..867e28dfa4 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.18-next.1", + "version": "0.3.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/signals-backend/.eslintrc.js b/plugins/signals-backend/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/signals-backend/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/signals-backend/README.md b/plugins/signals-backend/README.md new file mode 100644 index 0000000000..e30a0836e0 --- /dev/null +++ b/plugins/signals-backend/README.md @@ -0,0 +1,45 @@ +# signals + +Welcome to the signals backend plugin! + +Signals plugin allows backend plugins to publish messages to frontend plugins. + +## Getting started + +First install the `@backstage/plugin-signals-node` plugin to get the `SignalService` set up. + +Next, add Signals router to your backend in `packages/backend/src/plugins/signals.ts`: + +```ts +import { Router } from 'express'; +import { createRouter } from '@backstage/plugin-signals-backend'; +import { PluginEnvironment } from '../types'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + return await createRouter({ + logger: env.logger, + eventBroker: env.eventBroker, + identity: env.identity, + }); +} +``` + +Now add the signals to `packages/backend/src/index.ts`: + +```ts +// ... +import signals from './plugins/signals'; + +async function main() { + // ... + const signalsEnv = useHotMemoize(module, () => createEnv('signals')); + + const apiRouter = Router(); + // ... + apiRouter.use('/signals', await signals(signalsEnv)); + apiRouter.use(notFoundHandler()); + // ... +} +``` diff --git a/plugins/signals-backend/api-report.md b/plugins/signals-backend/api-report.md new file mode 100644 index 0000000000..dd46778e5d --- /dev/null +++ b/plugins/signals-backend/api-report.md @@ -0,0 +1,30 @@ +## API Report File for "@backstage/plugin-signals-backend" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; +import { EventBroker } from '@backstage/plugin-events-node'; +import express from 'express'; +import { IdentityApi } from '@backstage/plugin-auth-node'; +import { LoggerService } from '@backstage/backend-plugin-api'; + +// @public (undocumented) +export function createRouter(options: RouterOptions): Promise; + +// @public (undocumented) +export interface RouterOptions { + // (undocumented) + eventBroker?: EventBroker; + // (undocumented) + identity: IdentityApi; + // (undocumented) + logger: LoggerService; +} + +// @public +const signalsPlugin: () => BackendFeature; +export default signalsPlugin; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/signals-backend/catalog-info.yaml b/plugins/signals-backend/catalog-info.yaml new file mode 100644 index 0000000000..0a025b77b5 --- /dev/null +++ b/plugins/signals-backend/catalog-info.yaml @@ -0,0 +1,9 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-signals-backend + title: '@backstage/plugin-signals-backend' +spec: + lifecycle: experimental + type: backstage-backend-plugin + owner: maintainers diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json new file mode 100644 index 0000000000..2fe6d86480 --- /dev/null +++ b/plugins/signals-backend/package.json @@ -0,0 +1,51 @@ +{ + "name": "@backstage/plugin-signals-backend", + "version": "0.0.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" + }, + "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/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/plugin-auth-node": "workspace:^", + "@backstage/plugin-events-node": "workspace:^", + "@backstage/plugin-signals-node": "workspace:^", + "@backstage/types": "workspace:^", + "@types/express": "*", + "express": "^4.17.1", + "express-promise-router": "^4.1.0", + "http-proxy-middleware": "^2.0.0", + "node-fetch": "^2.6.7", + "uuid": "^8.0.0", + "winston": "^3.2.1", + "ws": "^8.14.2", + "yn": "^4.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@types/supertest": "^2.0.8", + "msw": "^1.0.0", + "supertest": "^6.2.4" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/scaffolder/src/legacy/index.ts b/plugins/signals-backend/src/index.ts similarity index 84% rename from plugins/scaffolder/src/legacy/index.ts rename to plugins/signals-backend/src/index.ts index 2393be0f69..05e1f941b2 100644 --- a/plugins/scaffolder/src/legacy/index.ts +++ b/plugins/signals-backend/src/index.ts @@ -13,5 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { LegacyRouter, type LegacyRouterProps } from './Router'; -export { LegacyScaffolderPage } from '../plugin'; +export * from './service/router'; +export { signalsPlugin as default } from './plugin'; diff --git a/plugins/signals-backend/src/plugin.ts b/plugins/signals-backend/src/plugin.ts new file mode 100644 index 0000000000..4a9cef028f --- /dev/null +++ b/plugins/signals-backend/src/plugin.ts @@ -0,0 +1,48 @@ +/* + * 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, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { createRouter } from './service/router'; + +/** + * Signals backend plugin + * + * @public + */ +export const signalsPlugin = createBackendPlugin({ + pluginId: 'signals', + register(env) { + env.registerInit({ + deps: { + httpRouter: coreServices.httpRouter, + logger: coreServices.logger, + identity: coreServices.identity, + // TODO: EventBroker. It is optional for now but it's actually required so waiting for the new backend system + // for the events-backend for this to work. + }, + async init({ httpRouter, logger, identity }) { + httpRouter.use( + await createRouter({ + logger, + identity, + }), + ); + }, + }); + }, +}); diff --git a/plugins/signals-backend/src/run.ts b/plugins/signals-backend/src/run.ts new file mode 100644 index 0000000000..d299ed23e9 --- /dev/null +++ b/plugins/signals-backend/src/run.ts @@ -0,0 +1,32 @@ +/* + * 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 { getRootLogger } from '@backstage/backend-common'; +import yn from 'yn'; +import { startStandaloneServer } from './service/standaloneServer'; + +const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; +const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); +const logger = getRootLogger(); + +startStandaloneServer({ port, enableCors, logger }).catch(err => { + logger.error(err); + process.exit(1); +}); + +process.on('SIGINT', () => { + logger.info('CTRL+C pressed; exiting.'); + process.exit(0); +}); diff --git a/plugins/signals-backend/src/service/SignalManager.test.ts b/plugins/signals-backend/src/service/SignalManager.test.ts new file mode 100644 index 0000000000..5720d1ff52 --- /dev/null +++ b/plugins/signals-backend/src/service/SignalManager.test.ts @@ -0,0 +1,178 @@ +/* + * Copyright 2024 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 { WebSocket } from 'ws'; +import { EventSubscriber } from '@backstage/plugin-events-node'; +import { SignalManager } from './SignalManager'; +import { getVoidLogger } from '@backstage/backend-common'; + +class MockWebSocket { + closed: boolean = false; + readyState: number = WebSocket.OPEN; + callbacks: Map void> = + new Map(); + data: any[] = []; + + close(_: number, __: string | Buffer): void { + this.readyState = WebSocket.CLOSED; + this.closed = true; + } + + on( + event: string | symbol, + listener: (this: WebSocket, ...args: any[]) => void, + ) { + this.callbacks.set(event, listener); + return this; + } + + // @ts-ignore + send(data: any, _?: (err?: Error) => void): void { + this.data.push(data); + } + + trigger(event: string | symbol, ...args: any[]): void { + const cb = this.callbacks.get(event); + if (!cb) { + throw new Error(`No callback for ${event.toString()}`); + } + // @ts-ignore + cb(...args); + } +} + +describe('SignalManager', () => { + let onEvent: Function; + + const mockEventBroker = { + publish: async () => {}, + subscribe: (subscriber: EventSubscriber) => { + onEvent = subscriber.onEvent; + }, + }; + + const manager = SignalManager.create({ + eventBroker: mockEventBroker, + logger: getVoidLogger(), + }); + + it('should close connection on error', () => { + const ws = new MockWebSocket(); + manager.addConnection(ws as unknown as WebSocket); + + ws.trigger('error', new Error('error')); + expect(ws.closed).toBeTruthy(); + }); + + it('should allow subscribing and unsubscribing to events', async () => { + const ws = new MockWebSocket(); + manager.addConnection(ws as unknown as WebSocket); + + ws.trigger( + 'message', + JSON.stringify({ action: 'subscribe', channel: 'test' }), + false, + ); + + await onEvent({ + topic: 'signals', + eventPayload: { + recipients: null, + channel: 'test', + message: { msg: 'test' }, + }, + }); + + expect(ws.data.length).toEqual(1); + expect(ws.data[0]).toEqual( + JSON.stringify({ channel: 'test', message: { msg: 'test' } }), + ); + + ws.trigger( + 'message', + JSON.stringify({ action: 'unsubscribe', channel: 'test' }), + false, + ); + + await onEvent({ + topic: 'signals', + eventPayload: { + recipients: null, + channel: 'test', + message: { msg: 'test' }, + }, + }); + + expect(ws.data.length).toEqual(1); + }); + + it('should only send to users from identity', async () => { + // Connection without identity + const ws1 = new MockWebSocket(); + manager.addConnection(ws1 as unknown as WebSocket); + + // Connection with identity and subscription + const ws2 = new MockWebSocket(); + manager.addConnection(ws2 as unknown as WebSocket, { + identity: { + type: 'user', + ownershipEntityRefs: ['user:default/john.doe'], + userEntityRef: 'user:default/john.doe', + }, + expiresInSeconds: 3600, + token: '1234', + }); + + // Connection without subscription + const ws3 = new MockWebSocket(); + manager.addConnection(ws3 as unknown as WebSocket, { + identity: { + type: 'user', + ownershipEntityRefs: ['user:default/john.doe'], + userEntityRef: 'user:default/john.doe', + }, + expiresInSeconds: 3600, + token: '1234', + }); + + ws1.trigger( + 'message', + JSON.stringify({ action: 'subscribe', channel: 'test' }), + false, + ); + + ws2.trigger( + 'message', + JSON.stringify({ action: 'subscribe', channel: 'test' }), + false, + ); + + await onEvent({ + topic: 'signals', + eventPayload: { + recipients: 'user:default/john.doe', + channel: 'test', + message: { msg: 'test' }, + }, + }); + + expect(ws1.data.length).toEqual(0); + expect(ws3.data.length).toEqual(0); + expect(ws2.data.length).toEqual(1); + expect(ws2.data[0]).toEqual( + JSON.stringify({ channel: 'test', message: { msg: 'test' } }), + ); + }); +}); diff --git a/plugins/signals-backend/src/service/SignalManager.ts b/plugins/signals-backend/src/service/SignalManager.ts new file mode 100644 index 0000000000..983496b96b --- /dev/null +++ b/plugins/signals-backend/src/service/SignalManager.ts @@ -0,0 +1,162 @@ +/* + * 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 { EventBroker, EventParams } from '@backstage/plugin-events-node'; +import { SignalPayload } from '@backstage/plugin-signals-node'; +import { RawData, WebSocket } from 'ws'; +import { v4 as uuid } from 'uuid'; +import { JsonObject } from '@backstage/types'; +import { BackstageIdentityResponse } from '@backstage/plugin-auth-node'; +import { LoggerService } from '@backstage/backend-plugin-api'; + +/** + * @internal + */ +export type SignalConnection = { + id: string; + user: string; + ws: WebSocket; + ownershipEntityRefs: string[]; + subscriptions: Set; +}; + +/** + * @internal + */ +export type SignalManagerOptions = { + // TODO: Remove optional when events-backend can offer this service + eventBroker?: EventBroker; + logger: LoggerService; +}; + +/** @internal */ +export class SignalManager { + private connections: Map = new Map< + string, + SignalConnection + >(); + private eventBroker?: EventBroker; + private logger: LoggerService; + + static create(options: SignalManagerOptions) { + return new SignalManager(options); + } + + private constructor(options: SignalManagerOptions) { + ({ eventBroker: this.eventBroker, logger: this.logger } = options); + + this.eventBroker?.subscribe({ + supportsEventTopics: () => ['signals'], + onEvent: (params: EventParams) => + this.onEventBrokerEvent(params), + }); + } + + addConnection(ws: WebSocket, identity?: BackstageIdentityResponse) { + const id = uuid(); + + const conn = { + id, + user: identity?.identity.userEntityRef ?? 'user:default/guest', + ws, + ownershipEntityRefs: identity?.identity.ownershipEntityRefs ?? [], + subscriptions: new Set(), + }; + + this.connections.set(id, conn); + + ws.on('error', (err: Error) => { + this.logger.info( + `Error occurred with connection ${id}: ${err}, closing connection`, + ); + ws.close(); + this.connections.delete(id); + }); + + ws.on('close', (code: number, reason: Buffer) => { + this.logger.info( + `Connection ${id} closed with code ${code}, reason: ${reason}`, + ); + this.connections.delete(id); + }); + + ws.on('message', (data: RawData, isBinary: boolean) => { + this.logger.debug(`Received message from connection ${id}: ${data}`); + if (isBinary) { + return; + } + try { + const json = JSON.parse(data.toString()) as JsonObject; + this.handleMessage(conn, json); + } catch (err: any) { + this.logger.error( + `Invalid message received from connection ${id}: ${err}`, + ); + } + }); + } + + private handleMessage(connection: SignalConnection, message: JsonObject) { + if (message.action === 'subscribe' && message.channel) { + this.logger.info( + `Connection ${connection.id} subscribed to ${message.channel}`, + ); + connection.subscriptions.add(message.channel as string); + } else if (message.action === 'unsubscribe' && message.channel) { + this.logger.info( + `Connection ${connection.id} unsubscribed from ${message.channel}`, + ); + connection.subscriptions.delete(message.channel as string); + } + } + + private async onEventBrokerEvent( + params: EventParams, + ): Promise { + const { eventPayload } = params; + if (!eventPayload.channel || !eventPayload.message) { + return; + } + + const { channel, recipients, message } = eventPayload; + const jsonMessage = JSON.stringify({ channel, message }); + + // Actual websocket message sending + this.connections.forEach(conn => { + if (!conn.subscriptions.has(channel)) { + return; + } + // Sending to all users can be done with null + if ( + recipients !== null && + !conn.ownershipEntityRefs.some((ref: string) => + recipients.includes(ref), + ) + ) { + return; + } + + if (conn.ws.readyState !== WebSocket.OPEN) { + return; + } + + conn.ws.send(jsonMessage, err => { + if (err) { + this.logger.error(`Failed to send message to ${conn.id}: ${err}`); + } + }); + }); + } +} diff --git a/plugins/signals-backend/src/service/router.test.ts b/plugins/signals-backend/src/service/router.test.ts new file mode 100644 index 0000000000..ecf2ad4aa6 --- /dev/null +++ b/plugins/signals-backend/src/service/router.test.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 { getVoidLogger } from '@backstage/backend-common'; +import express from 'express'; +import request from 'supertest'; + +import { createRouter } from './router'; +import { EventBroker } from '@backstage/plugin-events-node'; +import { IdentityApi } from '@backstage/plugin-auth-node'; + +const eventBrokerMock: jest.Mocked = { + subscribe: jest.fn(), + publish: jest.fn(), +}; + +const identityApiMock: jest.Mocked = { + getIdentity: jest.fn(), +}; + +describe('createRouter', () => { + let app: express.Express; + + beforeAll(async () => { + const router = await createRouter({ + logger: getVoidLogger(), + identity: identityApiMock, + eventBroker: eventBrokerMock, + }); + app = express().use(router); + }); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('GET /health', () => { + it('returns ok', async () => { + const response = await request(app).get('/health'); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ status: 'ok' }); + }); + }); +}); diff --git a/plugins/signals-backend/src/service/router.ts b/plugins/signals-backend/src/service/router.ts new file mode 100644 index 0000000000..4394a9f480 --- /dev/null +++ b/plugins/signals-backend/src/service/router.ts @@ -0,0 +1,110 @@ +/* + * 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 { errorHandler } from '@backstage/backend-common'; +import express, { NextFunction, Request, Response } from 'express'; +import Router from 'express-promise-router'; +import { LoggerService } from '@backstage/backend-plugin-api'; +import * as https from 'https'; +import http, { IncomingMessage } from 'http'; +import { SignalManager } from './SignalManager'; +import { + BackstageIdentityResponse, + IdentityApi, + IdentityApiGetIdentityRequest, +} from '@backstage/plugin-auth-node'; +import { EventBroker } from '@backstage/plugin-events-node'; +import { WebSocket, WebSocketServer } from 'ws'; + +/** @public */ +export interface RouterOptions { + logger: LoggerService; + eventBroker?: EventBroker; + identity: IdentityApi; +} + +/** @public */ +export async function createRouter( + options: RouterOptions, +): Promise { + const { logger, identity } = options; + const manager = SignalManager.create(options); + let subscribedToUpgradeRequests = false; + + const webSocketServer = new WebSocketServer({ + noServer: true, + clientTracking: false, + }); + + const upgradeMiddleware = async ( + req: Request, + _: Response, + next: NextFunction, + ) => { + const server: https.Server | http.Server = (req.socket as any)?.server; + if ( + subscribedToUpgradeRequests || + !server || + !req.headers || + req.headers.upgrade === undefined || + req.headers.upgrade.toLowerCase() !== 'websocket' + ) { + next(); + return; + } + + subscribedToUpgradeRequests = true; + server.on('upgrade', async (request, socket, head) => { + // TODO: Find a way to make this more generic + if (request.url !== '/api/signals') { + return; + } + + let userIdentity: BackstageIdentityResponse | undefined = undefined; + + // Authentication token is passed in Sec-WebSocket-Protocol header as there + // is no other way to pass the token with plain websockets + const token = req.headers['sec-websocket-protocol']; + if (token) { + userIdentity = await identity.getIdentity({ + request: { + headers: { authorization: token }, + }, + } as IdentityApiGetIdentityRequest); + } + + webSocketServer.handleUpgrade( + request, + socket, + head, + (ws: WebSocket, __: IncomingMessage) => { + manager.addConnection(ws, userIdentity); + }, + ); + }); + }; + + const router = Router(); + router.use(express.json()); + router.use(upgradeMiddleware); + + router.get('/health', (_, response) => { + logger.info('PONG!'); + response.json({ status: 'ok' }); + }); + + router.use(errorHandler()); + return router; +} diff --git a/plugins/signals-backend/src/service/standaloneServer.ts b/plugins/signals-backend/src/service/standaloneServer.ts new file mode 100644 index 0000000000..278de8621e --- /dev/null +++ b/plugins/signals-backend/src/service/standaloneServer.ts @@ -0,0 +1,98 @@ +/* + * 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 { + createServiceBuilder, + HostDiscovery, + loadBackendConfig, +} from '@backstage/backend-common'; +import { Server } from 'http'; +import { Logger } from 'winston'; +import { createRouter } from './router'; +import { DefaultSignalService } from '@backstage/plugin-signals-node'; +import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; +import { + EventBroker, + EventParams, + EventSubscriber, +} from '@backstage/plugin-events-node'; + +export interface ServerOptions { + port: number; + enableCors: boolean; + logger: Logger; +} + +export async function startStandaloneServer( + options: ServerOptions, +): Promise { + const logger = options.logger.child({ service: 'signals-backend' }); + logger.debug('Starting application server...'); + const config = await loadBackendConfig({ logger, argv: process.argv }); + const discovery = HostDiscovery.fromConfig(config); + + const identity = DefaultIdentityClient.create({ + discovery, + issuer: await discovery.getExternalBaseUrl('auth'), + }); + + const mockSubscribers: EventSubscriber[] = []; + const eventBroker: EventBroker = { + async publish(params: EventParams): Promise { + mockSubscribers.forEach(sub => sub.onEvent(params)); + }, + subscribe(...subscribers: EventSubscriber[]) { + subscribers.flat().forEach(subscriber => { + mockSubscribers.push(subscriber); + }); + }, + }; + + const signals = DefaultSignalService.create({ + eventBroker, + }); + + const router = await createRouter({ + logger, + identity, + eventBroker, + }); + + let service = createServiceBuilder(module) + .setPort(options.port) + .addRouter('/signals', router); + if (options.enableCors) { + service = service.enableCors({ origin: 'http://localhost:3000' }); + } + + let server: Promise; + try { + server = service.start(); + + setInterval(() => { + signals.publish({ + recipients: null, + channel: 'test', + message: { hello: 'world' }, + }); + }, 5000); + } catch (err) { + logger.error(err); + process.exit(1); + } + return server; +} + +module.hot?.accept(); diff --git a/plugins/scaffolder/src/components/types.ts b/plugins/signals-backend/src/setupTests.ts similarity index 91% rename from plugins/scaffolder/src/components/types.ts rename to plugins/signals-backend/src/setupTests.ts index b1e99a84e6..4b9026cde5 100644 --- a/plugins/scaffolder/src/components/types.ts +++ b/plugins/signals-backend/src/setupTests.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * 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. @@ -13,3 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +export {}; diff --git a/plugins/signals-node/.eslintrc.js b/plugins/signals-node/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/signals-node/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/signals-node/README.md b/plugins/signals-node/README.md new file mode 100644 index 0000000000..5e738a849d --- /dev/null +++ b/plugins/signals-node/README.md @@ -0,0 +1,86 @@ +# @backstage/plugin-signals-node + +Welcome to the Node.js library package for the signals plugin! + +Signals plugin allows backend plugins to publish messages to frontend plugins. + +## Getting started + +Add SignalService to your plugin environment in `packages/backend/src/types.ts`: + +```ts +import { SignalService } from '@backstage/plugin-signals-node'; + +export type PluginEnvironment = { + // ... + signalService: SignalService; +}; +``` + +Add it also to your `makeCreateEnv` to allow access from the other plugins: + +```ts +import { SignalService } from '@backstage/plugin-signals-node'; +import { DefaultEventBroker } from '@backstage/plugin-events-backend'; + +function makeCreateEnv(config: Config) { + // ... + + const eventBroker = new DefaultEventBroker(root.child({ type: 'plugin' })); + const signalService = DefaultSignalService.create({ + eventBroker, + }); + + return (plugin: string): PluginEnvironment => { + const logger = root.child({ type: 'plugin', plugin }); + return { + logger, + eventBroker, + signalService, + // ... + }; + }; +} +``` + +To allow connections from the frontend, you should also install the `@backstage/plugin-signals-backend`. + +## Using the service + +Once you have both of the backend plugins installed, you can utilize the signal service by calling the +`publish` method. This will publish the message to all subscribers in the frontend. To send message to +all subscribers, you can use `null` as `recipients` parameter. + +```ts +// Periodic sending example +setInterval(async () => { + await signalService.publish({ + recipients: null, + channel: 'my_plugin', + message: { + message: 'hello world', + }, + }); +}, 5000); +``` + +To receive this message in the frontend, check the documentation of `@backstage/plugin-signals` and +`@backstage/plugin-signals-react`. + +## Using event broker directly + +Other way to send signals is to utilize the `EventBroker` directly. This requires that the payload is correct for it +to work: + +```ts +eventBroker.publish({ + topic: 'signals', + eventPayload: { + recipients: ['user:default/user1'], + message: { + message: 'hello world', + }, + channel: 'my_plugin', + }, +}); +``` diff --git a/plugins/signals-node/api-report.md b/plugins/signals-node/api-report.md new file mode 100644 index 0000000000..00d099f7db --- /dev/null +++ b/plugins/signals-node/api-report.md @@ -0,0 +1,38 @@ +## API Report File for "@backstage/plugin-signals-node" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { EventBroker } from '@backstage/plugin-events-node'; +import { JsonObject } from '@backstage/types'; +import { ServiceRef } from '@backstage/backend-plugin-api'; + +// @public (undocumented) +export class DefaultSignalService implements SignalService { + // (undocumented) + static create(options: SignalServiceOptions): DefaultSignalService; + publish(signal: SignalPayload): Promise; +} + +// @public (undocumented) +export type SignalPayload = { + recipients: string[] | null; + channel: string; + message: JsonObject; +}; + +// @public (undocumented) +export type SignalService = { + publish(signal: SignalPayload): Promise; +}; + +// @public (undocumented) +export const signalService: ServiceRef; + +// @public (undocumented) +export type SignalServiceOptions = { + eventBroker?: EventBroker; +}; + +// (No @packageDocumentation comment for this package) +``` diff --git a/packages/backend-plugin-manager/catalog-info.yaml b/plugins/signals-node/catalog-info.yaml similarity index 51% rename from packages/backend-plugin-manager/catalog-info.yaml rename to plugins/signals-node/catalog-info.yaml index bc1845fe49..5e3af0acde 100644 --- a/packages/backend-plugin-manager/catalog-info.yaml +++ b/plugins/signals-node/catalog-info.yaml @@ -1,9 +1,9 @@ apiVersion: backstage.io/v1alpha1 kind: Component metadata: - name: backstage-backend-plugin-manager - title: '@backstage/backend-plugin-manager' - description: Backstage plugin management backend + name: backstage-plugin-signals-node + title: '@backstage/plugin-signals-node' + description: Node.js library for the signals plugin spec: lifecycle: experimental type: backstage-node-library diff --git a/plugins/signals-node/package.json b/plugins/signals-node/package.json new file mode 100644 index 0000000000..d3230432f1 --- /dev/null +++ b/plugins/signals-node/package.json @@ -0,0 +1,42 @@ +{ + "name": "@backstage/plugin-signals-node", + "description": "Node.js library for the signals plugin", + "version": "0.0.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": "node-library" + }, + "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:^", + "@types/express": "^4.17.21" + }, + "files": [ + "dist" + ], + "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/plugin-auth-node": "workspace:^", + "@backstage/plugin-events-node": "workspace:^", + "@backstage/types": "workspace:^", + "express": "^4.17.1", + "uuid": "^8.0.0", + "ws": "^8.14.2" + } +} diff --git a/plugins/signals-node/src/DefaultSignalService.ts b/plugins/signals-node/src/DefaultSignalService.ts new file mode 100644 index 0000000000..1fba96b8bc --- /dev/null +++ b/plugins/signals-node/src/DefaultSignalService.ts @@ -0,0 +1,50 @@ +/* + * 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 { EventBroker } from '@backstage/plugin-events-node'; +import { SignalPayload, SignalServiceOptions } from './types'; +import { SignalService } from './SignalService'; + +/** @public */ +export class DefaultSignalService implements SignalService { + // TODO: Remove this to be optional when events-backend has eventBroker as service + private eventBroker?: EventBroker; + + static create(options: SignalServiceOptions) { + return new DefaultSignalService(options); + } + + private constructor(options: SignalServiceOptions) { + ({ eventBroker: this.eventBroker } = options); + } + + /** + * Publishes a message to user refs to specific topic + * @param recipients - string or array of user ref strings to publish message to + * @param topic - message topic + * @param message - message to publish + */ + async publish(signal: SignalPayload) { + const { recipients, channel, message } = signal; + await this.eventBroker?.publish({ + topic: 'signals', + eventPayload: { + recipients, + message, + channel, + }, + }); + } +} diff --git a/plugins/signals-node/src/SignalService.ts b/plugins/signals-node/src/SignalService.ts new file mode 100644 index 0000000000..f08a12661f --- /dev/null +++ b/plugins/signals-node/src/SignalService.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2024 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 { SignalPayload } from './types'; + +/** @public */ +export type SignalService = { + /** + * Publishes a message to user refs to specific topic + */ + publish(signal: SignalPayload): Promise; +}; diff --git a/plugins/scaffolder/src/alpha.ts b/plugins/signals-node/src/index.ts similarity index 82% rename from plugins/scaffolder/src/alpha.ts rename to plugins/signals-node/src/index.ts index 92ec945de4..f9c220b1e9 100644 --- a/plugins/scaffolder/src/alpha.ts +++ b/plugins/signals-node/src/index.ts @@ -14,10 +14,7 @@ * limitations under the License. */ -export { - type FormProps, - type TemplateListPageProps, - type TemplateWizardPageProps, -} from './next'; - -export * from './legacy'; +export * from './lib'; +export * from './DefaultSignalService'; +export * from './SignalService'; +export * from './types'; diff --git a/plugins/signals-node/src/lib.ts b/plugins/signals-node/src/lib.ts new file mode 100644 index 0000000000..095a2f085d --- /dev/null +++ b/plugins/signals-node/src/lib.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 { + createServiceFactory, + createServiceRef, +} from '@backstage/backend-plugin-api'; +import { DefaultSignalService } from './DefaultSignalService'; +import { SignalService } from './SignalService'; + +/** @public */ +export const signalService = createServiceRef({ + id: 'signals.service', + scope: 'plugin', + defaultFactory: async service => + createServiceFactory({ + service, + deps: { + // TODO: EventBroker. It is optional for now but it's actually required so waiting for the new backend system + // for the events-backend for this to work. + }, + factory({}) { + return DefaultSignalService.create({}); + }, + }), +}); diff --git a/plugins/signals-node/src/setupTests.ts b/plugins/signals-node/src/setupTests.ts new file mode 100644 index 0000000000..4b9026cde5 --- /dev/null +++ b/plugins/signals-node/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/signals-node/src/types.ts b/plugins/signals-node/src/types.ts new file mode 100644 index 0000000000..0220a196aa --- /dev/null +++ b/plugins/signals-node/src/types.ts @@ -0,0 +1,31 @@ +/* + * 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 { EventBroker } from '@backstage/plugin-events-node'; +import { JsonObject } from '@backstage/types'; + +/** + * @public + */ +export type SignalServiceOptions = { + eventBroker?: EventBroker; +}; + +/** @public */ +export type SignalPayload = { + recipients: string[] | null; + channel: string; + message: JsonObject; +}; diff --git a/plugins/signals-react/.eslintrc.js b/plugins/signals-react/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/signals-react/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/signals-react/README.md b/plugins/signals-react/README.md new file mode 100644 index 0000000000..4da9338866 --- /dev/null +++ b/plugins/signals-react/README.md @@ -0,0 +1,52 @@ +# @backstage/plugin-signals-react + +Welcome to the web library package for the signals plugin! + +Signals plugin allows backend plugins to publish messages to frontend plugins. + +## Getting started + +This plugin contains functionalities that help utilize the signals plugin. To get started, +see installation instructions from `@backstage/plugin-signals-node`, `@backstage/plugin-signals-backend`, and +`@backstage/plugin-signals`. + +There are two ways to utilize the signals plugin; either by using the hook or by directly using the API. + +## Using the hook + +By using the hook, unsubscribe is automatically taken care of. This helps to maintain only necessary amount +of connections to the backend and also to allow multiple subscriptions using the same connection. + +Example of using the hook: + +```ts +import { useSignal } from '@backstage/plugin-signals-react'; + +const { lastSignal } = useSignal('myplugin:channel'); + +useEffect(() => { + console.log(lastSignal); +}, [lastSignal]); +``` + +Whenever backend publishes new message to the channel `myplugin:channel`, the `lastSignal` is changed. The `lastSignal` +is always initiated with null value before any messages are received from the backend. + +## Using API directly + +You can also use the signal API directly. This allows more fine-grained control over the state of the connections and +subscriptions. + +```ts +import { signalsApiRef } from '@backstage/plugin-signals-react'; + +const signals = useApi(signalsApiRef); +const { unsubscribe } = signals.subscribe( + 'myplugin:channel', + (message: JsonObject) => { + console.log(message); + }, +); +// Remember to unsubscribe +unsubscribe(); +``` diff --git a/plugins/signals-react/api-report.md b/plugins/signals-react/api-report.md new file mode 100644 index 0000000000..2df2e4f1ce --- /dev/null +++ b/plugins/signals-react/api-report.md @@ -0,0 +1,28 @@ +## API Report File for "@backstage/plugin-signals-react" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ApiRef } from '@backstage/core-plugin-api'; +import { JsonObject } from '@backstage/types'; + +// @public (undocumented) +export type SignalApi = { + subscribe( + channel: string, + onMessage: (message: JsonObject) => void, + ): { + unsubscribe: () => void; + }; +}; + +// @public (undocumented) +export const signalApiRef: ApiRef; + +// @public (undocumented) +export const useSignal: (channel: string) => { + lastSignal: JsonObject | null; +}; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/signals-react/catalog-info.yaml b/plugins/signals-react/catalog-info.yaml new file mode 100644 index 0000000000..ac8093ed0c --- /dev/null +++ b/plugins/signals-react/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-signals-react + title: '@backstage/plugin-signals-react' + description: Web library for the signals plugin +spec: + lifecycle: experimental + type: backstage-web-library + owner: maintainers diff --git a/plugins/signals-react/package.json b/plugins/signals-react/package.json new file mode 100644 index 0000000000..06df050ccd --- /dev/null +++ b/plugins/signals-react/package.json @@ -0,0 +1,43 @@ +{ + "name": "@backstage/plugin-signals-react", + "description": "Web library for the signals plugin", + "version": "0.0.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": "web-library" + }, + "sideEffects": false, + "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/core-plugin-api": "workspace:^", + "@backstage/types": "workspace:^", + "@material-ui/core": "^4.12.4" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^14.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/signals-react/src/api/SignalApi.ts b/plugins/signals-react/src/api/SignalApi.ts new file mode 100644 index 0000000000..b37b3ae2f5 --- /dev/null +++ b/plugins/signals-react/src/api/SignalApi.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. + */ +import { createApiRef } from '@backstage/core-plugin-api'; +import { JsonObject } from '@backstage/types'; + +/** @public */ +export const signalApiRef = createApiRef({ + id: 'plugin.signal.service', +}); + +/** @public */ +export type SignalApi = { + subscribe( + channel: string, + onMessage: (message: JsonObject) => void, + ): { unsubscribe: () => void }; +}; diff --git a/plugins/scaffolder-react/src/legacy/index.ts b/plugins/signals-react/src/api/index.ts similarity index 95% rename from plugins/scaffolder-react/src/legacy/index.ts rename to plugins/signals-react/src/api/index.ts index c539a8ba60..8d728dbd0f 100644 --- a/plugins/scaffolder-react/src/legacy/index.ts +++ b/plugins/signals-react/src/api/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './extensions'; +export * from './SignalApi'; diff --git a/plugins/scaffolder/src/legacy/ScaffolderPage/index.ts b/plugins/signals-react/src/hooks/index.ts similarity index 86% rename from plugins/scaffolder/src/legacy/ScaffolderPage/index.ts rename to plugins/signals-react/src/hooks/index.ts index 433e39723f..a7bf7ebad2 100644 --- a/plugins/scaffolder/src/legacy/ScaffolderPage/index.ts +++ b/plugins/signals-react/src/hooks/index.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * 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. @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { ScaffolderPage } from './ScaffolderPage'; +export * from './useSignal'; diff --git a/plugins/signals-react/src/hooks/useSignal.ts b/plugins/signals-react/src/hooks/useSignal.ts new file mode 100644 index 0000000000..a7d50fbe3b --- /dev/null +++ b/plugins/signals-react/src/hooks/useSignal.ts @@ -0,0 +1,44 @@ +/* + * 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 { signalApiRef } from '../api'; +import { useApiHolder } from '@backstage/core-plugin-api'; +import { JsonObject } from '@backstage/types'; +import { useEffect, useState } from 'react'; + +/** @public */ +export const useSignal = (channel: string) => { + const apiHolder = useApiHolder(); + // Use apiHolder instead useApi in case signalApi is not available in the + // backstage instance this is used + const signals = apiHolder.get(signalApiRef); + const [lastSignal, setLastSignal] = useState(null); + useEffect(() => { + let unsub: null | (() => void) = null; + if (signals) { + const { unsubscribe } = signals.subscribe(channel, (msg: JsonObject) => { + setLastSignal(msg); + }); + unsub = unsubscribe; + } + return () => { + if (signals && unsub) { + unsub(); + } + }; + }, [signals, channel]); + + return { lastSignal }; +}; diff --git a/plugins/signals-react/src/index.ts b/plugins/signals-react/src/index.ts new file mode 100644 index 0000000000..0f44901352 --- /dev/null +++ b/plugins/signals-react/src/index.ts @@ -0,0 +1,18 @@ +/* + * 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 './api'; +export * from './hooks'; diff --git a/plugins/signals-react/src/setupTests.ts b/plugins/signals-react/src/setupTests.ts new file mode 100644 index 0000000000..865308e634 --- /dev/null +++ b/plugins/signals-react/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. + */ +import '@testing-library/jest-dom'; diff --git a/plugins/signals/.eslintrc.js b/plugins/signals/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/signals/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/signals/README.md b/plugins/signals/README.md new file mode 100644 index 0000000000..7b96da32f1 --- /dev/null +++ b/plugins/signals/README.md @@ -0,0 +1,44 @@ +# signals + +Welcome to the signals plugin! + +Signals plugin allows backend plugins to publish messages to frontend plugins. + +## Getting started + +This plugin contains client that can receive messages from the backend. To get started, +see installation instructions from `@backstage/plugin-signals-node`, `@backstage/plugin-signals-backend`. + +To install the plugin, you have to add the following to your `packages/app/src/plugins.ts`: + +```ts +export { signalsPlugin } from '@backstage/plugin-signals'; +``` + +And make sure that your `packages/app/src/App.tsx` contains: + +```ts +import * as plugins from './plugins'; + +const app = createApp({ + // ... + plugins: Object.values(plugins), + // ... +}); +``` + +Now you can utilize the API from other plugins using the `@backstage/plugin-signals-react` package or simply by: + +```ts +import { signalsApiRef } from '@backstage/plugin-signals-react'; + +const signals = useApi(signalsApiRef); +const { unsubscribe } = signals.subscribe( + 'myplugin:topic', + (message: JsonObject) => { + console.log(message); + }, +); +// Remember to unsubscribe +unsubscribe(); +``` diff --git a/plugins/signals/api-report.md b/plugins/signals/api-report.md new file mode 100644 index 0000000000..398d5fbfe6 --- /dev/null +++ b/plugins/signals/api-report.md @@ -0,0 +1,38 @@ +## API Report File for "@backstage/plugin-signals" + +> 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 { DiscoveryApi } from '@backstage/core-plugin-api'; +import { IdentityApi } from '@backstage/core-plugin-api'; +import { JsonObject } from '@backstage/types'; +import { SignalApi } from '@backstage/plugin-signals-react'; + +// @public (undocumented) +export class SignalClient implements SignalApi { + // (undocumented) + static create(options: { + identity: IdentityApi; + discoveryApi: DiscoveryApi; + connectTimeout?: number; + reconnectTimeout?: number; + }): SignalClient; + // (undocumented) + static readonly DEFAULT_CONNECT_TIMEOUT_MS: number; + // (undocumented) + static readonly DEFAULT_RECONNECT_TIMEOUT_MS: number; + // (undocumented) + subscribe( + channel: string, + onMessage: (message: JsonObject) => void, + ): { + unsubscribe: () => void; + }; +} + +// @public (undocumented) +export const signalsPlugin: BackstagePlugin<{}, {}>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/signals/catalog-info.yaml b/plugins/signals/catalog-info.yaml new file mode 100644 index 0000000000..ab52477147 --- /dev/null +++ b/plugins/signals/catalog-info.yaml @@ -0,0 +1,9 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-signals + title: '@backstage/plugin-signals' +spec: + lifecycle: experimental + type: backstage-frontend-plugin + owner: maintainers diff --git a/plugins/signals/dev/index.tsx b/plugins/signals/dev/index.tsx new file mode 100644 index 0000000000..e8c7928f57 --- /dev/null +++ b/plugins/signals/dev/index.tsx @@ -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 React from 'react'; +import { createDevApp } from '@backstage/dev-utils'; +import { signalsPlugin } from '../src/plugin'; +import { Content, Header, Page } from '@backstage/core-components'; +import { Typography } from '@material-ui/core'; + +createDevApp() + .registerPlugin(signalsPlugin) + .addPage({ + title: 'Debug', + element: ( + +
+ + TODO + + + ), + }) + .render(); diff --git a/plugins/signals/package.json b/plugins/signals/package.json new file mode 100644 index 0000000000..cec95280c1 --- /dev/null +++ b/plugins/signals/package.json @@ -0,0 +1,54 @@ +{ + "name": "@backstage/plugin-signals", + "version": "0.0.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" + }, + "sideEffects": false, + "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/core-components": "workspace:^", + "@backstage/core-plugin-api": "workspace:^", + "@backstage/plugin-signals-react": "workspace:^", + "@backstage/theme": "workspace:^", + "@backstage/types": "workspace:^", + "@material-ui/core": "^4.12.4", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.61", + "react-use": "^17.2.4", + "uuid": "^8.0.0" + }, + "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": "^6.0.0", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.0.0", + "jest-websocket-mock": "^2.5.0", + "msw": "^1.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/signals/src/api/SignalClient.ts b/plugins/signals/src/api/SignalClient.ts new file mode 100644 index 0000000000..ee4ed8756b --- /dev/null +++ b/plugins/signals/src/api/SignalClient.ts @@ -0,0 +1,217 @@ +/* + * 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 { SignalApi } from '@backstage/plugin-signals-react'; +import { JsonObject } from '@backstage/types'; +import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; +import { v4 as uuid } from 'uuid'; + +type Subscription = { + channel: string; + callback: (message: JsonObject) => void; +}; + +const WS_CLOSE_NORMAL = 1000; +const WS_CLOSE_GOING_AWAY = 1001; + +/** @public */ +export class SignalClient implements SignalApi { + static readonly DEFAULT_CONNECT_TIMEOUT_MS: number = 1000; + static readonly DEFAULT_RECONNECT_TIMEOUT_MS: number = 5000; + private ws: WebSocket | null = null; + private subscriptions: Map = new Map(); + private messageQueue: string[] = []; + private reconnectTo: any; + + static create(options: { + identity: IdentityApi; + discoveryApi: DiscoveryApi; + connectTimeout?: number; + reconnectTimeout?: number; + }) { + const { + identity, + discoveryApi, + connectTimeout = SignalClient.DEFAULT_CONNECT_TIMEOUT_MS, + reconnectTimeout = SignalClient.DEFAULT_RECONNECT_TIMEOUT_MS, + } = options; + return new SignalClient( + identity, + discoveryApi, + connectTimeout, + reconnectTimeout, + ); + } + + private constructor( + private identity: IdentityApi, + private discoveryApi: DiscoveryApi, + private connectTimeout: number, + private reconnectTimeout: number, + ) {} + + subscribe( + channel: string, + onMessage: (message: JsonObject) => void, + ): { unsubscribe: () => void } { + const subscriptionId = uuid(); + const exists = [...this.subscriptions.values()].find( + sub => sub.channel === channel, + ); + this.subscriptions.set(subscriptionId, { + channel: channel, + callback: onMessage, + }); + + this.connect() + .then(() => { + // Do not subscribe twice to same channel even there is multiple callbacks + if (!exists) { + this.send({ action: 'subscribe', channel }); + } + }) + .catch(() => { + this.reconnect(); + }); + + const unsubscribe = () => { + const sub = this.subscriptions.get(subscriptionId); + if (!sub) { + return; + } + this.subscriptions.delete(subscriptionId); + const multipleExists = [...this.subscriptions.values()].find( + s => s.channel === channel, + ); + // If there are subscriptions still listening to this channel, do not + // unsubscribe from the server + if (!multipleExists) { + this.send({ action: 'unsubscribe', channel: sub.channel }); + } + + // If there are no subscriptions, close the connection + if (this.subscriptions.size === 0) { + this.ws?.close(WS_CLOSE_NORMAL); + this.ws = null; + } + }; + + return { unsubscribe }; + } + + private send(data?: JsonObject): void { + const jsonMessage = JSON.stringify(data); + if (jsonMessage.length === 0) { + return; + } + + if (!this.ws || this.ws.readyState !== WebSocket.OPEN) { + if (data) { + this.messageQueue.unshift(jsonMessage); + } + return; + } + + // First send queue + for (const msg of this.messageQueue) { + this.ws!.send(msg); + } + this.messageQueue = []; + if (data) { + this.ws!.send(jsonMessage); + } + } + + private async connect() { + if (this.ws && this.ws.readyState === WebSocket.OPEN) { + return; + } + + const apiUrl = await this.discoveryApi.getBaseUrl('signals'); + const { token } = await this.identity.getCredentials(); + + const url = new URL(apiUrl); + url.protocol = url.protocol === 'http:' ? 'ws:' : 'wss:'; + this.ws = new WebSocket(url.toString(), token); + + this.ws.onmessage = (data: MessageEvent) => { + this.handleMessage(data); + }; + + this.ws.onerror = () => { + this.reconnect(); + }; + + this.ws.onclose = (ev: CloseEvent) => { + if (ev.code !== WS_CLOSE_NORMAL && ev.code !== WS_CLOSE_GOING_AWAY) { + this.reconnect(); + } + }; + + // Wait until connection is open + let connectSleep = 0; + while ( + this.ws && + this.ws.readyState !== WebSocket.OPEN && + connectSleep < this.connectTimeout + ) { + await new Promise(r => setTimeout(r, 100)); + connectSleep += 100; + } + + if (!this.ws || this.ws.readyState !== WebSocket.OPEN) { + throw new Error('Connect timeout'); + } + } + + private handleMessage(data: MessageEvent) { + try { + const json = JSON.parse(data.data) as JsonObject; + if (json.channel) { + for (const sub of this.subscriptions.values()) { + if (sub.channel === json.channel) { + sub.callback(json.message as JsonObject); + } + } + } + } catch (e) { + // NOOP + } + } + + private reconnect() { + if (this.reconnectTo) { + clearTimeout(this.reconnectTo); + } + + this.reconnectTo = setTimeout(() => { + this.reconnectTo = null; + if (this.ws) { + this.ws.close(); + } + this.ws = null; + this.connect() + .then(() => { + // Resubscribe to existing channels in case we lost connection + for (const sub of this.subscriptions.values()) { + this.send({ action: 'subscribe', channel: sub.channel }); + } + }) + .catch(() => { + this.reconnect(); + }); + }, this.reconnectTimeout); + } +} diff --git a/plugins/signals/src/api/SignalsClient.test.ts b/plugins/signals/src/api/SignalsClient.test.ts new file mode 100644 index 0000000000..2e93cd69f1 --- /dev/null +++ b/plugins/signals/src/api/SignalsClient.test.ts @@ -0,0 +1,126 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; +import WS from 'jest-websocket-mock'; +import { SignalClient } from './SignalClient'; + +describe('SignalsClient', () => { + const tokenFunction = jest.fn(); + const baseUrlFunction = jest.fn(); + const identity = { + getCredentials: tokenFunction, + } as unknown as IdentityApi; + const discoveryApi = { + getBaseUrl: baseUrlFunction, + } as unknown as DiscoveryApi; + + let server: WS; + + beforeEach(async () => { + jest.resetAllMocks(); + tokenFunction.mockResolvedValue({ token: '12345' }); + baseUrlFunction.mockResolvedValue('http://localhost:1234'); + server = new WS('ws://localhost:1234', { jsonProtocol: true }); + }); + + afterEach(() => { + WS.clean(); + }); + + it('should handle single subscription correctly', async () => { + const messageMock = jest.fn(); + const client = SignalClient.create({ discoveryApi, identity }); + const { unsubscribe } = client.subscribe('channel', messageMock); + await server.connected; + + await expect(server).toReceiveMessage({ + action: 'subscribe', + channel: 'channel', + }); + server.send({ channel: 'channel', message: { hello: 'world' } }); + expect(messageMock).toHaveBeenCalledWith({ hello: 'world' }); + + await unsubscribe(); + + await expect(server).toReceiveMessage({ + action: 'unsubscribe', + channel: 'channel', + }); + }); + + it('should handle multiple subscription correctly', async () => { + const messageMock1 = jest.fn(); + const messageMock2 = jest.fn(); + const client1 = SignalClient.create({ discoveryApi, identity }); + const client2 = SignalClient.create({ discoveryApi, identity }); + const { unsubscribe: unsubscribe1 } = client1.subscribe( + 'channel', + messageMock1, + ); + const { unsubscribe: unsubscribe2 } = client2.subscribe( + 'channel', + messageMock2, + ); + + await server.connected; + + await expect(server).toReceiveMessage({ + action: 'subscribe', + channel: 'channel', + }); + server.send({ channel: 'channel', message: { hello: 'world' } }); + expect(messageMock1).toHaveBeenCalledWith({ hello: 'world' }); + expect(messageMock2).toHaveBeenCalledWith({ hello: 'world' }); + + await unsubscribe1(); + await expect(server).not.toReceiveMessage({ + action: 'unsubscribe', + channel: 'channel', + }); + + await unsubscribe2(); + await expect(server).toReceiveMessage({ + action: 'unsubscribe', + channel: 'channel', + }); + }); + + it('should reconnect on error', async () => { + const messageMock = jest.fn(); + const client = SignalClient.create({ + discoveryApi, + identity, + reconnectTimeout: 10, + connectTimeout: 100, + }); + + client.subscribe('channel', messageMock); + await server.connected; + await expect(server).toReceiveMessage({ + action: 'subscribe', + channel: 'channel', + }); + + await server.server.emit('error', null); + + await new Promise(r => setTimeout(r, 50)); + await expect(server).toReceiveMessage({ + action: 'subscribe', + channel: 'channel', + }); + }); +}); diff --git a/plugins/signals/src/api/index.ts b/plugins/signals/src/api/index.ts new file mode 100644 index 0000000000..c76ae196ed --- /dev/null +++ b/plugins/signals/src/api/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 './SignalClient'; diff --git a/plugins/scaffolder/src/legacy/MultistepJsonForm/FieldOverrides/index.ts b/plugins/signals/src/index.ts similarity index 84% rename from plugins/scaffolder/src/legacy/MultistepJsonForm/FieldOverrides/index.ts rename to plugins/signals/src/index.ts index d6d0bf3499..ddf8afb9c6 100644 --- a/plugins/scaffolder/src/legacy/MultistepJsonForm/FieldOverrides/index.ts +++ b/plugins/signals/src/index.ts @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Backstage Authors + * 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. @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { DescriptionField } from './DescriptionField'; +export { signalsPlugin } from './plugin'; +export * from './api'; diff --git a/plugins/signals/src/plugin.test.ts b/plugins/signals/src/plugin.test.ts new file mode 100644 index 0000000000..cc8ecf44ed --- /dev/null +++ b/plugins/signals/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 { signalsPlugin } from './plugin'; + +describe('signals', () => { + it('should export plugin', () => { + expect(signalsPlugin).toBeDefined(); + }); +}); diff --git a/plugins/signals/src/plugin.ts b/plugins/signals/src/plugin.ts new file mode 100644 index 0000000000..eb3f9126e2 --- /dev/null +++ b/plugins/signals/src/plugin.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 { + createApiFactory, + createPlugin, + discoveryApiRef, + identityApiRef, +} from '@backstage/core-plugin-api'; +import { signalApiRef } from '@backstage/plugin-signals-react'; +import { SignalClient } from './api/SignalClient'; + +/** @public */ +export const signalsPlugin = createPlugin({ + id: 'signals', + apis: [ + createApiFactory({ + api: signalApiRef, + deps: { + identity: identityApiRef, + discoveryApi: discoveryApiRef, + }, + factory: ({ identity, discoveryApi }) => { + return SignalClient.create({ + identity, + discoveryApi, + }); + }, + }), + ], +}); diff --git a/plugins/signals/src/setupTests.ts b/plugins/signals/src/setupTests.ts new file mode 100644 index 0000000000..865308e634 --- /dev/null +++ b/plugins/signals/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. + */ +import '@testing-library/jest-dom'; diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index 0400401b5a..87231ab9af 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-sonarqube-backend +## 0.2.11 + +### Patch Changes + +- 53445cd: Updated README +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.2.11-next.2 + +### Patch Changes + +- 53445cd: Updated README +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 0.2.11-next.1 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index 6259f61c48..91f11aabfb 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.2.11-next.1", + "version": "0.2.11", "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 aa62e7d7bf..b011d429fd 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-sonarqube-react +## 0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-model@1.4.3 + ## 0.1.12-next.0 ### Patch Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index 7ed2bd32f4..a2c3b8268d 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.12-next.0", + "version": "0.1.12", "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 b1c35352eb..36734946b6 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-sonarqube +## 0.7.11 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-sonarqube-react@0.1.12 + +## 0.7.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.7.11-next.1 ### Patch Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 1a193856d4..9d91262e01 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.7.11-next.1", + "version": "0.7.11", "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 88a43858a1..ae6eba08f7 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-splunk-on-call +## 0.4.18 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + +## 0.4.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.4.18-next.1 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 9485151bf8..ee5b1b17cd 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.18-next.1", + "version": "0.4.18", "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 944d27519e..ac375db564 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-stack-overflow-backend +## 0.2.13 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/plugin-search-backend-module-stack-overflow-collator@0.1.2 + +## 0.2.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-stack-overflow-collator@0.1.2-next.2 + ## 0.2.13-next.1 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index 54facfce7f..9356be7bd2 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-stack-overflow-backend", "description": "Deprecated, consider using @backstage/plugin-search-backend-module-stack-overflow-collator instead", - "version": "0.2.13-next.1", + "version": "0.2.13", "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 c3b64f532c..f13fefd91a 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-stack-overflow +## 0.1.24 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-home-react@0.1.7 + - @backstage/plugin-search-react@1.7.5 + - @backstage/config@1.1.1 + - @backstage/plugin-search-common@1.2.10 + +## 0.1.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-home-react@0.1.7-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + ## 0.1.24-next.1 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 5497cbc8d4..dcce8e793f 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.24-next.1", + "version": "0.1.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/src/api/StackOverflowClient.test.ts b/plugins/stack-overflow/src/api/StackOverflowClient.test.ts index 6574771350..e5967b6d45 100644 --- a/plugins/stack-overflow/src/api/StackOverflowClient.test.ts +++ b/plugins/stack-overflow/src/api/StackOverflowClient.test.ts @@ -27,19 +27,34 @@ const backstageQuestions: StackOverflowQuestion[] = [ { title: 'What is it?', link: 'https://example.com:9191/questions/1', - tags: ['asdf'], + tags: ['backstage'], owner: { who: 'me' }, answer_count: 3, }, { title: 'Is it?', link: 'https://example.com:9191/questions/2', - tags: ['asdf'], + tags: ['backstage'], owner: { who: 'me' }, answer_count: 4, }, ]; +const vimQuestions: StackOverflowQuestion[] = [ + { + title: 'How do I exit vim?', + link: 'https://example.com:9191/questions/3', + tags: ['vim'], + owner: { who: 'me' }, + answer_count: 5, + }, +]; + +const questionMap: Record = { + backstage: backstageQuestions, + vim: vimQuestions, +}; + describe('StackOverflowClient', () => { setupRequestMockHandlers(server); @@ -48,19 +63,15 @@ describe('StackOverflowClient', () => { const setupHandlers = () => { server.use( rest.get(`${mockBaseUrl}/questions`, (req, res, ctx) => { - return res( - ctx.json({ - items: - req.url.searchParams.get('tagged') === 'backstage' - ? backstageQuestions - : [], - }), - ); + const taggedParam = req.url.searchParams.get('tagged'); + const questions = taggedParam ? questionMap[taggedParam] || [] : []; + + return res(ctx.json({ items: questions })); }), ); }; - it('list questions should return all questions', async () => { + it('list questions should return all questions with the provided tag', async () => { setupHandlers(); const client = StackOverflowClient.fromConfig( new ConfigReader({ @@ -70,10 +81,17 @@ describe('StackOverflowClient', () => { }), ); - const responseQuestions = await client.listQuestions({ + const bsQuestions = await client.listQuestions({ requestParams: { tagged: 'backstage' }, }); - expect(responseQuestions.length).toEqual(2); - expect(responseQuestions).toEqual(backstageQuestions); + + const vQuestions = await client.listQuestions({ + requestParams: { tagged: 'vim' }, + }); + + expect(bsQuestions.length).toEqual(2); + expect(bsQuestions).toEqual(backstageQuestions); + expect(vQuestions.length).toEqual(1); + expect(vQuestions).toEqual(vimQuestions); }); }); diff --git a/plugins/stack-overflow/src/api/StackOverflowClient.ts b/plugins/stack-overflow/src/api/StackOverflowClient.ts index f598f912bd..d2f95c5236 100644 --- a/plugins/stack-overflow/src/api/StackOverflowClient.ts +++ b/plugins/stack-overflow/src/api/StackOverflowClient.ts @@ -46,6 +46,7 @@ export class StackOverflowClient implements StackOverflowApi { }): Promise { const params = qs.stringify(options.requestParams, { addQueryPrefix: true, + arrayFormat: 'repeat', }); const response = await fetch(`${this.baseUrl}/questions${params}`); const data = await response.json(); diff --git a/plugins/stackstorm/CHANGELOG.md b/plugins/stackstorm/CHANGELOG.md index be02933ca6..dcade807b8 100644 --- a/plugins/stackstorm/CHANGELOG.md +++ b/plugins/stackstorm/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-stackstorm +## 0.1.10 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/errors@1.2.3 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/stackstorm/package.json b/plugins/stackstorm/package.json index f2c85ed5b9..d22b17be40 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.10-next.1", + "version": "0.1.10", "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 0d40dc7fd9..d90a7f158a 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.41 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/plugin-tech-insights-node@0.4.15 + - @backstage/errors@1.2.3 + - @backstage/plugin-tech-insights-common@0.2.12 + +## 0.1.41-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-tech-insights-node@0.4.15-next.2 + ## 0.1.41-next.1 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index a8ba792071..3a17a952d8 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.41-next.1", + "version": "0.1.41", "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 50521df4b2..3812ef6d91 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-tech-insights-backend +## 0.5.23 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-tech-insights-node@0.4.15 + - @backstage/backend-tasks@0.5.14 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + +## 0.5.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/plugin-tech-insights-node@0.4.15-next.2 + ## 0.5.23-next.1 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 1a5efee76f..92a3399683 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.23-next.1", + "version": "0.5.23", "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 f00609c4a0..a93118ad6a 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-tech-insights-node +## 0.4.15 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + +## 0.4.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.2 + ## 0.4.15-next.1 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index 9c88957a87..824b4cb752 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.15-next.1", + "version": "0.4.15", "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 989f5348e0..81349dfe8f 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-tech-insights +## 0.3.21 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-tech-insights-common@0.2.12 + +## 0.3.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.3.21-next.1 ### Patch Changes diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 058ab823a4..c37d516e06 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.21-next.1", + "version": "0.3.21", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index f8ec1b4f60..073fe92739 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-tech-radar +## 0.6.12 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + +## 0.6.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + ## 0.6.12-next.1 ### Patch Changes diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index a984e2d23f..b94382a239 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.12-next.1", + "version": "0.6.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-radar/src/alpha.tsx b/plugins/tech-radar/src/alpha.tsx index 1fb5fa06f3..54e209fae3 100644 --- a/plugins/tech-radar/src/alpha.tsx +++ b/plugins/tech-radar/src/alpha.tsx @@ -27,6 +27,7 @@ import { SampleTechRadarApi } from './sample'; import { compatWrapper, convertLegacyRouteRef, + convertLegacyRouteRefs, } from '@backstage/core-compat-api'; import { rootRouteRef } from './plugin'; @@ -61,7 +62,7 @@ export const techRadarApi = createApiExtension({ export default createPlugin({ id: 'tech-radar', extensions: [techRadarPage, techRadarApi], - routes: { - root: convertLegacyRouteRef(rootRouteRef), - }, + routes: convertLegacyRouteRefs({ + root: rootRouteRef, + }), }); diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 2142255971..9ceb5d0a09 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.26 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-techdocs@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/plugin-search-react@1.7.5 + - @backstage/integration-react@1.1.23 + - @backstage/core-app-api@1.11.3 + - @backstage/test-utils@1.4.7 + +## 1.0.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-techdocs@1.9.3-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/integration-react@1.1.23-next.0 + ## 1.0.26-next.1 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index cd4c21b0d4..bd150c9326 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.26-next.1", + "version": "1.0.26", "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 4b890ab4d5..25116c2810 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-techdocs-backend +## 1.9.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.13 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-techdocs-node@1.11.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-common@1.0.20 + +## 1.9.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 + - @backstage/plugin-techdocs-node@1.11.1-next.2 + ## 1.9.2-next.1 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index ba5f004bd2..1f13ed3d5c 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.9.2-next.1", + "version": "1.9.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 7aa5393113..c6c4070487 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.1.4 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/integration-react@1.1.23 + - @backstage/integration@1.8.0 + ## 1.1.4-next.1 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index f29baf4c05..1d296eb158 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.1.4-next.1", + "version": "1.1.4", "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 1008e78ac4..c4aeb5c4d7 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-techdocs-node +## 1.11.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/integration-aws-node@0.1.8 + - @backstage/plugin-search-common@1.2.10 + +## 1.11.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + ## 1.11.1-next.1 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 8ba9aa0ee4..592ae94151 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.11.1-next.1", + "version": "1.11.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index a6273af03c..7017882a65 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs-react +## 1.1.15 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/version-bridge@1.0.7 + ## 1.1.15-next.1 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 3be8499a2d..1bdb2a29c8 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.15-next.1", + "version": "1.1.15", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 94e22b0f87..9a982a80f5 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-techdocs +## 1.9.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-search-react@1.7.5 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + - @backstage/theme@0.5.0 + - @backstage/plugin-search-common@1.2.10 + +## 1.9.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/integration-react@1.1.23-next.0 + ## 1.9.3-next.1 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 9ee3772543..51c631e8ec 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.9.3-next.1", + "version": "1.9.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs/src/alpha.tsx b/plugins/techdocs/src/alpha.tsx index ef564d469a..88dce3b48e 100644 --- a/plugins/techdocs/src/alpha.tsx +++ b/plugins/techdocs/src/alpha.tsx @@ -34,6 +34,7 @@ import { import { compatWrapper, convertLegacyRouteRef, + convertLegacyRouteRefs, } from '@backstage/core-compat-api'; import { techdocsApiRef, @@ -168,9 +169,9 @@ export default createPlugin({ techDocsEntityContent, techDocsSearchResultListItemExtension, ], - routes: { - root: convertLegacyRouteRef(rootRouteRef), - docRoot: convertLegacyRouteRef(rootDocsRouteRef), - entityContent: convertLegacyRouteRef(rootCatalogDocsRouteRef), - }, + routes: convertLegacyRouteRefs({ + root: rootRouteRef, + docRoot: rootDocsRouteRef, + entityContent: rootCatalogDocsRouteRef, + }), }); diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index c1f03e5d89..bbda40e0a7 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-todo-backend +## 0.3.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-openapi-utils@0.1.2 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/integration@1.8.0 + +## 0.3.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-openapi-utils@0.1.2-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + ## 0.3.7-next.1 ### Patch Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index e3548286fb..ddf3baac3d 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.3.7-next.1", + "version": "0.3.7", "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 02bb1a1fe3..bc736a73fc 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-todo +## 0.2.33 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.2.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.2.33-next.1 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index b3300fc378..d7ee6b83c0 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.33-next.1", + "version": "0.2.33", "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 d12ebc4344..c9ab9a3263 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-user-settings-backend +## 0.2.8 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + ## 0.2.8-next.1 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index af5fa09808..d3c3abca49 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.2.8-next.1", + "version": "0.2.8", "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 d6a0b76e31..e733ca5372 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-user-settings +## 0.8.0 + +### Minor Changes + +- 56b2fb0: Updated the user settings selector to use a select component that displays native language names instead of language codes if possible. + +### Patch Changes + +- eea0849: add user-settings declarative integration core nav item +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/core-app-api@1.11.3 + - @backstage/errors@1.2.3 + - @backstage/theme@0.5.0 + - @backstage/types@1.1.1 + +## 0.8.0-next.2 + +### Patch Changes + +- eea0849: add user-settings declarative integration core nav item +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.8.0-next.1 ### Minor Changes diff --git a/plugins/user-settings/api-report-alpha.md b/plugins/user-settings/api-report-alpha.md index adb609a2cb..b06fd1e583 100644 --- a/plugins/user-settings/api-report-alpha.md +++ b/plugins/user-settings/api-report-alpha.md @@ -4,6 +4,7 @@ ```ts import { BackstagePlugin } from '@backstage/frontend-plugin-api'; +import { ExtensionDefinition } from '@backstage/frontend-plugin-api'; import { RouteRef } from '@backstage/frontend-plugin-api'; import { TranslationRef } from '@backstage/core-plugin-api/alpha'; @@ -16,6 +17,11 @@ const _default: BackstagePlugin< >; export default _default; +// @alpha (undocumented) +export const settingsNavItem: ExtensionDefinition<{ + title: string; +}>; + // @alpha (undocumented) export const userSettingsTranslationRef: TranslationRef< 'user-settings', diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 274644d4e1..c873786874 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.8.0-next.1", + "version": "0.8.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/src/alpha.tsx b/plugins/user-settings/src/alpha.tsx index 06590d839a..f14db7233d 100644 --- a/plugins/user-settings/src/alpha.tsx +++ b/plugins/user-settings/src/alpha.tsx @@ -16,13 +16,16 @@ import { coreExtensionData, createExtensionInput, + createNavItemExtension, createPageExtension, createPlugin, } from '@backstage/frontend-plugin-api'; import { convertLegacyRouteRef, + convertLegacyRouteRefs, compatWrapper, } from '@backstage/core-compat-api'; +import SettingsIcon from '@material-ui/icons/Settings'; import { settingsRouteRef } from './plugin'; import React from 'react'; @@ -50,13 +53,20 @@ const userSettingsPage = createPageExtension({ ), }); +/** @alpha */ +export const settingsNavItem = createNavItemExtension({ + routeRef: convertLegacyRouteRef(settingsRouteRef), + title: 'Settings', + icon: SettingsIcon, +}); + /** * @alpha */ export default createPlugin({ id: 'user-settings', - extensions: [userSettingsPage], - routes: { - root: convertLegacyRouteRef(settingsRouteRef), - }, + extensions: [userSettingsPage, settingsNavItem], + routes: convertLegacyRouteRefs({ + root: settingsRouteRef, + }), }); diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index a306ad4205..efc029a962 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-vault-backend +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-tasks@0.5.14 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-vault-node@0.1.2 + +## 0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-vault-node@0.1.2-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + ## 0.4.2-next.1 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index e550be780e..ed98b0f441 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.4.2-next.1", + "version": "0.4.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault-node/CHANGELOG.md b/plugins/vault-node/CHANGELOG.md index 092800a9a9..7b7c8e0d6e 100644 --- a/plugins/vault-node/CHANGELOG.md +++ b/plugins/vault-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-vault-node +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + ## 0.1.2-next.1 ### Patch Changes diff --git a/plugins/vault-node/package.json b/plugins/vault-node/package.json index 7835ec16c9..b3977cf3a5 100644 --- a/plugins/vault-node/package.json +++ b/plugins/vault-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-node", "description": "Node.js library for the vault plugin", - "version": "0.1.2-next.1", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index b2b44d3d1c..bb5e881c8f 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-vault +## 0.1.24 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.1.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.3-next.2 + ## 0.1.24-next.1 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index 48abd099a9..2ad4f60d66 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.24-next.1", + "version": "0.1.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/visualizer/CHANGELOG.md b/plugins/visualizer/CHANGELOG.md deleted file mode 100644 index 7bb94a5016..0000000000 --- a/plugins/visualizer/CHANGELOG.md +++ /dev/null @@ -1,29 +0,0 @@ -# @backstage/plugin-visualizer - -## 0.0.2-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.2-next.0 - - @backstage/core-components@0.13.10-next.1 - - @backstage/frontend-plugin-api@0.4.1-next.1 - -## 0.0.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/core-components@0.13.10-next.0 - - @backstage/frontend-plugin-api@0.4.1-next.0 - - @backstage/core-plugin-api@1.8.1 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies - - @backstage/core-plugin-api@1.8.1 - - @backstage/frontend-plugin-api@0.4.0 - - @backstage/core-components@0.13.9 - - @backstage/theme@0.5.0 diff --git a/plugins/visualizer/README.md b/plugins/visualizer/README.md deleted file mode 100644 index dd6f081a18..0000000000 --- a/plugins/visualizer/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @backstage/plugin-visualizer - -A plugin to help visualize the structure of your Backstage app. diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index 2a24ea4d43..1fc98ffa8b 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-xcmetrics +## 0.2.47 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/errors@1.2.3 + ## 0.2.47-next.1 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index 538ed5f993..9ee51bb5c5 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.47-next.1", + "version": "0.2.47", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/scripts/check-docs-quality.js b/scripts/check-docs-quality.js index d3b51a49a3..7960ff72bb 100755 --- a/scripts/check-docs-quality.js +++ b/scripts/check-docs-quality.js @@ -70,7 +70,7 @@ async function exitIfMissingVale() { process.exit(1); } console.log(`Language linter (vale) generated errors. Please check the errors and review any markdown files that you changed. - Possibly update .github/vale/Vocab/Backstage/accept.txt to add new valid words.\n`); + Possibly update .github/vale/config/vocabularies/Backstage/accept.txt to add new valid words.\n`); process.exit(0); } } @@ -89,7 +89,7 @@ async function runVale(files) { // If it contains system level error. In this case vale does not exist. if (process.platform !== 'win32' || result.error) { console.log(`Language linter (vale) generated errors. Please check the errors and review any markdown files that you changed. - Possibly update .github/vale/Vocab/Backstage/accept.txt to add new valid words.\n`); + Possibly update .github/vale/config/vocabularies/Backstage/accept.txt to add new valid words.\n`); } return false; } diff --git a/storybook/yarn.lock b/storybook/yarn.lock index 5c3f333454..0be4de1f7f 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -2842,90 +2842,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-darwin-arm64@npm:1.3.102" +"@swc/core-darwin-arm64@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-darwin-arm64@npm:1.3.104" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-darwin-x64@npm:1.3.102" +"@swc/core-darwin-x64@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-darwin-x64@npm:1.3.104" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.102" +"@swc/core-linux-arm-gnueabihf@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.104" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.102" +"@swc/core-linux-arm64-gnu@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.104" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.102" +"@swc/core-linux-arm64-musl@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.104" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.102" +"@swc/core-linux-x64-gnu@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.104" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-x64-musl@npm:1.3.102" +"@swc/core-linux-x64-musl@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-x64-musl@npm:1.3.104" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.102" +"@swc/core-win32-arm64-msvc@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.104" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.102" +"@swc/core-win32-ia32-msvc@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.104" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.102" +"@swc/core-win32-x64-msvc@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.104" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.3.102 - resolution: "@swc/core@npm:1.3.102" + version: 1.3.104 + resolution: "@swc/core@npm:1.3.104" dependencies: - "@swc/core-darwin-arm64": 1.3.102 - "@swc/core-darwin-x64": 1.3.102 - "@swc/core-linux-arm-gnueabihf": 1.3.102 - "@swc/core-linux-arm64-gnu": 1.3.102 - "@swc/core-linux-arm64-musl": 1.3.102 - "@swc/core-linux-x64-gnu": 1.3.102 - "@swc/core-linux-x64-musl": 1.3.102 - "@swc/core-win32-arm64-msvc": 1.3.102 - "@swc/core-win32-ia32-msvc": 1.3.102 - "@swc/core-win32-x64-msvc": 1.3.102 + "@swc/core-darwin-arm64": 1.3.104 + "@swc/core-darwin-x64": 1.3.104 + "@swc/core-linux-arm-gnueabihf": 1.3.104 + "@swc/core-linux-arm64-gnu": 1.3.104 + "@swc/core-linux-arm64-musl": 1.3.104 + "@swc/core-linux-x64-gnu": 1.3.104 + "@swc/core-linux-x64-musl": 1.3.104 + "@swc/core-win32-arm64-msvc": 1.3.104 + "@swc/core-win32-ia32-msvc": 1.3.104 + "@swc/core-win32-x64-msvc": 1.3.104 "@swc/counter": ^0.1.1 "@swc/types": ^0.1.5 peerDependencies: @@ -2954,7 +2954,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 45c0edb06f87a811e28fb3ed587fbe6b7ca67ff2440fe15666d43729788903a4af61e3b57842aecc0b2b70e3c9981b698d8233746ba94dfb5a19e1c62eea33ad + checksum: 95fbf1412c8685d311cf2d7efbfa43e082d2d9e84ece48c4d8d96d6c67c5923569bfb26352451eb3e4d98adcb556dcfac65271c0fba77f078bb755fe2f64b295 languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 53d8974d6c..8501156914 100644 --- a/yarn.lock +++ b/yarn.lock @@ -138,35 +138,35 @@ __metadata: languageName: node linkType: hard -"@asyncapi/avro-schema-parser@npm:^3.0.7": - version: 3.0.7 - resolution: "@asyncapi/avro-schema-parser@npm:3.0.7" +"@asyncapi/avro-schema-parser@npm:^3.0.9": + version: 3.0.9 + resolution: "@asyncapi/avro-schema-parser@npm:3.0.9" dependencies: - "@asyncapi/parser": ^3.0.1 + "@asyncapi/parser": ^3.0.2 "@types/json-schema": ^7.0.11 avsc: ^5.7.6 - checksum: c7755708161f41812ebee90c92fb721176230f0006ddd01683b72c7c1d484a6c5cbe7d7e59c54a5c7221f5f722388642ec26b19a67adc9d30059067cc4276d69 + checksum: db451bc9413a9caef2e45f577dbc04c0e2f94183793ab791979384e900716b2af9d77db15251128b4316b6a87bdb4be6405fb12d3712a21a6f6d3e71256a18e4 languageName: node linkType: hard -"@asyncapi/openapi-schema-parser@npm:^3.0.8": - version: 3.0.8 - resolution: "@asyncapi/openapi-schema-parser@npm:3.0.8" +"@asyncapi/openapi-schema-parser@npm:^3.0.10": + version: 3.0.10 + resolution: "@asyncapi/openapi-schema-parser@npm:3.0.10" dependencies: - "@asyncapi/parser": ^3.0.1 + "@asyncapi/parser": ^3.0.2 "@openapi-contrib/openapi-schema-to-json-schema": ~3.2.0 ajv: ^8.11.0 ajv-errors: ^3.0.0 ajv-formats: ^2.1.1 - checksum: 9c3f49d1a826818b864b2a0b16144d88eb2ecf7ca1d9c1e8554eac30d9875619638924892d093f0270b6b9a04efca1a8918dd5a7eb13fd88c14183d467af5ceb + checksum: ddab8b38b86a2ca12dc9345e1a911cfd63bd537524bbb3bc804a137947381eb97e287c6383cf3575a46cadb73f60c2a826a589c54b15ef3881e5a2bb499d2f4c languageName: node linkType: hard -"@asyncapi/parser@npm:^3.0.1": - version: 3.0.1 - resolution: "@asyncapi/parser@npm:3.0.1" +"@asyncapi/parser@npm:^3.0.2": + version: 3.0.2 + resolution: "@asyncapi/parser@npm:3.0.2" dependencies: - "@asyncapi/specs": ^6.1.0 + "@asyncapi/specs": ^6.2.0 "@openapi-contrib/openapi-schema-to-json-schema": ~3.2.0 "@stoplight/json": ^3.20.2 "@stoplight/json-ref-readers": ^1.2.2 @@ -185,29 +185,29 @@ __metadata: js-yaml: ^4.1.0 jsonpath-plus: ^7.2.0 node-fetch: 2.6.7 - checksum: 6dce457e58dcf9dab8bfb945a7cb9507a2fb686c143d04b77f2f1fe1c1247f9fa76134c872203c3e10398005155f4b9bb4b5e43edfb956c1e9ae4d3d95b6ceb3 + checksum: 07c82c5fddbc97f5f53a7ab29e0e8b538d325bbd2a15c9f130b79d7f0d253af001207ea9121b7de88d672f23514bdf33d327bb322653281f0cd582ea9f15e962 languageName: node linkType: hard -"@asyncapi/protobuf-schema-parser@npm:^3.0.4": - version: 3.0.4 - resolution: "@asyncapi/protobuf-schema-parser@npm:3.0.4" +"@asyncapi/protobuf-schema-parser@npm:^3.0.6": + version: 3.0.6 + resolution: "@asyncapi/protobuf-schema-parser@npm:3.0.6" dependencies: - "@asyncapi/parser": ^3.0.1 + "@asyncapi/parser": ^3.0.2 "@types/protocol-buffers-schema": ^3.4.1 protocol-buffers-schema: ^3.6.0 - checksum: c176e6d86e53f342ac91067279fb6e1ac3ed9d7f36de197fc723a2ceaf2a2588267c445203d67edcb3cd75308c0c0d6ea401ad69508bfe378c9194420702d3db + checksum: 9e185734971c10bcc5155b734939a74f3b87b4fe6173c8e4d404c723611b0257a67e4728c3999ea5d37d9ae89608026f73a9bdc4fb51bfa958eb5eece418aee3 languageName: node linkType: hard -"@asyncapi/react-component@npm:1.2.6": - version: 1.2.6 - resolution: "@asyncapi/react-component@npm:1.2.6" +"@asyncapi/react-component@npm:1.2.13": + version: 1.2.13 + resolution: "@asyncapi/react-component@npm:1.2.13" dependencies: - "@asyncapi/avro-schema-parser": ^3.0.7 - "@asyncapi/openapi-schema-parser": ^3.0.8 - "@asyncapi/parser": ^3.0.1 - "@asyncapi/protobuf-schema-parser": ^3.0.4 + "@asyncapi/avro-schema-parser": ^3.0.9 + "@asyncapi/openapi-schema-parser": ^3.0.10 + "@asyncapi/parser": ^3.0.2 + "@asyncapi/protobuf-schema-parser": ^3.0.6 highlight.js: ^10.7.2 isomorphic-dompurify: ^0.13.0 marked: ^4.0.14 @@ -216,7 +216,7 @@ __metadata: peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 4afb34562767771048d0848323adea8d498dc555cc529947d4a45f3ec8d7f172bb454814bcf9c4419e105a743736368b56b3ed54d09b60addc06a287ca0e82b9 + checksum: 1e870caa07a3507685ab52af7e34f31c47b31464159f435f29b0be68adf1c110dc0c9196d8f20ab1d6b998500bbac821181477897636322c0c29fe2708284871 languageName: node linkType: hard @@ -229,12 +229,12 @@ __metadata: languageName: node linkType: hard -"@asyncapi/specs@npm:^6.1.0": - version: 6.1.0 - resolution: "@asyncapi/specs@npm:6.1.0" +"@asyncapi/specs@npm:^6.2.0": + version: 6.2.0 + resolution: "@asyncapi/specs@npm:6.2.0" dependencies: "@types/json-schema": ^7.0.11 - checksum: d4ad199ef58b8ef6be081e2e71fd172fdf6720479f3ae6f9b1e58037f833ca177c8af1dadeab4525c2c07e68ea0a4832e0d3dd67c3b033b988ca2435245f6aa6 + checksum: 9fa959350a75d9d9ab886436720d59bbf1c7bff16ed657fa34cce3a006136d2d853264366c8eee5abf4761f611c305acd5d7fb17e6de92fdc573b32e08f94912 languageName: node linkType: hard @@ -363,505 +363,515 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-cognito-identity@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.465.0" +"@aws-sdk/client-cognito-identity@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.495.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.465.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": ^2.0.18 - "@smithy/fetch-http-handler": ^2.2.6 - "@smithy/hash-node": ^2.0.15 - "@smithy/invalid-dependency": ^2.0.13 - "@smithy/middleware-content-length": ^2.0.15 - "@smithy/middleware-endpoint": ^2.2.0 - "@smithy/middleware-retry": ^2.0.20 - "@smithy/middleware-serde": ^2.0.13 - "@smithy/middleware-stack": ^2.0.7 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/node-http-handler": ^2.1.9 - "@smithy/protocol-http": ^3.0.9 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 - "@smithy/url-parser": ^2.0.13 - "@smithy/util-base64": ^2.0.1 - "@smithy/util-body-length-browser": ^2.0.0 - "@smithy/util-body-length-node": ^2.1.0 - "@smithy/util-defaults-mode-browser": ^2.0.19 - "@smithy/util-defaults-mode-node": ^2.0.25 - "@smithy/util-endpoints": ^1.0.4 - "@smithy/util-retry": ^2.0.6 - "@smithy/util-utf8": ^2.0.2 + "@aws-sdk/client-sts": 3.495.0 + "@aws-sdk/core": 3.495.0 + "@aws-sdk/credential-provider-node": 3.495.0 + "@aws-sdk/middleware-host-header": 3.495.0 + "@aws-sdk/middleware-logger": 3.495.0 + "@aws-sdk/middleware-recursion-detection": 3.495.0 + "@aws-sdk/middleware-signing": 3.495.0 + "@aws-sdk/middleware-user-agent": 3.495.0 + "@aws-sdk/region-config-resolver": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-endpoints": 3.495.0 + "@aws-sdk/util-user-agent-browser": 3.495.0 + "@aws-sdk/util-user-agent-node": 3.495.0 + "@smithy/config-resolver": ^2.1.0 + "@smithy/core": ^1.3.0 + "@smithy/fetch-http-handler": ^2.4.0 + "@smithy/hash-node": ^2.1.0 + "@smithy/invalid-dependency": ^2.1.0 + "@smithy/middleware-content-length": ^2.1.0 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/middleware-retry": ^2.1.0 + "@smithy/middleware-serde": ^2.1.0 + "@smithy/middleware-stack": ^2.1.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/node-http-handler": ^2.3.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/url-parser": ^2.1.0 + "@smithy/util-base64": ^2.1.0 + "@smithy/util-body-length-browser": ^2.1.0 + "@smithy/util-body-length-node": ^2.2.0 + "@smithy/util-defaults-mode-browser": ^2.1.0 + "@smithy/util-defaults-mode-node": ^2.1.0 + "@smithy/util-endpoints": ^1.1.0 + "@smithy/util-retry": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: e02382ef3138cae6c0b7a23cce4df4105ac440e2644b59a4a151033128a8db7e6bdc4d8eab60e550f7e686bb5900d57c14deee2d889db3962a7bf76f17a2d665 + checksum: 078c17e6f6fed15ee320a4d94e9925ff7ccb537416552492b3e66179998a8259c1d68c2f1523243c497c7bc64d613f33acc92b9f9c2c9238eee41be26aebcaf9 languageName: node linkType: hard "@aws-sdk/client-eks@npm:^3.350.0": - version: 3.465.0 - resolution: "@aws-sdk/client-eks@npm:3.465.0" + version: 3.495.0 + resolution: "@aws-sdk/client-eks@npm:3.495.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.465.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": ^2.0.18 - "@smithy/fetch-http-handler": ^2.2.6 - "@smithy/hash-node": ^2.0.15 - "@smithy/invalid-dependency": ^2.0.13 - "@smithy/middleware-content-length": ^2.0.15 - "@smithy/middleware-endpoint": ^2.2.0 - "@smithy/middleware-retry": ^2.0.20 - "@smithy/middleware-serde": ^2.0.13 - "@smithy/middleware-stack": ^2.0.7 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/node-http-handler": ^2.1.9 - "@smithy/protocol-http": ^3.0.9 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 - "@smithy/url-parser": ^2.0.13 - "@smithy/util-base64": ^2.0.1 - "@smithy/util-body-length-browser": ^2.0.0 - "@smithy/util-body-length-node": ^2.1.0 - "@smithy/util-defaults-mode-browser": ^2.0.19 - "@smithy/util-defaults-mode-node": ^2.0.25 - "@smithy/util-endpoints": ^1.0.4 - "@smithy/util-retry": ^2.0.6 - "@smithy/util-utf8": ^2.0.2 - "@smithy/util-waiter": ^2.0.13 + "@aws-sdk/client-sts": 3.495.0 + "@aws-sdk/core": 3.495.0 + "@aws-sdk/credential-provider-node": 3.495.0 + "@aws-sdk/middleware-host-header": 3.495.0 + "@aws-sdk/middleware-logger": 3.495.0 + "@aws-sdk/middleware-recursion-detection": 3.495.0 + "@aws-sdk/middleware-signing": 3.495.0 + "@aws-sdk/middleware-user-agent": 3.495.0 + "@aws-sdk/region-config-resolver": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-endpoints": 3.495.0 + "@aws-sdk/util-user-agent-browser": 3.495.0 + "@aws-sdk/util-user-agent-node": 3.495.0 + "@smithy/config-resolver": ^2.1.0 + "@smithy/core": ^1.3.0 + "@smithy/fetch-http-handler": ^2.4.0 + "@smithy/hash-node": ^2.1.0 + "@smithy/invalid-dependency": ^2.1.0 + "@smithy/middleware-content-length": ^2.1.0 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/middleware-retry": ^2.1.0 + "@smithy/middleware-serde": ^2.1.0 + "@smithy/middleware-stack": ^2.1.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/node-http-handler": ^2.3.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/url-parser": ^2.1.0 + "@smithy/util-base64": ^2.1.0 + "@smithy/util-body-length-browser": ^2.1.0 + "@smithy/util-body-length-node": ^2.2.0 + "@smithy/util-defaults-mode-browser": ^2.1.0 + "@smithy/util-defaults-mode-node": ^2.1.0 + "@smithy/util-endpoints": ^1.1.0 + "@smithy/util-retry": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 + "@smithy/util-waiter": ^2.1.0 tslib: ^2.5.0 uuid: ^8.3.2 - checksum: 9359da8f2c1e68de36b40ad6767d07442322db9c845f745f14213fa9672661b88aea7a61ab2bfad6f7fee7f3dde1efa0a55fe0b5577e998e2ae5e17495c9c8ff + checksum: f4d9ce87c23c1d117e4046c97ac974131e54b878eb0aed9457739ca0d202f8d36c9b2ba3718120de531fdb200ccab123a4d1f848ef8c3858b1ca5d81dcd9c789 languageName: node linkType: hard "@aws-sdk/client-organizations@npm:^3.350.0": - version: 3.465.0 - resolution: "@aws-sdk/client-organizations@npm:3.465.0" + version: 3.495.0 + resolution: "@aws-sdk/client-organizations@npm:3.495.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.465.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": ^2.0.18 - "@smithy/fetch-http-handler": ^2.2.6 - "@smithy/hash-node": ^2.0.15 - "@smithy/invalid-dependency": ^2.0.13 - "@smithy/middleware-content-length": ^2.0.15 - "@smithy/middleware-endpoint": ^2.2.0 - "@smithy/middleware-retry": ^2.0.20 - "@smithy/middleware-serde": ^2.0.13 - "@smithy/middleware-stack": ^2.0.7 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/node-http-handler": ^2.1.9 - "@smithy/protocol-http": ^3.0.9 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 - "@smithy/url-parser": ^2.0.13 - "@smithy/util-base64": ^2.0.1 - "@smithy/util-body-length-browser": ^2.0.0 - "@smithy/util-body-length-node": ^2.1.0 - "@smithy/util-defaults-mode-browser": ^2.0.19 - "@smithy/util-defaults-mode-node": ^2.0.25 - "@smithy/util-endpoints": ^1.0.4 - "@smithy/util-retry": ^2.0.6 - "@smithy/util-utf8": ^2.0.2 + "@aws-sdk/client-sts": 3.495.0 + "@aws-sdk/core": 3.495.0 + "@aws-sdk/credential-provider-node": 3.495.0 + "@aws-sdk/middleware-host-header": 3.495.0 + "@aws-sdk/middleware-logger": 3.495.0 + "@aws-sdk/middleware-recursion-detection": 3.495.0 + "@aws-sdk/middleware-signing": 3.495.0 + "@aws-sdk/middleware-user-agent": 3.495.0 + "@aws-sdk/region-config-resolver": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-endpoints": 3.495.0 + "@aws-sdk/util-user-agent-browser": 3.495.0 + "@aws-sdk/util-user-agent-node": 3.495.0 + "@smithy/config-resolver": ^2.1.0 + "@smithy/core": ^1.3.0 + "@smithy/fetch-http-handler": ^2.4.0 + "@smithy/hash-node": ^2.1.0 + "@smithy/invalid-dependency": ^2.1.0 + "@smithy/middleware-content-length": ^2.1.0 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/middleware-retry": ^2.1.0 + "@smithy/middleware-serde": ^2.1.0 + "@smithy/middleware-stack": ^2.1.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/node-http-handler": ^2.3.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/url-parser": ^2.1.0 + "@smithy/util-base64": ^2.1.0 + "@smithy/util-body-length-browser": ^2.1.0 + "@smithy/util-body-length-node": ^2.2.0 + "@smithy/util-defaults-mode-browser": ^2.1.0 + "@smithy/util-defaults-mode-node": ^2.1.0 + "@smithy/util-endpoints": ^1.1.0 + "@smithy/util-retry": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: 556b8f7233c71a075504be48ec5dcf2597cc95c3247fba0c992de6ba91db994e8560f80d9a05022c3c9f9c4764fed361488c9c3c35dfe1d2c370eee3f5ae93d8 + checksum: 3c7deae27a0549ff97551d577df701f21823ca6f3fc965b35add491642faf3ddb060183752687264727e10cc80addb1a3c263af81f2a35d15fe0c3edb02a5da2 languageName: node linkType: hard "@aws-sdk/client-s3@npm:^3.350.0": - version: 3.465.0 - resolution: "@aws-sdk/client-s3@npm:3.465.0" + version: 3.495.0 + resolution: "@aws-sdk/client-s3@npm:3.495.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.465.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/middleware-bucket-endpoint": 3.465.0 - "@aws-sdk/middleware-expect-continue": 3.465.0 - "@aws-sdk/middleware-flexible-checksums": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-location-constraint": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-sdk-s3": 3.465.0 - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/middleware-ssec": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/signature-v4-multi-region": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@aws-sdk/xml-builder": 3.465.0 - "@smithy/config-resolver": ^2.0.18 - "@smithy/eventstream-serde-browser": ^2.0.13 - "@smithy/eventstream-serde-config-resolver": ^2.0.13 - "@smithy/eventstream-serde-node": ^2.0.13 - "@smithy/fetch-http-handler": ^2.2.6 - "@smithy/hash-blob-browser": ^2.0.14 - "@smithy/hash-node": ^2.0.15 - "@smithy/hash-stream-node": ^2.0.15 - "@smithy/invalid-dependency": ^2.0.13 - "@smithy/md5-js": ^2.0.15 - "@smithy/middleware-content-length": ^2.0.15 - "@smithy/middleware-endpoint": ^2.2.0 - "@smithy/middleware-retry": ^2.0.20 - "@smithy/middleware-serde": ^2.0.13 - "@smithy/middleware-stack": ^2.0.7 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/node-http-handler": ^2.1.9 - "@smithy/protocol-http": ^3.0.9 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 - "@smithy/url-parser": ^2.0.13 - "@smithy/util-base64": ^2.0.1 - "@smithy/util-body-length-browser": ^2.0.0 - "@smithy/util-body-length-node": ^2.1.0 - "@smithy/util-defaults-mode-browser": ^2.0.19 - "@smithy/util-defaults-mode-node": ^2.0.25 - "@smithy/util-endpoints": ^1.0.4 - "@smithy/util-retry": ^2.0.6 - "@smithy/util-stream": ^2.0.20 - "@smithy/util-utf8": ^2.0.2 - "@smithy/util-waiter": ^2.0.13 + "@aws-sdk/client-sts": 3.495.0 + "@aws-sdk/core": 3.495.0 + "@aws-sdk/credential-provider-node": 3.495.0 + "@aws-sdk/middleware-bucket-endpoint": 3.495.0 + "@aws-sdk/middleware-expect-continue": 3.495.0 + "@aws-sdk/middleware-flexible-checksums": 3.495.0 + "@aws-sdk/middleware-host-header": 3.495.0 + "@aws-sdk/middleware-location-constraint": 3.495.0 + "@aws-sdk/middleware-logger": 3.495.0 + "@aws-sdk/middleware-recursion-detection": 3.495.0 + "@aws-sdk/middleware-sdk-s3": 3.495.0 + "@aws-sdk/middleware-signing": 3.495.0 + "@aws-sdk/middleware-ssec": 3.495.0 + "@aws-sdk/middleware-user-agent": 3.495.0 + "@aws-sdk/region-config-resolver": 3.495.0 + "@aws-sdk/signature-v4-multi-region": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-endpoints": 3.495.0 + "@aws-sdk/util-user-agent-browser": 3.495.0 + "@aws-sdk/util-user-agent-node": 3.495.0 + "@aws-sdk/xml-builder": 3.495.0 + "@smithy/config-resolver": ^2.1.0 + "@smithy/core": ^1.3.0 + "@smithy/eventstream-serde-browser": ^2.1.0 + "@smithy/eventstream-serde-config-resolver": ^2.1.0 + "@smithy/eventstream-serde-node": ^2.1.0 + "@smithy/fetch-http-handler": ^2.4.0 + "@smithy/hash-blob-browser": ^2.1.0 + "@smithy/hash-node": ^2.1.0 + "@smithy/hash-stream-node": ^2.1.0 + "@smithy/invalid-dependency": ^2.1.0 + "@smithy/md5-js": ^2.1.0 + "@smithy/middleware-content-length": ^2.1.0 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/middleware-retry": ^2.1.0 + "@smithy/middleware-serde": ^2.1.0 + "@smithy/middleware-stack": ^2.1.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/node-http-handler": ^2.3.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/url-parser": ^2.1.0 + "@smithy/util-base64": ^2.1.0 + "@smithy/util-body-length-browser": ^2.1.0 + "@smithy/util-body-length-node": ^2.2.0 + "@smithy/util-defaults-mode-browser": ^2.1.0 + "@smithy/util-defaults-mode-node": ^2.1.0 + "@smithy/util-endpoints": ^1.1.0 + "@smithy/util-retry": ^2.1.0 + "@smithy/util-stream": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 + "@smithy/util-waiter": ^2.1.0 fast-xml-parser: 4.2.5 tslib: ^2.5.0 - checksum: 05b80b8f3f9dd56b98fba39f8ec01e4f9db1ffd515594def1cc9e27a10d9f188042b482e92fd1865c1eaa91f633a28cf500ff212fa4a7a2f5c58108e9f3829d5 + checksum: 2add0f58189bfc394a6b3963ef4295b9997f3ea544d8a92ba2d16b9051f4fd07fb9f184e9ad6ca6ce665cbec496abd5e0e69a91a97213117dc20aafd3bed2840 languageName: node linkType: hard "@aws-sdk/client-sqs@npm:^3.350.0": - version: 3.465.0 - resolution: "@aws-sdk/client-sqs@npm:3.465.0" + version: 3.495.0 + resolution: "@aws-sdk/client-sqs@npm:3.495.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.465.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-sdk-sqs": 3.465.0 - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": ^2.0.18 - "@smithy/fetch-http-handler": ^2.2.6 - "@smithy/hash-node": ^2.0.15 - "@smithy/invalid-dependency": ^2.0.13 - "@smithy/md5-js": ^2.0.15 - "@smithy/middleware-content-length": ^2.0.15 - "@smithy/middleware-endpoint": ^2.2.0 - "@smithy/middleware-retry": ^2.0.20 - "@smithy/middleware-serde": ^2.0.13 - "@smithy/middleware-stack": ^2.0.7 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/node-http-handler": ^2.1.9 - "@smithy/protocol-http": ^3.0.9 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 - "@smithy/url-parser": ^2.0.13 - "@smithy/util-base64": ^2.0.1 - "@smithy/util-body-length-browser": ^2.0.0 - "@smithy/util-body-length-node": ^2.1.0 - "@smithy/util-defaults-mode-browser": ^2.0.19 - "@smithy/util-defaults-mode-node": ^2.0.25 - "@smithy/util-endpoints": ^1.0.4 - "@smithy/util-retry": ^2.0.6 - "@smithy/util-utf8": ^2.0.2 + "@aws-sdk/client-sts": 3.495.0 + "@aws-sdk/core": 3.495.0 + "@aws-sdk/credential-provider-node": 3.495.0 + "@aws-sdk/middleware-host-header": 3.495.0 + "@aws-sdk/middleware-logger": 3.495.0 + "@aws-sdk/middleware-recursion-detection": 3.495.0 + "@aws-sdk/middleware-sdk-sqs": 3.495.0 + "@aws-sdk/middleware-user-agent": 3.495.0 + "@aws-sdk/region-config-resolver": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-endpoints": 3.495.0 + "@aws-sdk/util-user-agent-browser": 3.495.0 + "@aws-sdk/util-user-agent-node": 3.495.0 + "@smithy/config-resolver": ^2.1.0 + "@smithy/core": ^1.3.0 + "@smithy/fetch-http-handler": ^2.4.0 + "@smithy/hash-node": ^2.1.0 + "@smithy/invalid-dependency": ^2.1.0 + "@smithy/md5-js": ^2.1.0 + "@smithy/middleware-content-length": ^2.1.0 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/middleware-retry": ^2.1.0 + "@smithy/middleware-serde": ^2.1.0 + "@smithy/middleware-stack": ^2.1.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/node-http-handler": ^2.3.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/url-parser": ^2.1.0 + "@smithy/util-base64": ^2.1.0 + "@smithy/util-body-length-browser": ^2.1.0 + "@smithy/util-body-length-node": ^2.2.0 + "@smithy/util-defaults-mode-browser": ^2.1.0 + "@smithy/util-defaults-mode-node": ^2.1.0 + "@smithy/util-endpoints": ^1.1.0 + "@smithy/util-middleware": ^2.1.0 + "@smithy/util-retry": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: 0137ad4ca2fe482a21955f6085dc76eccc87ec3e3b36b18171aa0726f582b0f2c5041e6fa3f076ce60e266865262d7d52fa921abd1c958af7b3eafa8160d2beb + checksum: 4dcbf031c1902149d8fa82f7c555eb416d904c1e197ad2deae927856748719c03b025bb122a131df34435269039a6b0538635826e0bcab204b86ef24fe4595b8 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/client-sso@npm:3.465.0" +"@aws-sdk/client-sso@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/client-sso@npm:3.495.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": ^2.0.18 - "@smithy/fetch-http-handler": ^2.2.6 - "@smithy/hash-node": ^2.0.15 - "@smithy/invalid-dependency": ^2.0.13 - "@smithy/middleware-content-length": ^2.0.15 - "@smithy/middleware-endpoint": ^2.2.0 - "@smithy/middleware-retry": ^2.0.20 - "@smithy/middleware-serde": ^2.0.13 - "@smithy/middleware-stack": ^2.0.7 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/node-http-handler": ^2.1.9 - "@smithy/protocol-http": ^3.0.9 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 - "@smithy/url-parser": ^2.0.13 - "@smithy/util-base64": ^2.0.1 - "@smithy/util-body-length-browser": ^2.0.0 - "@smithy/util-body-length-node": ^2.1.0 - "@smithy/util-defaults-mode-browser": ^2.0.19 - "@smithy/util-defaults-mode-node": ^2.0.25 - "@smithy/util-endpoints": ^1.0.4 - "@smithy/util-retry": ^2.0.6 - "@smithy/util-utf8": ^2.0.2 + "@aws-sdk/core": 3.495.0 + "@aws-sdk/middleware-host-header": 3.495.0 + "@aws-sdk/middleware-logger": 3.495.0 + "@aws-sdk/middleware-recursion-detection": 3.495.0 + "@aws-sdk/middleware-user-agent": 3.495.0 + "@aws-sdk/region-config-resolver": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-endpoints": 3.495.0 + "@aws-sdk/util-user-agent-browser": 3.495.0 + "@aws-sdk/util-user-agent-node": 3.495.0 + "@smithy/config-resolver": ^2.1.0 + "@smithy/core": ^1.3.0 + "@smithy/fetch-http-handler": ^2.4.0 + "@smithy/hash-node": ^2.1.0 + "@smithy/invalid-dependency": ^2.1.0 + "@smithy/middleware-content-length": ^2.1.0 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/middleware-retry": ^2.1.0 + "@smithy/middleware-serde": ^2.1.0 + "@smithy/middleware-stack": ^2.1.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/node-http-handler": ^2.3.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/url-parser": ^2.1.0 + "@smithy/util-base64": ^2.1.0 + "@smithy/util-body-length-browser": ^2.1.0 + "@smithy/util-body-length-node": ^2.2.0 + "@smithy/util-defaults-mode-browser": ^2.1.0 + "@smithy/util-defaults-mode-node": ^2.1.0 + "@smithy/util-endpoints": ^1.1.0 + "@smithy/util-retry": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: 83c2a1c1883a7900ea0c564e3f13c9d04a6970067e67182123b9be52505abbb1cf30d676312cb73ec637be4aab5094baa95d62e0ac910b0b2304cfe089f4f2df + checksum: a4672a8a2c454be634cb7e97a3cc075df55ad7ab8eb494bda3e4d16831f110212069668ab4fe6085f4b09920d1a04f3bd2cca0caf3a395d874cbcf5d71c6ffe7 languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.465.0, @aws-sdk/client-sts@npm:^3.350.0": - version: 3.465.0 - resolution: "@aws-sdk/client-sts@npm:3.465.0" +"@aws-sdk/client-sts@npm:3.495.0, @aws-sdk/client-sts@npm:^3.350.0": + version: 3.495.0 + resolution: "@aws-sdk/client-sts@npm:3.495.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-sdk-sts": 3.465.0 - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": ^2.0.18 - "@smithy/fetch-http-handler": ^2.2.6 - "@smithy/hash-node": ^2.0.15 - "@smithy/invalid-dependency": ^2.0.13 - "@smithy/middleware-content-length": ^2.0.15 - "@smithy/middleware-endpoint": ^2.2.0 - "@smithy/middleware-retry": ^2.0.20 - "@smithy/middleware-serde": ^2.0.13 - "@smithy/middleware-stack": ^2.0.7 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/node-http-handler": ^2.1.9 - "@smithy/protocol-http": ^3.0.9 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 - "@smithy/url-parser": ^2.0.13 - "@smithy/util-base64": ^2.0.1 - "@smithy/util-body-length-browser": ^2.0.0 - "@smithy/util-body-length-node": ^2.1.0 - "@smithy/util-defaults-mode-browser": ^2.0.19 - "@smithy/util-defaults-mode-node": ^2.0.25 - "@smithy/util-endpoints": ^1.0.4 - "@smithy/util-retry": ^2.0.6 - "@smithy/util-utf8": ^2.0.2 + "@aws-sdk/core": 3.495.0 + "@aws-sdk/credential-provider-node": 3.495.0 + "@aws-sdk/middleware-host-header": 3.495.0 + "@aws-sdk/middleware-logger": 3.495.0 + "@aws-sdk/middleware-recursion-detection": 3.495.0 + "@aws-sdk/middleware-user-agent": 3.495.0 + "@aws-sdk/region-config-resolver": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-endpoints": 3.495.0 + "@aws-sdk/util-user-agent-browser": 3.495.0 + "@aws-sdk/util-user-agent-node": 3.495.0 + "@smithy/config-resolver": ^2.1.0 + "@smithy/core": ^1.3.0 + "@smithy/fetch-http-handler": ^2.4.0 + "@smithy/hash-node": ^2.1.0 + "@smithy/invalid-dependency": ^2.1.0 + "@smithy/middleware-content-length": ^2.1.0 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/middleware-retry": ^2.1.0 + "@smithy/middleware-serde": ^2.1.0 + "@smithy/middleware-stack": ^2.1.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/node-http-handler": ^2.3.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/url-parser": ^2.1.0 + "@smithy/util-base64": ^2.1.0 + "@smithy/util-body-length-browser": ^2.1.0 + "@smithy/util-body-length-node": ^2.2.0 + "@smithy/util-defaults-mode-browser": ^2.1.0 + "@smithy/util-defaults-mode-node": ^2.1.0 + "@smithy/util-endpoints": ^1.1.0 + "@smithy/util-middleware": ^2.1.0 + "@smithy/util-retry": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 fast-xml-parser: 4.2.5 tslib: ^2.5.0 - checksum: 79c9fec0b4e682ef0258d5da75c18bbbdf278ebabfc2a2c80e1d5a8e13bb94aebf28a2d6e58940bb1b17ef9a8025a9e0c39ef7f6f52e723893f8fbf5d3fb61f0 + checksum: 33c5ef3fc87a2fb8cb5dc6bc855c5756712110d1c0be713543ffd657fcae4062e10ce9a1501bb9bc7a9f821a542f6e52c3bd9d88add89af67a116f3f5ab486fd languageName: node linkType: hard -"@aws-sdk/core@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/core@npm:3.465.0" +"@aws-sdk/core@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/core@npm:3.495.0" dependencies: - "@smithy/smithy-client": ^2.1.15 + "@smithy/core": ^1.3.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/signature-v4": ^2.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 25aed5f8a15830a845a332e952cc55a92a52162af598a9dc2c6c6a92f711a32ab26826cabddedb6e41f597a1cbdcc68b896054a8e1396bacc31e985fe50188d4 + checksum: 2038b283ab62a0a10880a7193cef8b3673298ff9b7ba3005e3a47df43c588d3a3a9dfdbe607b99183932675a74ec17a88a90f9a5c5f5896292a9e6cbc888cf13 languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.465.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.495.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": ^2.0.0 - "@smithy/types": ^2.5.0 + "@aws-sdk/client-cognito-identity": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: ad8400bdd6e92b7e40f12cd640f16c7289d4e7aee7a30c9389971baba793f10bd6d83cfbc676197fb1515d94d5e2a816aaede84492eb439c9833e5e51b1e475a + checksum: 8bd8841d5d2e5316c271f6e5585216f906d60a42b221d5afdd52d49b6318faa6776cdc956704a22b675c5dd41fd164a2cf512f069a99738660eeea24c3316234 languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.465.0" +"@aws-sdk/credential-provider-env@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": ^2.0.0 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 89f5f9b8edd1251f60e1aa32819480cc14e0b77c24249d070b653f21d788885c0fdbc4a69dd1ed9c526b31ee12869eda8979d2431b914af2bf664ef3940e58df + checksum: 5454a770638e2122877679897acb422871e0381c7e8a2a848c1837f16115bea7d3abaf56e2282b9986885de186538868f90c62292348251bbbd84c872c4a5eb0 languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.465.0" +"@aws-sdk/credential-provider-http@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/fetch-http-handler": ^2.2.6 - "@smithy/node-http-handler": ^2.1.9 - "@smithy/property-provider": ^2.0.0 - "@smithy/protocol-http": ^3.0.9 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 - "@smithy/util-stream": ^2.0.20 + "@aws-sdk/types": 3.495.0 + "@smithy/fetch-http-handler": ^2.4.0 + "@smithy/node-http-handler": ^2.3.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/util-stream": ^2.1.0 tslib: ^2.5.0 - checksum: cbad41fb117b73136923d213d90cbe2753f984e96c1f2acc7504c4eb72e8f1e00db945f2f57989eed5e18d03857695ba40f3b71e3678e72ac48630d98fdf207f + checksum: 367563058b01bc681523de85f4753bb53c53b0975c9258d6b4583222a28543ca2b2e3b5f75c1f1f6fb25a25baeb053d8d46c86b6997c4243bfc062a03093bae8 languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.465.0" +"@aws-sdk/credential-provider-ini@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.495.0" dependencies: - "@aws-sdk/credential-provider-env": 3.465.0 - "@aws-sdk/credential-provider-process": 3.465.0 - "@aws-sdk/credential-provider-sso": 3.465.0 - "@aws-sdk/credential-provider-web-identity": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/credential-provider-imds": ^2.0.0 - "@smithy/property-provider": ^2.0.0 - "@smithy/shared-ini-file-loader": ^2.0.6 - "@smithy/types": ^2.5.0 + "@aws-sdk/credential-provider-env": 3.495.0 + "@aws-sdk/credential-provider-process": 3.495.0 + "@aws-sdk/credential-provider-sso": 3.495.0 + "@aws-sdk/credential-provider-web-identity": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@smithy/credential-provider-imds": ^2.2.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/shared-ini-file-loader": ^2.3.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 6640707dd4a86b0e860e77a4560922f8c7689d25892b18246276b65aab3350547bf489a4f41a8377cde408f5d906259adebc3bf7cd77e74cec3d4ce7b3daa78a + checksum: fcd401dcc8a71a601888a9abd5e915ae8bdf19501ed0f497478d8844a7e11769314488b2b3a1995c33a954ab499ab118911decdfaf8151e47c4768d6e090a429 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.465.0, @aws-sdk/credential-provider-node@npm:^3.350.0": - version: 3.465.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.465.0" +"@aws-sdk/credential-provider-node@npm:3.495.0, @aws-sdk/credential-provider-node@npm:^3.350.0": + version: 3.495.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.495.0" dependencies: - "@aws-sdk/credential-provider-env": 3.465.0 - "@aws-sdk/credential-provider-ini": 3.465.0 - "@aws-sdk/credential-provider-process": 3.465.0 - "@aws-sdk/credential-provider-sso": 3.465.0 - "@aws-sdk/credential-provider-web-identity": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/credential-provider-imds": ^2.0.0 - "@smithy/property-provider": ^2.0.0 - "@smithy/shared-ini-file-loader": ^2.0.6 - "@smithy/types": ^2.5.0 + "@aws-sdk/credential-provider-env": 3.495.0 + "@aws-sdk/credential-provider-ini": 3.495.0 + "@aws-sdk/credential-provider-process": 3.495.0 + "@aws-sdk/credential-provider-sso": 3.495.0 + "@aws-sdk/credential-provider-web-identity": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@smithy/credential-provider-imds": ^2.2.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/shared-ini-file-loader": ^2.3.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 9c8d444d95f67e64463679f0f6a87d3bb42cdbc4abd44abdb11e8da4c1f7e620a7dba424d26b97cf86965e790fd9933f984df7ad651b10524136511971cd5ab4 + checksum: c661de3423fb106d1f3347e24287d0fd9208e02a2fe4159300ec7c1df90196f09df25aab06428f64d3cfcae2a28482737d8cd9ad6d8adca0aa0cfa810276b0ac languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.465.0" +"@aws-sdk/credential-provider-process@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": ^2.0.0 - "@smithy/shared-ini-file-loader": ^2.0.6 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/shared-ini-file-loader": ^2.3.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: e48cb385eccd44ddbf6a32b8fb26113025cd474ee28942953b1777a2d02b4bdc905da5d69aee9cf3712cdb888e652b86a7d9853f14caf7436ce59e6657c02140 + checksum: e19812756fb578cf5e7845db1fc2df77fadb427efaefe7ce23effa20f5f7e1661cea05179ab425e3cbef08966b1821a4ccfbd00343f68f65b0564c0b06510b9a languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.465.0" +"@aws-sdk/credential-provider-sso@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.495.0" dependencies: - "@aws-sdk/client-sso": 3.465.0 - "@aws-sdk/token-providers": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": ^2.0.0 - "@smithy/shared-ini-file-loader": ^2.0.6 - "@smithy/types": ^2.5.0 + "@aws-sdk/client-sso": 3.495.0 + "@aws-sdk/token-providers": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/shared-ini-file-loader": ^2.3.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 40764632b5b117bd9f8263b6dced2a6231093f4e5e26b6cc6730e16e6c92b478563d78dbc49a5fde80e1d588439c3218c89acf1821030dc8979211e164502892 + checksum: 2f96aba1921612026e8dcd7d7f58988c63efdf270a8688adb0704f2e442778700d7160c890cf926a89eb79a2471ee9084329bd8463998bbb416b0f5ebfe8f7e3 languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.465.0" +"@aws-sdk/credential-provider-web-identity@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": ^2.0.0 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 2bdd92ed25b310d88fbbf42fa26e58070d910dd25bd569b4a3bc7d328f3dff421beb1a775f21c1a1696f439f561ccf7dd595a42829a3b88d432683b3f4a8c58e + checksum: d22fda65683d0558dd03e710c8ef4762c4c500d8527cf951b3597a716a56ffbd1d9bf22089e4714325f4043a5e9eb9f6b27e2e3f217eef06de3cc3364e5a8a0f languageName: node linkType: hard "@aws-sdk/credential-providers@npm:^3.350.0": - version: 3.465.0 - resolution: "@aws-sdk/credential-providers@npm:3.465.0" + version: 3.495.0 + resolution: "@aws-sdk/credential-providers@npm:3.495.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.465.0 - "@aws-sdk/client-sso": 3.465.0 - "@aws-sdk/client-sts": 3.465.0 - "@aws-sdk/credential-provider-cognito-identity": 3.465.0 - "@aws-sdk/credential-provider-env": 3.465.0 - "@aws-sdk/credential-provider-http": 3.465.0 - "@aws-sdk/credential-provider-ini": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/credential-provider-process": 3.465.0 - "@aws-sdk/credential-provider-sso": 3.465.0 - "@aws-sdk/credential-provider-web-identity": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/credential-provider-imds": ^2.0.0 - "@smithy/property-provider": ^2.0.0 - "@smithy/types": ^2.5.0 + "@aws-sdk/client-cognito-identity": 3.495.0 + "@aws-sdk/client-sso": 3.495.0 + "@aws-sdk/client-sts": 3.495.0 + "@aws-sdk/credential-provider-cognito-identity": 3.495.0 + "@aws-sdk/credential-provider-env": 3.495.0 + "@aws-sdk/credential-provider-http": 3.495.0 + "@aws-sdk/credential-provider-ini": 3.495.0 + "@aws-sdk/credential-provider-node": 3.495.0 + "@aws-sdk/credential-provider-process": 3.495.0 + "@aws-sdk/credential-provider-sso": 3.495.0 + "@aws-sdk/credential-provider-web-identity": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@smithy/credential-provider-imds": ^2.2.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: ff594821d82227c2cf9884283f003d72c322f78d0aeace12fb47f5b0fa7fbb3cce7d6b96822df848a89649eeea6bc9dda18de40e5a5399a8c5f6930fe906d3e3 + checksum: 1cb201bc9fe2f2f5edd277416962e32e6f99ecc98b5d386bfcac91d6db1719d66b57b1e690d660a6fe1ac198648d5df906397ac5e2d9d5a35d345bcc3230324a languageName: node linkType: hard @@ -887,34 +897,34 @@ __metadata: linkType: hard "@aws-sdk/lib-storage@npm:^3.350.0": - version: 3.465.0 - resolution: "@aws-sdk/lib-storage@npm:3.465.0" + version: 3.495.0 + resolution: "@aws-sdk/lib-storage@npm:3.495.0" dependencies: - "@smithy/abort-controller": ^2.0.1 - "@smithy/middleware-endpoint": ^2.2.0 - "@smithy/smithy-client": ^2.1.15 + "@smithy/abort-controller": ^2.1.0 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/smithy-client": ^2.3.0 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 tslib: ^2.5.0 peerDependencies: "@aws-sdk/client-s3": ^3.0.0 - checksum: fe351e545dbc28d20d936ae6e3ea1c5faf672bdc402d3e15a3709fc8175060b8925647b381b0a3ad0eac1d25b73e16c5580ad1e32764a011a1ca77432662f682 + checksum: 6d7a1576f30ff2432f0907a8357604de5a6d338c706e34c8e85ef6fbb4e2a878c84ce41978c79844757454b0e90914c83b4c983a428a7ea0ba67b6ce7d15c9a8 languageName: node linkType: hard -"@aws-sdk/middleware-bucket-endpoint@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.465.0" +"@aws-sdk/middleware-bucket-endpoint@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-arn-parser": 3.465.0 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/protocol-http": ^3.0.9 - "@smithy/types": ^2.5.0 - "@smithy/util-config-provider": ^2.0.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-arn-parser": 3.495.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/types": ^2.9.0 + "@smithy/util-config-provider": ^2.2.0 tslib: ^2.5.0 - checksum: 381375b8eb4e37e14612c7a5c9e027163cd116747a766e2c2fc0cf5a5349f0e3fd5f8b871657c0c38596c8a0c28c1093fcebcbeb99c142d7d17a3f2f88690650 + checksum: d75288d8d290b0749a9f17bf893dfb2d334a08707dbda2d24d187f53096c58f190e102a789310045b03792fe6d145a23af7dbac07994b27473f386328cc2bb5c languageName: node linkType: hard @@ -931,119 +941,107 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-expect-continue@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.465.0" +"@aws-sdk/middleware-expect-continue@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/protocol-http": ^3.0.9 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 88ca4283f94057978dabc463083dafddd2b01d368cc0fb9fb6d15d21dbbf828fd615e6fc649a47bac2919d2e226376d233604f91bf942421452ea34827e0a652 + checksum: d9e49bd36994cc5a0114d51fb050efecf5f9ae46bd5718b5acb98d486a864d33ced0d1a0afc96f22192a23f4a9acf8c784db3d97243b25452c55fd4e3491aec8 languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.465.0" +"@aws-sdk/middleware-flexible-checksums@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.495.0" dependencies: "@aws-crypto/crc32": 3.0.0 "@aws-crypto/crc32c": 3.0.0 - "@aws-sdk/types": 3.465.0 - "@smithy/is-array-buffer": ^2.0.0 - "@smithy/protocol-http": ^3.0.9 - "@smithy/types": ^2.5.0 - "@smithy/util-utf8": ^2.0.2 + "@aws-sdk/types": 3.495.0 + "@smithy/is-array-buffer": ^2.1.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/types": ^2.9.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: e003b96421e1251eb629231a6afebd99b5795c219562496c4f1d23165233a073fffc754e18819f874a600a518ada4c2647a4c9fbd88b2bf2ce39f68501d04a0f + checksum: 5ec9e6543222349ee4cc1560ebd0ec3fc076e62bb6a6f2fcfb55cb2b7b6d7f944dd3801869bc3a0367975bf7efbc587c1acb19fc9de07faf389aa966e8eeb15f languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.465.0" +"@aws-sdk/middleware-host-header@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/protocol-http": ^3.0.9 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: fe7fba3fdd12d3d7bee052583a353cd5afb64e652a44c89af0c416d7994110dfcf7e03df3380ce06724305a10774661a72d09369f655f6c4b7d1d9ead28a957a + checksum: 4b4f64827f2f75df045229987625560c1ee35a30e48044f3b60292dbb0599760459097a79e805e2982e1a1150def39758aaf5637e8696b8d21101c03988499ff languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.465.0" +"@aws-sdk/middleware-location-constraint@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 341e9adc1eb255b5033d23b3797e6093ae1955ea2df912f7de69bf35632d8e1197d73166900d16e8224bc7ecdc800ba5649b38fec8e101efbe8ed0d27b344ec6 + checksum: 8315ea52cff810e8c19176e24528bee4a29af7f2631b1508e04a8936396dd020535e507300df9e5d8b98d4b8c1c5fd78b9e868f0500b7a66e0743394fd2313a5 languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-logger@npm:3.465.0" +"@aws-sdk/middleware-logger@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-logger@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: dd28c204cc9986780f25090ce9d91115b5784cc31c5677018f7f289c90476a631a044702da70c576d3263a5f16f99aa41851fc28948e115eaf64fc0986a18a7f + checksum: d36ee788bdcfc19bd73525c7b0dc476e63b26f4a798a43626fdc76776c0b46f905867bd86c8792aaa7736cbfb18b1fe36c22ef86af4cd8dacdc10e34feee0caf languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.465.0" +"@aws-sdk/middleware-recursion-detection@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/protocol-http": ^3.0.9 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 3b718e0e300fa115198702645d177916d059612c76b17ea81c6d722b3c8312606b50aa765a990711f44c899724bc82c8ebd45a2a5ddaee788cb28ef3449f726b + checksum: eaa7921de46d6d2389b56eb36417a32bd1af41c4ed24f6e2956fa4fd1bb14141253368d96882402df4f6498eaee081c67c170ce74f042d74b0ec431cd1219df7 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.465.0" +"@aws-sdk/middleware-sdk-s3@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-arn-parser": 3.465.0 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/protocol-http": ^3.0.9 - "@smithy/signature-v4": ^2.0.0 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 - "@smithy/util-config-provider": ^2.0.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-arn-parser": 3.495.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/signature-v4": ^2.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/util-config-provider": ^2.2.0 tslib: ^2.5.0 - checksum: 61117fa5da796ac89926df1caf3709ad8405810b20b089e7c122f069f3440556923d939da1fd24765cadc8ccde5670d1339dc84ed4e82908c7755ff2d73406cd + checksum: b3c6e8fda75ca696a1ba8b2327c1cf3ec941d19af5927614949f4ba317934db2733c22fa011f614651a093a3374d7be1fa5c3f834517a48a6884060ff6cfd625 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sqs@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.465.0" +"@aws-sdk/middleware-sdk-sqs@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/types": ^2.5.0 - "@smithy/util-hex-encoding": ^2.0.0 - "@smithy/util-utf8": ^2.0.2 + "@aws-sdk/types": 3.495.0 + "@smithy/types": ^2.9.0 + "@smithy/util-hex-encoding": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: b760657584c0362c603f38ea4df4744b42d40734c6433232fe5ec590f501cac7be705da8a2afa6c5cce0e4cb73b8bbffbc7066d7b9d28dd042055f478a8f0490 - languageName: node - linkType: hard - -"@aws-sdk/middleware-sdk-sts@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-sdk-sts@npm:3.465.0" - dependencies: - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/types": ^2.5.0 - tslib: ^2.5.0 - checksum: cddb425eacd40dddf490d2af0f8b9e6032cd0cc7da0138f25876aa3d57ab48148cc105db16f411aaf1857c22c3841e8e904a781c383f3b6f8b541282575ffd48 + checksum: 78c2b4a59fe5fe6797b5a31c486b7169aba57c4c070db1e691c1049d03a6952a406cd88d0d612bbb252a8d06855437022f505934f137e8244db93d33572545ea languageName: node linkType: hard @@ -1057,42 +1055,42 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-signing@npm:3.465.0" +"@aws-sdk/middleware-signing@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-signing@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": ^2.0.0 - "@smithy/protocol-http": ^3.0.9 - "@smithy/signature-v4": ^2.0.0 - "@smithy/types": ^2.5.0 - "@smithy/util-middleware": ^2.0.6 + "@aws-sdk/types": 3.495.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/signature-v4": ^2.1.0 + "@smithy/types": ^2.9.0 + "@smithy/util-middleware": ^2.1.0 tslib: ^2.5.0 - checksum: de9aa66c61d3f499c4f0cca7bee5359777d8357c3aaccf51a9062eda923b82f2d5b13808462c2a2f9120231e3c1a66ae4e35636f08da8ec3521ace1d970ff67a + checksum: ca717e5c2bc03157f4ee6f3c05d8c815ecf7bab83f5f86c8751a3106d4f5459630258d945d8840650bfb367b881ff3be1fc0c9037162f717380c2a76dec938db languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.465.0" +"@aws-sdk/middleware-ssec@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-ssec@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: c04dd79af338bbbb6f439e123adc961698a5a71d5ab66deab8ef3fe08dc63c7d24d92646b32cc7c6eb684e101dfb0fd590618124567470b40a389f63fa90f7b3 + checksum: 5f92ae6ac0b7a869203650c343eb0f42375b8784b20abed88f2075db4413935469c988c5daee6b520aea63a2208ca412a9a78c6fbb0b14fc7719c9dbc9ffdc65 languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.465.0" +"@aws-sdk/middleware-user-agent@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@smithy/protocol-http": ^3.0.9 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-endpoints": 3.495.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: e00a86370f0d3e4f63d2ca7153dcbfa12b8d492141434dd5cdfd3ec402bbed4d5c80661d2aec50f251979c6091c15752a16431058a928788f1200757605271bd + checksum: a36dcd5252b001786a8d970143855e80242fa1d88252693a8c2a244114fcfae02eb4ae958a37efa92aeff5cc792506f9199961c346fd943949141a3e078c3123 languageName: node linkType: hard @@ -1140,30 +1138,31 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/region-config-resolver@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.465.0" +"@aws-sdk/region-config-resolver@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.495.0" dependencies: - "@smithy/node-config-provider": ^2.1.5 - "@smithy/types": ^2.5.0 - "@smithy/util-config-provider": ^2.0.0 - "@smithy/util-middleware": ^2.0.6 + "@aws-sdk/types": 3.495.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/types": ^2.9.0 + "@smithy/util-config-provider": ^2.2.0 + "@smithy/util-middleware": ^2.1.0 tslib: ^2.5.0 - checksum: 3af46df3f8a36a7280ff488f03e59c16801287bc56607186e1e7af1818adfb1610524d7873648ac31378277c64b44d549205232e495f544d5ca1ea34dda0f745 + checksum: f0f723dbd46761246dd771d975cb60c60afcbb10a94138183b7b00cad633ce92fdd7f2ee9ae60fcfc369d4aadd653d56562f5a14652dc8974816fbaf2c924182 languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.465.0" +"@aws-sdk/signature-v4-multi-region@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.495.0" dependencies: - "@aws-sdk/middleware-sdk-s3": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/protocol-http": ^3.0.9 - "@smithy/signature-v4": ^2.0.0 - "@smithy/types": ^2.5.0 + "@aws-sdk/middleware-sdk-s3": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/signature-v4": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: d40dbc77b963357afa3536cd461bfb1dd1d7ad734d33185a9d82b6a6104f517ec7283e48a9855ec75d90235fc7fdd06d66992c5a792d9f36e5ac717155069271 + checksum: 93559456f5d4cae2fde06f49c41275d411bc9c4625cb73b6fc88f165c960d7a9a5e1432ae95ad6243430e6c0d07b6710e94aaf0ca39c7514e7c9f0240a466507 languageName: node linkType: hard @@ -1183,48 +1182,48 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/token-providers@npm:3.465.0" +"@aws-sdk/token-providers@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/token-providers@npm:3.495.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": ^2.0.18 - "@smithy/fetch-http-handler": ^2.2.6 - "@smithy/hash-node": ^2.0.15 - "@smithy/invalid-dependency": ^2.0.13 - "@smithy/middleware-content-length": ^2.0.15 - "@smithy/middleware-endpoint": ^2.2.0 - "@smithy/middleware-retry": ^2.0.20 - "@smithy/middleware-serde": ^2.0.13 - "@smithy/middleware-stack": ^2.0.7 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/node-http-handler": ^2.1.9 - "@smithy/property-provider": ^2.0.0 - "@smithy/protocol-http": ^3.0.9 - "@smithy/shared-ini-file-loader": ^2.0.6 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 - "@smithy/url-parser": ^2.0.13 - "@smithy/util-base64": ^2.0.1 - "@smithy/util-body-length-browser": ^2.0.0 - "@smithy/util-body-length-node": ^2.1.0 - "@smithy/util-defaults-mode-browser": ^2.0.19 - "@smithy/util-defaults-mode-node": ^2.0.25 - "@smithy/util-endpoints": ^1.0.4 - "@smithy/util-retry": ^2.0.6 - "@smithy/util-utf8": ^2.0.2 + "@aws-sdk/middleware-host-header": 3.495.0 + "@aws-sdk/middleware-logger": 3.495.0 + "@aws-sdk/middleware-recursion-detection": 3.495.0 + "@aws-sdk/middleware-user-agent": 3.495.0 + "@aws-sdk/region-config-resolver": 3.495.0 + "@aws-sdk/types": 3.495.0 + "@aws-sdk/util-endpoints": 3.495.0 + "@aws-sdk/util-user-agent-browser": 3.495.0 + "@aws-sdk/util-user-agent-node": 3.495.0 + "@smithy/config-resolver": ^2.1.0 + "@smithy/fetch-http-handler": ^2.4.0 + "@smithy/hash-node": ^2.1.0 + "@smithy/invalid-dependency": ^2.1.0 + "@smithy/middleware-content-length": ^2.1.0 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/middleware-retry": ^2.1.0 + "@smithy/middleware-serde": ^2.1.0 + "@smithy/middleware-stack": ^2.1.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/node-http-handler": ^2.3.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/shared-ini-file-loader": ^2.3.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/url-parser": ^2.1.0 + "@smithy/util-base64": ^2.1.0 + "@smithy/util-body-length-browser": ^2.1.0 + "@smithy/util-body-length-node": ^2.2.0 + "@smithy/util-defaults-mode-browser": ^2.1.0 + "@smithy/util-defaults-mode-node": ^2.1.0 + "@smithy/util-endpoints": ^1.1.0 + "@smithy/util-retry": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: ebfeb68e09294775b345f4fbd76be546283a5a10cb388fdf25c38d0f229c29616dbe0c708d0fcf196a74a52e3df0a55e77cada158cbcb6ace44a86f9606ce1eb + checksum: 76b8dacaf9d0d9c608866d10bb8d0d42070e88872688f9dae3cd2cce2cd573bb6937ffd4e4ef3ca94763ac4f549faaf6f7d1e1bea714d7ec37b5a7ca533f5599 languageName: node linkType: hard @@ -1238,13 +1237,13 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/types@npm:3.465.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.347.0": - version: 3.465.0 - resolution: "@aws-sdk/types@npm:3.465.0" +"@aws-sdk/types@npm:3.495.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.347.0": + version: 3.495.0 + resolution: "@aws-sdk/types@npm:3.495.0" dependencies: - "@smithy/types": ^2.5.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 73f05accd990f70a0eb58c5c568ed091a097caab808415efb420deee0873e912469fe2e0a68e1d0087cd376237cc4a7e3182a475670cd295676735d90f132ca6 + checksum: 786d7d860cd8c22a631d48e5a2a0570b941f43927d3bee1da36d4749f71fbdc2e7908f15f73582d0572c74f9f0e6b411a33f94facf27aec93d9f2920b9a662f4 languageName: node linkType: hard @@ -1259,12 +1258,12 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-arn-parser@npm:3.465.0, @aws-sdk/util-arn-parser@npm:^3.310.0": - version: 3.465.0 - resolution: "@aws-sdk/util-arn-parser@npm:3.465.0" +"@aws-sdk/util-arn-parser@npm:3.495.0, @aws-sdk/util-arn-parser@npm:^3.310.0": + version: 3.495.0 + resolution: "@aws-sdk/util-arn-parser@npm:3.495.0" dependencies: tslib: ^2.5.0 - checksum: ce2dd638e9b8ef3260ce1c1ae299a4e44cbaa28a07cda9f1033b763cea8b1d901b7a963338e8a172af17074d06811f09605f3f903318c4bd2bbf102e92d02546 + checksum: 130f1b1c0d2b9917782049693aa4ab6aec98858d6e2b46c14a3a6c4979e65073f731aec96aa0e1c04e927d0b32ad2d4a6a701e2a6d5d416c6ea35e670e4eb987 languageName: node linkType: hard @@ -1278,14 +1277,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/util-endpoints@npm:3.465.0" +"@aws-sdk/util-endpoints@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/util-endpoints@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/util-endpoints": ^1.0.4 + "@aws-sdk/types": 3.495.0 + "@smithy/types": ^2.9.0 + "@smithy/util-endpoints": ^1.1.0 tslib: ^2.5.0 - checksum: 38b0a5335f67c63dcc3562b1b34161249ff5638da4ebdc295f561d64448d84215fb4b46825ee6ebcfa7010449e1725c3705230529a74510e40f2a0e37881a0f1 + checksum: a479feeea6b136c9a07f885373e859a37f19b4d55cf6f9ecd89017c13349f55d239aa5a083465b1d945ff6bf13809efd27133340bdecaef875e72bd60d534c76 languageName: node linkType: hard @@ -1337,32 +1337,32 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.465.0" +"@aws-sdk/util-user-agent-browser@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/types": ^2.9.0 bowser: ^2.11.0 tslib: ^2.5.0 - checksum: 46c280a8284ddc34096eff401a9372f0fc84c1805c8dc1489ad4e6a44b4fac0b5c58bc200a00c873ce5928bf2bbc11fe4ab465b8cb606ddf64ca2cb76be205c4 + checksum: 47071d5d514e08ef2818e42b437798238df771bff320256eef4589a24dae3f84ac064897c941919e1b571aaf95345282a7e8e43729f787526b70e80dfba8dead languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.465.0" +"@aws-sdk/util-user-agent-node@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.495.0" dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/types": ^2.5.0 + "@aws-sdk/types": 3.495.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: 197203f9345aefedda3109bc523c218382de2138f9fd2ef284ddc8f6d73819a5688503706098fb86562d3efd8dde3dc769f9fd59feba284fa890b3152111a1de + checksum: e4c188c91b78b33d8da77984f3513a61ece3454d02d16605ec985b8481d309d12ad7544d2233d1396aaffd0758b4d0d1c4c143b9edd68d66e2681a4fd32eac34 languageName: node linkType: hard @@ -1385,12 +1385,13 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.465.0": - version: 3.465.0 - resolution: "@aws-sdk/xml-builder@npm:3.465.0" +"@aws-sdk/xml-builder@npm:3.495.0": + version: 3.495.0 + resolution: "@aws-sdk/xml-builder@npm:3.495.0" dependencies: + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 33c370b216aece520352bc36dc147649bee0bca7139a5d5c6e49e99756e9ca369c73bacc55dff5920f6003d06a29a1375920e18b9776c264de925c5a9cfc3deb + checksum: f2c695268c887e1f0e39991867ceca861f3242a0c12689ccfe582bce4f3543cf241a7ea4873a4a1c8b3637a5592a29c8f9266040f375a3eaaa9aebce6d697ecd languageName: node linkType: hard @@ -3109,22 +3110,22 @@ __metadata: languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.20.7, @babel/runtime-corejs3@npm:^7.22.15, @babel/runtime-corejs3@npm:^7.23.5": - version: 7.23.6 - resolution: "@babel/runtime-corejs3@npm:7.23.6" +"@babel/runtime-corejs3@npm:^7.20.7, @babel/runtime-corejs3@npm:^7.22.15, @babel/runtime-corejs3@npm:^7.23.7": + version: 7.23.8 + resolution: "@babel/runtime-corejs3@npm:7.23.8" dependencies: core-js-pure: ^3.30.2 regenerator-runtime: ^0.14.0 - checksum: 92576ea17ff674025aa3cd208bfb8301e4bde432cfa404b56f94242948cbd40125c1a4c9c54a99134e08ded8bcde305633a22b1f4c676687c3b868557d23b762 + checksum: e786b79bcb3031bd7433fb4523e43f0acbd386cd7bb5b0a6df6e627c7965706b3d5612211ea3d729ce4459ba1d1b654ccdd8aefe791c6413f70882ee1be903b9 languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.6, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.23.6 - resolution: "@babel/runtime@npm:7.23.6" +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.8, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": + version: 7.23.8 + resolution: "@babel/runtime@npm:7.23.8" dependencies: regenerator-runtime: ^0.14.0 - checksum: 1a8eaf3d3a103ef5227b60ca7ab5c589118c36ca65ef2d64e65380b32a98a3f3b5b3ef96660fa0471b079a18b619a8317f3e7f03ab2b930c45282a8b69ed9a16 + checksum: 0bd5543c26811153822a9f382fd39886f66825ff2a397a19008011376533747cd05c33a91f6248c0b8b0edf0448d7c167ebfba34786088f1b7eb11c65be7dfc3 languageName: node linkType: hard @@ -3344,6 +3345,40 @@ __metadata: languageName: unknown linkType: soft +"@backstage/backend-dynamic-feature-service@workspace:packages/backend-dynamic-feature-service": + version: 0.0.0-use.local + resolution: "@backstage/backend-dynamic-feature-service@workspace:packages/backend-dynamic-feature-service" + dependencies: + "@backstage/backend-app-api": "workspace:^" + "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-tasks": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/cli-common": "workspace:^" + "@backstage/cli-node": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/config-loader": "workspace:^" + "@backstage/errors": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" + "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-events-backend": "workspace:^" + "@backstage/plugin-events-node": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-permission-node": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" + "@backstage/plugin-search-backend-node": "workspace:^" + "@backstage/plugin-search-common": "workspace:^" + "@backstage/types": "workspace:^" + "@types/express": ^4.17.6 + chokidar: ^3.5.3 + express: ^4.17.1 + lodash: ^4.17.21 + wait-for-expect: ^3.0.2 + winston: ^3.2.1 + languageName: unknown + linkType: soft + "@backstage/backend-openapi-utils@workspace:^, @backstage/backend-openapi-utils@workspace:packages/backend-openapi-utils": version: 0.0.0-use.local resolution: "@backstage/backend-openapi-utils@workspace:packages/backend-openapi-utils" @@ -3380,40 +3415,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/backend-plugin-manager@workspace:packages/backend-plugin-manager": - version: 0.0.0-use.local - resolution: "@backstage/backend-plugin-manager@workspace:packages/backend-plugin-manager" - dependencies: - "@backstage/backend-app-api": "workspace:^" - "@backstage/backend-common": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-tasks": "workspace:^" - "@backstage/backend-test-utils": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/cli-common": "workspace:^" - "@backstage/cli-node": "workspace:^" - "@backstage/config": "workspace:^" - "@backstage/config-loader": "workspace:^" - "@backstage/errors": "workspace:^" - "@backstage/plugin-auth-node": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" - "@backstage/plugin-events-backend": "workspace:^" - "@backstage/plugin-events-node": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - "@backstage/plugin-permission-node": "workspace:^" - "@backstage/plugin-scaffolder-node": "workspace:^" - "@backstage/plugin-search-backend-node": "workspace:^" - "@backstage/plugin-search-common": "workspace:^" - "@backstage/types": "workspace:^" - "@types/express": ^4.17.6 - chokidar: ^3.5.3 - express: ^4.17.1 - lodash: ^4.17.21 - wait-for-expect: ^3.0.2 - winston: ^3.2.1 - languageName: unknown - linkType: soft - "@backstage/backend-tasks@workspace:^, @backstage/backend-tasks@workspace:packages/backend-tasks": version: 0.0.0-use.local resolution: "@backstage/backend-tasks@workspace:packages/backend-tasks" @@ -3467,18 +3468,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-client@npm:^1.5.0": - version: 1.5.1 - resolution: "@backstage/catalog-client@npm:1.5.1" - dependencies: - "@backstage/catalog-model": ^1.4.3 - "@backstage/errors": ^1.2.3 - cross-fetch: ^4.0.0 - uri-template: ^2.0.0 - checksum: 786fa1bafba3d44d88855d8479879577e33816f1f9d2e110b275fc22ca4348f8dce0ebe789d580786a38e9986989c98172f7a07c1e2145b8da689608a2aa4ec2 - languageName: node - linkType: hard - "@backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client": version: 0.0.0-use.local resolution: "@backstage/catalog-client@workspace:packages/catalog-client" @@ -3680,7 +3669,7 @@ __metadata: "@vitejs/plugin-react": ^4.0.4 vite: ^4.4.9 vite-plugin-html: ^3.2.0 - vite-plugin-node-polyfills: ^0.17.0 + vite-plugin-node-polyfills: ^0.19.0 peerDependenciesMeta: "@vitejs/plugin-react": optional: true @@ -3741,7 +3730,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/config@^1.0.6, @backstage/config@^1.0.7, @backstage/config@^1.1.1, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": +"@backstage/config@^1.0.6, @backstage/config@^1.0.7, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": version: 0.0.0-use.local resolution: "@backstage/config@workspace:packages/config" dependencies: @@ -3814,113 +3803,11 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@npm:^0.12.3": - version: 0.12.5 - resolution: "@backstage/core-components@npm:0.12.5" - dependencies: - "@backstage/config": ^1.0.7 - "@backstage/core-plugin-api": ^1.5.0 - "@backstage/errors": ^1.1.5 - "@backstage/theme": ^0.2.18 - "@backstage/version-bridge": ^1.0.3 - "@material-table/core": ^3.1.0 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 - "@react-hookz/web": ^20.0.0 - "@types/react-sparklines": ^1.7.0 - "@types/react-text-truncate": ^0.14.0 - ansi-regex: ^6.0.1 - classnames: ^2.2.6 - d3-selection: ^3.0.0 - d3-shape: ^3.0.0 - d3-zoom: ^3.0.0 - dagre: ^0.8.5 - history: ^5.0.0 - immer: ^9.0.1 - lodash: ^4.17.21 - pluralize: ^8.0.0 - prop-types: ^15.7.2 - qs: ^6.9.4 - rc-progress: 3.4.1 - react-helmet: 6.1.0 - react-hook-form: ^7.12.2 - react-markdown: ^8.0.0 - react-sparklines: ^1.7.0 - react-syntax-highlighter: ^15.4.5 - react-text-truncate: ^0.19.0 - react-use: ^17.3.2 - react-virtualized-auto-sizer: ^1.0.6 - react-window: ^1.8.6 - remark-gfm: ^3.0.1 - zen-observable: ^0.10.0 - zod: ~3.18.0 - peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 8308c1b90247911f6cf22963b530cef169287f508ff29d159d0c83758134dd43bd5acd2113350690a46a02246bc05dca975bcc38325000aefb1c93c80e2f19c7 - languageName: node - linkType: hard - -"@backstage/core-components@npm:^0.13.8, @backstage/core-components@npm:^0.13.9": - version: 0.13.9 - resolution: "@backstage/core-components@npm:0.13.9" - dependencies: - "@backstage/config": ^1.1.1 - "@backstage/core-plugin-api": ^1.8.1 - "@backstage/errors": ^1.2.3 - "@backstage/theme": ^0.5.0 - "@backstage/version-bridge": ^1.0.7 - "@date-io/core": ^1.3.13 - "@material-table/core": ^3.1.0 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@react-hookz/web": ^23.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - "@types/react-sparklines": ^1.7.0 - "@types/react-text-truncate": ^0.14.0 - ansi-regex: ^6.0.1 - classnames: ^2.2.6 - d3-selection: ^3.0.0 - d3-shape: ^3.0.0 - d3-zoom: ^3.0.0 - dagre: ^0.8.5 - history: ^5.0.0 - immer: ^9.0.1 - linkify-react: 4.1.3 - linkifyjs: 4.1.3 - lodash: ^4.17.21 - pluralize: ^8.0.0 - qs: ^6.9.4 - rc-progress: 3.5.1 - react-helmet: 6.1.0 - react-hook-form: ^7.12.2 - react-idle-timer: 5.6.2 - react-markdown: ^8.0.0 - react-sparklines: ^1.7.0 - react-syntax-highlighter: ^15.4.5 - react-text-truncate: ^0.19.0 - react-use: ^17.3.2 - react-virtualized-auto-sizer: ^1.0.11 - react-window: ^1.8.6 - remark-gfm: ^3.0.1 - zen-observable: ^0.10.0 - zod: ^3.22.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 6674d70f5043cf2a6bca0097ce5fa2d1cb6594a4870c3c64e357ac9cc54b85e33502e9257918c9eebb3e87249d798ee9e223eacc5b02014b4196bd0f9804c2ac - languageName: node - linkType: hard - -"@backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": +"@backstage/core-components@^0.13.8, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": version: 0.0.0-use.local resolution: "@backstage/core-components@workspace:packages/core-components" dependencies: + "@backstage/app-defaults": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/core-app-api": "workspace:^" @@ -3989,25 +3876,57 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@npm:^1.3.0, @backstage/core-plugin-api@npm:^1.5.0, @backstage/core-plugin-api@npm:^1.8.0, @backstage/core-plugin-api@npm:^1.8.1": - version: 1.8.1 - resolution: "@backstage/core-plugin-api@npm:1.8.1" +"@backstage/core-components@npm:^0.12.3": + version: 0.12.5 + resolution: "@backstage/core-components@npm:0.12.5" dependencies: - "@backstage/config": ^1.1.1 - "@backstage/types": ^1.1.1 - "@backstage/version-bridge": ^1.0.7 - "@types/react": ^16.13.1 || ^17.0.0 + "@backstage/config": ^1.0.7 + "@backstage/core-plugin-api": ^1.5.0 + "@backstage/errors": ^1.1.5 + "@backstage/theme": ^0.2.18 + "@backstage/version-bridge": ^1.0.3 + "@material-table/core": ^3.1.0 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": 4.0.0-alpha.57 + "@react-hookz/web": ^20.0.0 + "@types/react-sparklines": ^1.7.0 + "@types/react-text-truncate": ^0.14.0 + ansi-regex: ^6.0.1 + classnames: ^2.2.6 + d3-selection: ^3.0.0 + d3-shape: ^3.0.0 + d3-zoom: ^3.0.0 + dagre: ^0.8.5 history: ^5.0.0 - i18next: ^22.4.15 + immer: ^9.0.1 + lodash: ^4.17.21 + pluralize: ^8.0.0 + prop-types: ^15.7.2 + qs: ^6.9.4 + rc-progress: 3.4.1 + react-helmet: 6.1.0 + react-hook-form: ^7.12.2 + react-markdown: ^8.0.0 + react-sparklines: ^1.7.0 + react-syntax-highlighter: ^15.4.5 + react-text-truncate: ^0.19.0 + react-use: ^17.3.2 + react-virtualized-auto-sizer: ^1.0.6 + react-window: ^1.8.6 + remark-gfm: ^3.0.1 + zen-observable: ^0.10.0 + zod: ~3.18.0 peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 + react-dom: ^16.13.1 || ^17.0.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 8fa85beb719f65b2dc2ab69df7e7354d280ce63ca163ce820dec43ac7ffe95ce1c3ae1175774f034ea3787cb997e0bc630f42b644b166b7f9929f6166e7c2607 + checksum: 8308c1b90247911f6cf22963b530cef169287f508ff29d159d0c83758134dd43bd5acd2113350690a46a02246bc05dca975bcc38325000aefb1c93c80e2f19c7 languageName: node linkType: hard -"@backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@^1.5.0, @backstage/core-plugin-api@^1.8.0, @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: @@ -4103,7 +4022,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@^1.1.5, @backstage/errors@^1.2.3, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": +"@backstage/errors@^1.1.5, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" dependencies: @@ -4151,27 +4070,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/frontend-plugin-api@npm:^0.4.0": - version: 0.4.0 - resolution: "@backstage/frontend-plugin-api@npm:0.4.0" - dependencies: - "@backstage/config": ^1.1.1 - "@backstage/core-components": ^0.13.9 - "@backstage/core-plugin-api": ^1.8.1 - "@backstage/types": ^1.1.1 - "@backstage/version-bridge": ^1.0.7 - "@material-ui/core": ^4.12.4 - "@types/react": ^16.13.1 || ^17.0.0 - lodash: ^4.17.21 - zod: ^3.22.4 - zod-to-json-schema: ^3.21.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 6b19944a070b8e0c0d9a33c39d50f0bf1a3dfb5884833bd96286508573528a4b254660f0044eeeeecf4f7d392b71a95e3b9665903d83cb27aa04625155284b2b - languageName: node - linkType: hard - "@backstage/frontend-plugin-api@workspace:^, @backstage/frontend-plugin-api@workspace:packages/frontend-plugin-api": version: 0.0.0-use.local resolution: "@backstage/frontend-plugin-api@workspace:packages/frontend-plugin-api" @@ -4235,25 +4133,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@npm:^1.1.21, @backstage/integration-react@npm:^1.1.22": - version: 1.1.22 - resolution: "@backstage/integration-react@npm:1.1.22" - dependencies: - "@backstage/config": ^1.1.1 - "@backstage/core-plugin-api": ^1.8.1 - "@backstage/integration": ^1.8.0 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@types/react": ^16.13.1 || ^17.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 76fb82f1f947574259d393406bdc30919636e451dbbab357b640f70b2b8b869564fad10da74088f12b497996b84b8e3f55ddea355a9ee61c27f549a2805773a5 - languageName: node - linkType: hard - -"@backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": +"@backstage/integration-react@^1.1.21, @backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": version: 0.0.0-use.local resolution: "@backstage/integration-react@workspace:packages/integration-react" dependencies: @@ -4277,7 +4157,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration@^1.8.0, @backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": +"@backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": version: 0.0.0-use.local resolution: "@backstage/integration@workspace:packages/integration" dependencies: @@ -4546,7 +4426,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-api-docs@workspace:plugins/api-docs" dependencies: - "@asyncapi/react-component": 1.2.6 + "@asyncapi/react-component": 1.2.13 "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/core-app-api": "workspace:^" @@ -4554,7 +4434,9 @@ __metadata: "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" "@backstage/plugin-catalog": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" + "@backstage/plugin-permission-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@graphiql/react": ^0.20.0 "@material-ui/core": ^4.12.2 @@ -4642,6 +4524,24 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-app-visualizer@workspace:^, @backstage/plugin-app-visualizer@workspace:plugins/app-visualizer": + version: 0.0.0-use.local + resolution: "@backstage/plugin-app-visualizer@workspace:plugins/app-visualizer" + dependencies: + "@backstage/cli": "workspace:^" + "@backstage/core-components": "workspace:^" + "@backstage/core-plugin-api": "workspace:^" + "@backstage/frontend-plugin-api": "workspace:^" + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@types/react": ^16.13.1 || ^17.0.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + languageName: unknown + linkType: soft + "@backstage/plugin-auth-backend-module-atlassian-provider@workspace:^, @backstage/plugin-auth-backend-module-atlassian-provider@workspace:plugins/auth-backend-module-atlassian-provider": version: 0.0.0-use.local resolution: "@backstage/plugin-auth-backend-module-atlassian-provider@workspace:plugins/auth-backend-module-atlassian-provider" @@ -5545,6 +5445,7 @@ __metadata: dependencies: "@apidevtools/json-schema-ref-parser": ^9.0.6 "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" @@ -5668,7 +5569,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@^1.0.10, @backstage/plugin-catalog-common@^1.0.19, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@^1.0.10, @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: @@ -5774,44 +5675,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@npm:^1.2.4, @backstage/plugin-catalog-react@npm:^1.9.1": - version: 1.9.2 - resolution: "@backstage/plugin-catalog-react@npm:1.9.2" - dependencies: - "@backstage/catalog-client": ^1.5.0 - "@backstage/catalog-model": ^1.4.3 - "@backstage/core-components": ^0.13.9 - "@backstage/core-plugin-api": ^1.8.1 - "@backstage/errors": ^1.2.3 - "@backstage/frontend-plugin-api": ^0.4.0 - "@backstage/integration-react": ^1.1.22 - "@backstage/plugin-catalog-common": ^1.0.19 - "@backstage/plugin-permission-common": ^0.7.11 - "@backstage/plugin-permission-react": ^0.4.18 - "@backstage/theme": ^0.5.0 - "@backstage/types": ^1.1.1 - "@backstage/version-bridge": ^1.0.7 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.61 - "@react-hookz/web": ^23.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - classnames: ^2.2.6 - lodash: ^4.17.21 - material-ui-popup-state: ^1.9.3 - qs: ^6.9.4 - react-use: ^17.2.4 - yaml: ^2.0.0 - zen-observable: ^0.10.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: e363db83bb85a6dac23616104aa52b019c4f32341fb757c40cf0321ad12427ffcad647b54b38d2d47a7299571e95c2cd226e01c6f9dde585d5377a4dc95a1df6 - languageName: node - linkType: hard - -"@backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": +"@backstage/plugin-catalog-react@^1.2.4, @backstage/plugin-catalog-react@^1.9.1, @backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-react@workspace:plugins/catalog-react" dependencies: @@ -6397,6 +6261,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" + "@backstage/test-utils": "workspace:^" "@codemirror/language": ^6.0.0 "@codemirror/legacy-modes": ^6.1.0 "@codemirror/view": ^6.0.0 @@ -7002,25 +6867,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-home-react@npm:^0.1.5": - version: 0.1.6 - resolution: "@backstage/plugin-home-react@npm:0.1.6" - dependencies: - "@backstage/core-components": ^0.13.9 - "@backstage/core-plugin-api": ^1.8.1 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@rjsf/utils": 5.15.0 - "@types/react": ^16.13.1 || ^17.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: ecd2d6d6b2f0793bb0180b07ec7559230361eb3174d7a962bc08fabc2c29bf21f9705ae5b9a6977005ecac4009dc5806b0d8ecac67eecb6507141764a96d1def - languageName: node - linkType: hard - -"@backstage/plugin-home-react@workspace:^, @backstage/plugin-home-react@workspace:plugins/home-react": +"@backstage/plugin-home-react@^0.1.5, @backstage/plugin-home-react@workspace:^, @backstage/plugin-home-react@workspace:plugins/home-react": version: 0.0.0-use.local resolution: "@backstage/plugin-home-react@workspace:plugins/home-react" dependencies: @@ -7898,7 +7745,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-common@^0.7.11, @backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": +"@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: @@ -7936,25 +7783,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-react@npm:^0.4.18": - version: 0.4.18 - resolution: "@backstage/plugin-permission-react@npm:0.4.18" - dependencies: - "@backstage/config": ^1.1.1 - "@backstage/core-plugin-api": ^1.8.1 - "@backstage/plugin-permission-common": ^0.7.11 - "@types/react": ^16.13.1 || ^17.0.0 - cross-fetch: ^4.0.0 - react-use: ^17.2.4 - swr: ^2.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: da1386b814fcb0b7350cebc1975d88cdf4c97a474f292a56d4e15ce63bb25a54d34d17067865363fa051983d9fa5170afce6a38299bc7c3ab82f1e44c708b13b - 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" @@ -8289,6 +8117,8 @@ __metadata: "@backstage/plugin-scaffolder-node": "workspace:^" "@gitbeaker/core": ^35.8.0 "@gitbeaker/node": ^35.8.0 + "@gitbeaker/rest": ^39.25.0 + jest-date-mock: ^1.0.8 yaml: ^2.0.0 zod: ^3.22.4 languageName: unknown @@ -8499,10 +8329,12 @@ __metadata: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/core-app-api": "workspace:^" + "@backstage/core-compat-api": "workspace:^" "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/frontend-plugin-api": "workspace:^" "@backstage/integration": "workspace:^" "@backstage/integration-react": "workspace:^" "@backstage/plugin-catalog": "workspace:^" @@ -8872,6 +8704,95 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-signals-backend@workspace:^, @backstage/plugin-signals-backend@workspace:plugins/signals-backend": + version: 0.0.0-use.local + resolution: "@backstage/plugin-signals-backend@workspace:plugins/signals-backend" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" + "@backstage/plugin-events-node": "workspace:^" + "@backstage/plugin-signals-node": "workspace:^" + "@backstage/types": "workspace:^" + "@types/express": "*" + "@types/supertest": ^2.0.8 + express: ^4.17.1 + express-promise-router: ^4.1.0 + http-proxy-middleware: ^2.0.0 + msw: ^1.0.0 + node-fetch: ^2.6.7 + supertest: ^6.2.4 + uuid: ^8.0.0 + winston: ^3.2.1 + ws: ^8.14.2 + yn: ^4.0.0 + languageName: unknown + linkType: soft + +"@backstage/plugin-signals-node@workspace:^, @backstage/plugin-signals-node@workspace:plugins/signals-node": + version: 0.0.0-use.local + resolution: "@backstage/plugin-signals-node@workspace:plugins/signals-node" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" + "@backstage/plugin-events-node": "workspace:^" + "@backstage/types": "workspace:^" + "@types/express": ^4.17.21 + express: ^4.17.1 + uuid: ^8.0.0 + ws: ^8.14.2 + languageName: unknown + linkType: soft + +"@backstage/plugin-signals-react@workspace:^, @backstage/plugin-signals-react@workspace:plugins/signals-react": + version: 0.0.0-use.local + resolution: "@backstage/plugin-signals-react@workspace:plugins/signals-react" + dependencies: + "@backstage/cli": "workspace:^" + "@backstage/core-plugin-api": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/types": "workspace:^" + "@material-ui/core": ^4.12.4 + "@testing-library/jest-dom": ^6.0.0 + "@testing-library/react": ^14.0.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + languageName: unknown + linkType: soft + +"@backstage/plugin-signals@workspace:^, @backstage/plugin-signals@workspace:plugins/signals": + version: 0.0.0-use.local + resolution: "@backstage/plugin-signals@workspace:plugins/signals" + dependencies: + "@backstage/cli": "workspace:^" + "@backstage/core-app-api": "workspace:^" + "@backstage/core-components": "workspace:^" + "@backstage/core-plugin-api": "workspace:^" + "@backstage/dev-utils": "workspace:^" + "@backstage/plugin-signals-react": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/theme": "workspace:^" + "@backstage/types": "workspace:^" + "@material-ui/core": ^4.12.4 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": ^4.0.0-alpha.61 + "@testing-library/jest-dom": ^6.0.0 + "@testing-library/react": ^14.0.0 + "@testing-library/user-event": ^14.0.0 + jest-websocket-mock: ^2.5.0 + msw: ^1.0.0 + react-use: ^17.2.4 + uuid: ^8.0.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + languageName: unknown + linkType: soft + "@backstage/plugin-sonarqube-backend@workspace:^, @backstage/plugin-sonarqube-backend@workspace:plugins/sonarqube-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-sonarqube-backend@workspace:plugins/sonarqube-backend" @@ -9558,24 +9479,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-visualizer@workspace:^, @backstage/plugin-visualizer@workspace:plugins/visualizer": - version: 0.0.0-use.local - resolution: "@backstage/plugin-visualizer@workspace:plugins/visualizer" - dependencies: - "@backstage/cli": "workspace:^" - "@backstage/core-components": "workspace:^" - "@backstage/core-plugin-api": "workspace:^" - "@backstage/frontend-plugin-api": "workspace:^" - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@types/react": ^16.13.1 || ^17.0.0 - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - languageName: unknown - linkType: soft - "@backstage/plugin-xcmetrics@workspace:plugins/xcmetrics": version: 0.0.0-use.local resolution: "@backstage/plugin-xcmetrics@workspace:plugins/xcmetrics" @@ -9701,26 +9604,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/theme@^0.5.0, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": - version: 0.0.0-use.local - resolution: "@backstage/theme@workspace:packages/theme" - dependencies: - "@backstage/cli": "workspace:^" - "@emotion/react": ^11.10.5 - "@emotion/styled": ^11.10.5 - "@mui/material": ^5.12.2 - "@mui/styles": ^5.14.18 - "@testing-library/jest-dom": ^6.0.0 - "@testing-library/react": ^14.0.0 - "@types/react": ^16.13.1 || ^17.0.0 - peerDependencies: - "@material-ui/core": ^4.12.2 - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - languageName: unknown - linkType: soft - "@backstage/theme@npm:^0.2.16, @backstage/theme@npm:^0.2.18": version: 0.2.19 resolution: "@backstage/theme@npm:0.2.19" @@ -9749,7 +9632,27 @@ __metadata: languageName: node linkType: hard -"@backstage/types@^1.0.2, @backstage/types@^1.1.1, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": +"@backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": + version: 0.0.0-use.local + resolution: "@backstage/theme@workspace:packages/theme" + dependencies: + "@backstage/cli": "workspace:^" + "@emotion/react": ^11.10.5 + "@emotion/styled": ^11.10.5 + "@mui/material": ^5.12.2 + "@mui/styles": ^5.14.18 + "@testing-library/jest-dom": ^6.0.0 + "@testing-library/react": ^14.0.0 + "@types/react": ^16.13.1 || ^17.0.0 + peerDependencies: + "@material-ui/core": ^4.12.2 + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + languageName: unknown + linkType: soft + +"@backstage/types@^1.0.2, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@backstage/types@workspace:packages/types" dependencies: @@ -9760,7 +9663,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@^1.0.3, @backstage/version-bridge@^1.0.7, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@^1.0.3, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": version: 0.0.0-use.local resolution: "@backstage/version-bridge@workspace:packages/version-bridge" dependencies: @@ -9789,10 +9692,10 @@ __metadata: languageName: node linkType: hard -"@braintree/sanitize-url@npm:=6.0.4": - version: 6.0.4 - resolution: "@braintree/sanitize-url@npm:6.0.4" - checksum: f5ec6048973722ea1c46ae555d2e9eb848d7fa258994f8ea7d6db9514ee754ea3ef344ef71b3696d486776bcb839f3124e79f67c6b5b2814ed2da220b340627c +"@braintree/sanitize-url@npm:=7.0.0": + version: 7.0.0 + resolution: "@braintree/sanitize-url@npm:7.0.0" + checksum: 2ca9c617343d00c668486f5382cd6ef7d0bd54ba6c8d40deb0f3e7843390a056cf0c590f1d06d38a49b7d8b3f63c006f89873944996742835f2b523b707913a0 languageName: node linkType: hard @@ -10469,9 +10372,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/aix-ppc64@npm:0.19.10" +"@esbuild/aix-ppc64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/aix-ppc64@npm:0.19.11" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard @@ -10490,9 +10393,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/android-arm64@npm:0.19.10" +"@esbuild/android-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/android-arm64@npm:0.19.11" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -10511,9 +10414,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/android-arm@npm:0.19.10" +"@esbuild/android-arm@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/android-arm@npm:0.19.11" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -10532,9 +10435,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/android-x64@npm:0.19.10" +"@esbuild/android-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/android-x64@npm:0.19.11" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -10553,9 +10456,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/darwin-arm64@npm:0.19.10" +"@esbuild/darwin-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/darwin-arm64@npm:0.19.11" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -10574,9 +10477,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/darwin-x64@npm:0.19.10" +"@esbuild/darwin-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/darwin-x64@npm:0.19.11" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -10595,9 +10498,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/freebsd-arm64@npm:0.19.10" +"@esbuild/freebsd-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/freebsd-arm64@npm:0.19.11" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -10616,9 +10519,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/freebsd-x64@npm:0.19.10" +"@esbuild/freebsd-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/freebsd-x64@npm:0.19.11" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -10637,9 +10540,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/linux-arm64@npm:0.19.10" +"@esbuild/linux-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-arm64@npm:0.19.11" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -10658,9 +10561,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/linux-arm@npm:0.19.10" +"@esbuild/linux-arm@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-arm@npm:0.19.11" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -10679,9 +10582,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/linux-ia32@npm:0.19.10" +"@esbuild/linux-ia32@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-ia32@npm:0.19.11" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -10700,9 +10603,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/linux-loong64@npm:0.19.10" +"@esbuild/linux-loong64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-loong64@npm:0.19.11" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -10721,9 +10624,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/linux-mips64el@npm:0.19.10" +"@esbuild/linux-mips64el@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-mips64el@npm:0.19.11" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -10742,9 +10645,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/linux-ppc64@npm:0.19.10" +"@esbuild/linux-ppc64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-ppc64@npm:0.19.11" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -10763,9 +10666,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/linux-riscv64@npm:0.19.10" +"@esbuild/linux-riscv64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-riscv64@npm:0.19.11" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -10784,9 +10687,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/linux-s390x@npm:0.19.10" +"@esbuild/linux-s390x@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-s390x@npm:0.19.11" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -10805,9 +10708,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/linux-x64@npm:0.19.10" +"@esbuild/linux-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-x64@npm:0.19.11" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -10826,9 +10729,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/netbsd-x64@npm:0.19.10" +"@esbuild/netbsd-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/netbsd-x64@npm:0.19.11" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -10847,9 +10750,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/openbsd-x64@npm:0.19.10" +"@esbuild/openbsd-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/openbsd-x64@npm:0.19.11" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -10868,9 +10771,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/sunos-x64@npm:0.19.10" +"@esbuild/sunos-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/sunos-x64@npm:0.19.11" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -10889,9 +10792,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/win32-arm64@npm:0.19.10" +"@esbuild/win32-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/win32-arm64@npm:0.19.11" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -10910,9 +10813,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/win32-ia32@npm:0.19.10" +"@esbuild/win32-ia32@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/win32-ia32@npm:0.19.11" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -10931,9 +10834,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.10": - version: 0.19.10 - resolution: "@esbuild/win32-x64@npm:0.19.10" +"@esbuild/win32-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/win32-x64@npm:0.19.11" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -10973,10 +10876,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.55.0": - version: 8.55.0 - resolution: "@eslint/js@npm:8.55.0" - checksum: fa33ef619f0646ed15649b0c2e313e4d9ccee8425884bdbfc78020d6b6b64c0c42fa9d83061d0e6158e1d4274f03f0f9008786540e2efab8fcdc48082259908c +"@eslint/js@npm:8.56.0": + version: 8.56.0 + resolution: "@eslint/js@npm:8.56.0" + checksum: 5804130574ef810207bdf321c265437814e7a26f4e6fac9b496de3206afd52f533e09ec002a3be06cd9adcc9da63e727f1883938e663c4e4751c007d5b58e539 languageName: node linkType: hard @@ -11044,41 +10947,41 @@ __metadata: languageName: node linkType: hard -"@floating-ui/core@npm:^1.4.2": - version: 1.5.0 - resolution: "@floating-ui/core@npm:1.5.0" - dependencies: - "@floating-ui/utils": ^0.1.3 - checksum: 54b4fe26b3c228746ac5589f97303abf158b80aa5f8b99027259decd68d1c2030c4c637648ebd33dfe78a4212699453bc2bd7537fd5a594d3bd3e63d362f666f - languageName: node - linkType: hard - -"@floating-ui/dom@npm:^1.5.1": +"@floating-ui/core@npm:^1.5.3": version: 1.5.3 - resolution: "@floating-ui/dom@npm:1.5.3" + resolution: "@floating-ui/core@npm:1.5.3" dependencies: - "@floating-ui/core": ^1.4.2 - "@floating-ui/utils": ^0.1.3 - checksum: 00053742064aac70957f0bd5c1542caafb3bfe9716588bfe1d409fef72a67ed5e60450d08eb492a77f78c22ed1ce4f7955873cc72bf9f9caf2b0f43ae3561c21 + "@floating-ui/utils": ^0.2.0 + checksum: 72af8563e1742791acee82e86f82a0fbca7445809988d31eea3fd5771909463aa7655a6cb001cc244f8fe3a9de600420257e4dfb887ca33e2a31ac47b52e39a2 languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.0.4": - version: 2.0.4 - resolution: "@floating-ui/react-dom@npm:2.0.4" +"@floating-ui/dom@npm:^1.5.4": + version: 1.5.4 + resolution: "@floating-ui/dom@npm:1.5.4" dependencies: - "@floating-ui/dom": ^1.5.1 + "@floating-ui/core": ^1.5.3 + "@floating-ui/utils": ^0.2.0 + checksum: 5e6f05532ff4e6daf9f2d91534184d8f942ddb8fd260c2543a49bdf0c0ff69fd0867937ce1d023126008724ac238f8fc89b5e48f82cdf9f8355a1d04edd085bd + languageName: node + linkType: hard + +"@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.0.5": + version: 2.0.6 + resolution: "@floating-ui/react-dom@npm:2.0.6" + dependencies: + "@floating-ui/dom": ^1.5.4 peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 91b2369e25f84888486e48c1656117468248906034ed482d411bb9ed1061b908dd32435b4ca3d0cd0ca6083291510a98ce74d76c671d5cc25b0c41e5fa824bae + checksum: 3608537be6cae5f0442d3f826379b8e4a9ce5c4bdecf1d2b34e6709842d80444be1a00eca3641d680e2e6405d833092f58005d1b120a9d39ffd341c60b0c017c languageName: node linkType: hard -"@floating-ui/utils@npm:^0.1.3": - version: 0.1.4 - resolution: "@floating-ui/utils@npm:0.1.4" - checksum: e6195ded5b3a6fd38411a833605184c31f24609b08feab2615e90ccc063bf4d3965383d817642fc7e8ca5ab6a54c29c71103e874f3afb0518595c8bd3390ba16 +"@floating-ui/utils@npm:^0.2.0": + version: 0.2.1 + resolution: "@floating-ui/utils@npm:0.2.1" + checksum: 9ed4380653c7c217cd6f66ae51f20fdce433730dbc77f95b5abfb5a808f5fdb029c6ae249b4e0490a816f2453aa6e586d9a873cd157fdba4690f65628efc6e06 languageName: node linkType: hard @@ -11115,6 +11018,17 @@ __metadata: languageName: node linkType: hard +"@gitbeaker/core@npm:^39.30.0": + version: 39.30.0 + resolution: "@gitbeaker/core@npm:39.30.0" + dependencies: + "@gitbeaker/requester-utils": ^39.30.0 + qs: ^6.11.2 + xcase: ^2.0.1 + checksum: 4724659bab57cde13b63bba7ffad52651ebb726c444bb1d6c1c69c70efb89ed3d319abf12c117f9a8ab6741cc26e6a19c23e237bebd07d13b2f8c970171dc069 + languageName: node + linkType: hard + "@gitbeaker/node@npm:^35.1.0, @gitbeaker/node@npm:^35.8.0": version: 35.8.1 resolution: "@gitbeaker/node@npm:35.8.1" @@ -11139,24 +11053,46 @@ __metadata: languageName: node linkType: hard +"@gitbeaker/requester-utils@npm:^39.30.0": + version: 39.30.0 + resolution: "@gitbeaker/requester-utils@npm:39.30.0" + dependencies: + picomatch-browser: ^2.2.6 + qs: ^6.11.2 + rate-limiter-flexible: ^4.0.0 + xcase: ^2.0.1 + checksum: 05a60b027736edd165341c88ddbe095c78e77616f60033a9c9b419b657cd7d9998a9a801470a88d25d96be44b3a5233e3f1a4042aee075872f2882d10122db69 + languageName: node + linkType: hard + +"@gitbeaker/rest@npm:^39.25.0": + version: 39.30.0 + resolution: "@gitbeaker/rest@npm:39.30.0" + dependencies: + "@gitbeaker/core": ^39.30.0 + "@gitbeaker/requester-utils": ^39.30.0 + checksum: 2b04dbb28c1a5f47c067c376ff0b4664278d72dcdef7696646a6d9331a400d9dfe75382e041a0a683fdc5ac1805abdb2919455fea786fd97f0eb65a5473d3fb5 + languageName: node + linkType: hard + "@google-cloud/container@npm:^5.0.0": - version: 5.4.0 - resolution: "@google-cloud/container@npm:5.4.0" + version: 5.4.1 + resolution: "@google-cloud/container@npm:5.4.1" dependencies: google-gax: ^4.0.3 - checksum: ab6a6f0d6e6dc7feb30c848f40109ada5464c2594d9bbb467dbd522e097f0dc1108d366becfae268831d0ca203fa06dcedf28014d4d9161838bb2bb550162465 + checksum: 93f06b3171805c85d2ec8fa959e3caa147f1560da5c90082e23e1ccbd6ef88756e3271dbf3db139fefaa48874222f7e9e4a7dc5fb7da54a2e7ecd80db472ecf7 languageName: node linkType: hard "@google-cloud/firestore@npm:^7.0.0": - version: 7.1.0 - resolution: "@google-cloud/firestore@npm:7.1.0" + version: 7.2.0 + resolution: "@google-cloud/firestore@npm:7.2.0" dependencies: fast-deep-equal: ^3.1.1 functional-red-black-tree: ^1.0.1 google-gax: ^4.0.4 protobufjs: ^7.2.5 - checksum: 271deeb1fbf389237f34e0a6fa90336ddd3beccc8ff4b6519c22ee1edd2da4c74aa7ee3b14a669fb16dc67ea21bf3c3baf5d1ffb01218c121fd9ac71bb4e873b + checksum: 2f9a5fa24741bb3e93c6dad2a366d8bfdab2a05d1a742a842eb432cc0e9e6cfc05828b0f6215827aa0da875556a329d1a39f06349b5b371b8dec685cd3225d6b languageName: node linkType: hard @@ -11821,12 +11757,12 @@ __metadata: languageName: node linkType: hard -"@jest/create-cache-key-function@npm:^27.4.2": - version: 27.5.1 - resolution: "@jest/create-cache-key-function@npm:27.5.1" +"@jest/create-cache-key-function@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/create-cache-key-function@npm:29.7.0" dependencies: - "@jest/types": ^27.5.1 - checksum: a6c3a8c769aca6f66f5dc80f1c77e66980b4f213a6b2a15a92ba3595f032848a1261c06c9c798dcf2b672b1ffbefad5085af89d130548741c85ddbe0cf4284e7 + "@jest/types": ^29.6.3 + checksum: 681bc761fa1d6fa3dd77578d444f97f28296ea80755e90e46d1c8fa68661b9e67f54dd38b988742db636d26cf160450dc6011892cec98b3a7ceb58cad8ff3aae languageName: node linkType: hard @@ -12009,19 +11945,6 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^27.5.1": - version: 27.5.1 - resolution: "@jest/types@npm:27.5.1" - dependencies: - "@types/istanbul-lib-coverage": ^2.0.0 - "@types/istanbul-reports": ^3.0.0 - "@types/node": "*" - "@types/yargs": ^16.0.0 - chalk: ^4.0.0 - checksum: d1f43cc946d87543ddd79d49547aab2399481d34025d5c5f2025d3d99c573e1d9832fa83cef25e9d9b07a8583500229d15bbb07b8e233d127d911d133e2f14b1 - languageName: node - linkType: hard - "@jest/types@npm:^28.1.3": version: 28.1.3 resolution: "@jest/types@npm:28.1.3" @@ -12155,11 +12078,11 @@ __metadata: linkType: hard "@keyv/redis@npm:^2.5.3": - version: 2.8.0 - resolution: "@keyv/redis@npm:2.8.0" + version: 2.8.3 + resolution: "@keyv/redis@npm:2.8.3" dependencies: ioredis: ^5.3.2 - checksum: 753e18897bf8e1fed585357d85749c7a1689f5efc1eb7114e790bf760460f7f510d5e76da5cc742269949205c18aad3c58ce4f8ceef5db0ace4ee108833632ba + checksum: 4b8fa4baeab75aace0a8c5d02e30dfb87fa2e27236d8ce3577ff862c4efa2ae2f6d4c14b4933e08fd24fd2719a01d17ac596e20792a1d3c0c2af51a46ba48936 languageName: node linkType: hard @@ -12816,9 +12739,9 @@ __metadata: languageName: node linkType: hard -"@mswjs/interceptors@npm:^0.25.13": - version: 0.25.13 - resolution: "@mswjs/interceptors@npm:0.25.13" +"@mswjs/interceptors@npm:^0.25.14": + version: 0.25.14 + resolution: "@mswjs/interceptors@npm:0.25.14" dependencies: "@open-draft/deferred-promise": ^2.2.0 "@open-draft/logger": ^0.3.0 @@ -12826,20 +12749,20 @@ __metadata: is-node-process: ^1.2.0 outvariant: ^1.2.1 strict-event-emitter: ^0.5.1 - checksum: 21eaefbd66dc2c3bbeec5b6a2fdc714f6a0967158c0137cd1e4b875284e55d358b4a032030d5e0783e5826cdb27918086d1fd8412f3cbcc70e5368554f678d46 + checksum: caf9513cf6848ff0c3f1402abf881d3c1333f68fae54076cfd3fd919b7edb709769342bd3afd2a60ef4ae698ef47776b6203e0ea6a5d8e788e97eda7ed9dbbd4 languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.29": - version: 5.0.0-beta.29 - resolution: "@mui/base@npm:5.0.0-beta.29" +"@mui/base@npm:5.0.0-beta.32": + version: 5.0.0-beta.32 + resolution: "@mui/base@npm:5.0.0-beta.32" dependencies: - "@babel/runtime": ^7.23.6 - "@floating-ui/react-dom": ^2.0.4 - "@mui/types": ^7.2.11 - "@mui/utils": ^5.15.2 + "@babel/runtime": ^7.23.8 + "@floating-ui/react-dom": ^2.0.5 + "@mui/types": ^7.2.13 + "@mui/utils": ^5.15.5 "@popperjs/core": ^2.11.8 - clsx: ^2.0.0 + clsx: ^2.1.0 prop-types: ^15.8.1 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -12848,29 +12771,29 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 40481f18d5b4c560e0f9868876727203af76954b5b8b208bfc01da666229f8eef45852b5d87403aa42b4c8515a5b9d2e99d4ae40446289d7456c56310fce72c7 + checksum: 5f27be8914c072ffcbe6720de9aa6129180e68927657e8bcbc03a6f322d1ee6c6740a199d72ed0b490a7b29b79cc0c59d1e05a427089b17f4cbc9cc756e67506 languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.15.2": - version: 5.15.2 - resolution: "@mui/core-downloads-tracker@npm:5.15.2" - checksum: 8c88ac73a1d87c8ce565f6295dcd084c643580848e8f59159402e9db89975263da06305a0e605d3744479e917c2d297319496534bca9df8338e203162f1e7c33 +"@mui/core-downloads-tracker@npm:^5.15.5": + version: 5.15.5 + resolution: "@mui/core-downloads-tracker@npm:5.15.5" + checksum: 4c9b1281ebe8d17d402e22f7f50c347c0b3918b1ed17af721f4de5ce282d90bc6d90fe9730595998b2bbb2f7ebe57fc55d4c858f31754fccdb606af472a59dc8 languageName: node linkType: hard "@mui/material@npm:^5.12.2": - version: 5.15.2 - resolution: "@mui/material@npm:5.15.2" + version: 5.15.5 + resolution: "@mui/material@npm:5.15.5" dependencies: - "@babel/runtime": ^7.23.6 - "@mui/base": 5.0.0-beta.29 - "@mui/core-downloads-tracker": ^5.15.2 - "@mui/system": ^5.15.2 - "@mui/types": ^7.2.11 - "@mui/utils": ^5.15.2 + "@babel/runtime": ^7.23.8 + "@mui/base": 5.0.0-beta.32 + "@mui/core-downloads-tracker": ^5.15.5 + "@mui/system": ^5.15.5 + "@mui/types": ^7.2.13 + "@mui/utils": ^5.15.5 "@types/react-transition-group": ^4.4.10 - clsx: ^2.0.0 + clsx: ^2.1.0 csstype: ^3.1.2 prop-types: ^15.8.1 react-is: ^18.2.0 @@ -12888,16 +12811,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: 7586b0160c686214c4d3a6f8af76306413bfe13286a4679ca7696b764615f511b5d5b27a8129e15ae81856492317e7f139f4bd075f6b2dfe6e60de46755d7dbc + checksum: dbfcb31810c674d9ab3b9145752433de3917d9c0d1b491bdff84c44b8f1124e8fe8ab04fa09b974b497983b7bd3011b86fb441ad365f979f971d3ddb46712060 languageName: node linkType: hard -"@mui/private-theming@npm:^5.15.2": - version: 5.15.2 - resolution: "@mui/private-theming@npm:5.15.2" +"@mui/private-theming@npm:^5.15.5": + version: 5.15.5 + resolution: "@mui/private-theming@npm:5.15.5" dependencies: - "@babel/runtime": ^7.23.6 - "@mui/utils": ^5.15.2 + "@babel/runtime": ^7.23.8 + "@mui/utils": ^5.15.5 prop-types: ^15.8.1 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -12905,15 +12828,15 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 63cc69adc3eca03533dd72296aac6449abe133522f6f5c62c8497e57dbd092c131cba3488ee8d97dfb76c31a194df014f4da3b2d30027614e987ed72581a4acf + checksum: 3a5f7f190aa69a0ad69a34f77e54ee2fdcb088d21a61d4720b76d098d178e1c3f6a470fc5e7a30d351db10efbc062cb11af75b8789e2f38eaa2ca612bcb0f851 languageName: node linkType: hard -"@mui/styled-engine@npm:^5.15.2": - version: 5.15.2 - resolution: "@mui/styled-engine@npm:5.15.2" +"@mui/styled-engine@npm:^5.15.5": + version: 5.15.5 + resolution: "@mui/styled-engine@npm:5.15.5" dependencies: - "@babel/runtime": ^7.23.6 + "@babel/runtime": ^7.23.8 "@emotion/cache": ^11.11.0 csstype: ^3.1.2 prop-types: ^15.8.1 @@ -12926,20 +12849,20 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: daa15b61be2e785c9719e091047a5900aa5aa0b6a9dfbc2ea373f6718f6ec3485f44e05596cd9506a90a7c55d8d372233a80cbeca4d81ceb8d5e6a10ce0f8292 + checksum: 42bb7f50ed33ec88f799bd90a00337689837ee0b2d603681fe69c9a14850e5ae1d037505365ce78cd564307cc2c0654c46cece8d9250adb21c77b1de316e3c45 languageName: node linkType: hard "@mui/styles@npm:^5.14.18": - version: 5.15.2 - resolution: "@mui/styles@npm:5.15.2" + version: 5.15.5 + resolution: "@mui/styles@npm:5.15.5" dependencies: - "@babel/runtime": ^7.23.6 + "@babel/runtime": ^7.23.8 "@emotion/hash": ^0.9.1 - "@mui/private-theming": ^5.15.2 - "@mui/types": ^7.2.11 - "@mui/utils": ^5.15.2 - clsx: ^2.0.0 + "@mui/private-theming": ^5.15.5 + "@mui/types": ^7.2.13 + "@mui/utils": ^5.15.5 + clsx: ^2.1.0 csstype: ^3.1.2 hoist-non-react-statics: ^3.3.2 jss: ^10.10.0 @@ -12957,20 +12880,20 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 53ee6fb6c1114469dfeacbf5d26fc6ef7bc897428258301515012fcea95f5abcc73d5b70d1ea1da9382f7742aa7da7a9749a7594331e78f85b6b4cd8f8216d11 + checksum: dc131c0e7763f7ac4fd96a1db3dd85abf59de5429a73f7cf9ed15d423fb9bb5883835c1951d36e8804da9ab2ed13d603ed349f12e7cd15885f8279d90d13511b languageName: node linkType: hard -"@mui/system@npm:^5.15.2": - version: 5.15.2 - resolution: "@mui/system@npm:5.15.2" +"@mui/system@npm:^5.15.5": + version: 5.15.5 + resolution: "@mui/system@npm:5.15.5" dependencies: - "@babel/runtime": ^7.23.6 - "@mui/private-theming": ^5.15.2 - "@mui/styled-engine": ^5.15.2 - "@mui/types": ^7.2.11 - "@mui/utils": ^5.15.2 - clsx: ^2.0.0 + "@babel/runtime": ^7.23.8 + "@mui/private-theming": ^5.15.5 + "@mui/styled-engine": ^5.15.5 + "@mui/types": ^7.2.13 + "@mui/utils": ^5.15.5 + clsx: ^2.1.0 csstype: ^3.1.2 prop-types: ^15.8.1 peerDependencies: @@ -12985,27 +12908,27 @@ __metadata: optional: true "@types/react": optional: true - checksum: ce6297a4cfa6f91891fa84679e05e40e12c4a27fe4fb34d78cbcbae172da293c05fa6f07c24fec66c864eac64179aeec1f7a70358e376b8c16ffc8e91f93a904 + checksum: 3f736f120d65fa14588cd7554a9ef63c9d4480716807d7ee5543b9f25d936b5ac0396a51a565c53b2905114fed5f94880c896f091e8d269260bfc53e8a8e2fb5 languageName: node linkType: hard -"@mui/types@npm:^7.2.11": - version: 7.2.11 - resolution: "@mui/types@npm:7.2.11" +"@mui/types@npm:^7.2.13": + version: 7.2.13 + resolution: "@mui/types@npm:7.2.13" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: ce6bbe8ba963af218bf86797f4c8adbf0f294047adeaf6596d3bb4a96f1b01701f1b1ae7dcfe2f7972f6e23c85eee4187e496fb481541713ed8bf12e96f3c34f + checksum: 58dfc96f9654288519ff01d6b54e6a242f05cadad51210deb85710a81be4fa1501a116c8968e2614b16c748fc1f407dc23beeeeae70fa37fceb6c6de876ff70d languageName: node linkType: hard -"@mui/utils@npm:^5.14.15, @mui/utils@npm:^5.15.2": - version: 5.15.2 - resolution: "@mui/utils@npm:5.15.2" +"@mui/utils@npm:^5.14.15, @mui/utils@npm:^5.15.5": + version: 5.15.5 + resolution: "@mui/utils@npm:5.15.5" dependencies: - "@babel/runtime": ^7.23.6 + "@babel/runtime": ^7.23.8 "@types/prop-types": ^15.7.11 prop-types: ^15.8.1 react-is: ^18.2.0 @@ -13015,7 +12938,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: c78ad9fb1a5fa1dc5955cada77227c605f1e5bf45503bf2bb0080bc92cf28bdcf1cbb83322d19162c5424ec245a66cef849603c7681fa1ec89093e0b1922dc58 + checksum: fe71ce69e23cb4c00886138da1422e4baa66959cd10f97b2aa00f7324a038b13084ea4a0da123774c0018f48ddb6ce4f3cb20a915ec3c5c1ff5495bf337f665f languageName: node linkType: hard @@ -13026,58 +12949,54 @@ __metadata: languageName: node linkType: hard -"@nestjs/axios@npm:0.1.0": - version: 0.1.0 - resolution: "@nestjs/axios@npm:0.1.0" - dependencies: - axios: 0.27.2 +"@nestjs/axios@npm:3.0.1": + version: 3.0.1 + resolution: "@nestjs/axios@npm:3.0.1" peerDependencies: - "@nestjs/common": ^7.0.0 || ^8.0.0 || ^9.0.0 + "@nestjs/common": ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + axios: ^1.3.1 reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 - checksum: 72929b25caacb85517bae962b13d865a31aa3984aa9e55305e0a2306e54338fe51a7eb38ca38cab0fe8b4116fb35219bd02c8b0c4cac70e7b5aeb84d03a1db3f + checksum: 01cebc64efa7a1d9df7a9053fbc5124986a95078789a0f280a2a61c31601a70a35745e07fc385497b4f85c7bdb6216a3575728646f1e6e684c038ac31900129c languageName: node linkType: hard -"@nestjs/common@npm:9.3.11": - version: 9.3.11 - resolution: "@nestjs/common@npm:9.3.11" +"@nestjs/common@npm:10.3.0": + version: 10.3.0 + resolution: "@nestjs/common@npm:10.3.0" dependencies: iterare: 1.2.1 - tslib: 2.5.0 - uid: 2.0.1 + tslib: 2.6.2 + uid: 2.0.2 peerDependencies: - cache-manager: <=5 class-transformer: "*" class-validator: "*" reflect-metadata: ^0.1.12 rxjs: ^7.1.0 peerDependenciesMeta: - cache-manager: - optional: true class-transformer: optional: true class-validator: optional: true - checksum: c39dfa9f02268e3f7fa22c4e9eecff0cfbee39c4d4dd0efc757a52117696dc9aec1f87588252b8b267a18469a6c12987707708b44f97ccbb5c6297396c0d9c00 + checksum: c5444cb46bd4f4a4d28b5031f7c28a0cf9863bc2d5518910bfed6a49734f59e1ea08dd4651e2117ae82df81c933ef84f0963c5cdeee5ef1608cf1bd36ee291c5 languageName: node linkType: hard -"@nestjs/core@npm:9.3.11": - version: 9.3.11 - resolution: "@nestjs/core@npm:9.3.11" +"@nestjs/core@npm:10.3.0": + version: 10.3.0 + resolution: "@nestjs/core@npm:10.3.0" dependencies: "@nuxtjs/opencollective": 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 path-to-regexp: 3.2.0 - tslib: 2.5.0 - uid: 2.0.1 + tslib: 2.6.2 + uid: 2.0.2 peerDependencies: - "@nestjs/common": ^9.0.0 - "@nestjs/microservices": ^9.0.0 - "@nestjs/platform-express": ^9.0.0 - "@nestjs/websockets": ^9.0.0 + "@nestjs/common": ^10.0.0 + "@nestjs/microservices": ^10.0.0 + "@nestjs/platform-express": ^10.0.0 + "@nestjs/websockets": ^10.0.0 reflect-metadata: ^0.1.12 rxjs: ^7.1.0 peerDependenciesMeta: @@ -13087,19 +13006,19 @@ __metadata: optional: true "@nestjs/websockets": optional: true - checksum: 39d49e5b16cc260887233dd6701dbc53c073dc7522975d592f6c355db1f42fcf31eeaf300b9d03c63943f7330ecee910281cb78bb66d1c2d938d9b13491e70b4 + checksum: 7677b9fb97c8dec512c2a736c273ef08698b377af8c046bc5aad442ba3d35acbc17d177e76bf44a66678cae2ced2d265183e85be4190c501a195f16496df6396 languageName: node linkType: hard "@newrelic/browser-agent@npm:^1.236.0": - version: 1.248.0 - resolution: "@newrelic/browser-agent@npm:1.248.0" + version: 1.250.0 + resolution: "@newrelic/browser-agent@npm:1.250.0" dependencies: core-js: ^3.26.0 fflate: ^0.7.4 rrweb: 2.0.0-alpha.11 web-vitals: ^3.1.0 - checksum: 0db9d85304e687f6d0e0be89306d26ab99469475ecb8107e224d9757da98627d67c5a652d65782092aa543738976bcb0ae701c92a7fcac7b2ef72c283342cba5 + checksum: 4cea599b5544c3981c8a564cd1f31cce33c286130cab8cfdb7adc08adf47499d525f0a555d648f0aa17ccb23749e572fb548a84c061c789a996dc264de5ed7cc languageName: node linkType: hard @@ -14047,41 +13966,42 @@ __metadata: linkType: hard "@openapitools/openapi-generator-cli@npm:^2.4.26, @openapitools/openapi-generator-cli@npm:^2.7.0": - version: 2.7.0 - resolution: "@openapitools/openapi-generator-cli@npm:2.7.0" + version: 2.9.0 + resolution: "@openapitools/openapi-generator-cli@npm:2.9.0" dependencies: - "@nestjs/axios": 0.1.0 - "@nestjs/common": 9.3.11 - "@nestjs/core": 9.3.11 + "@nestjs/axios": 3.0.1 + "@nestjs/common": 10.3.0 + "@nestjs/core": 10.3.0 "@nuxtjs/opencollective": 0.3.2 + axios: 1.6.5 chalk: 4.1.2 commander: 8.3.0 compare-versions: 4.1.4 concurrently: 6.5.1 console.table: 0.10.0 fs-extra: 10.1.0 - glob: 7.1.6 - inquirer: 8.2.5 + glob: 7.2.3 + inquirer: 8.2.6 lodash: 4.17.21 reflect-metadata: 0.1.13 - rxjs: 7.8.0 - tslib: 2.0.3 + rxjs: 7.8.1 + tslib: 2.6.2 bin: openapi-generator-cli: main.js - checksum: 92ca36779b43fe1e4868cd89bde4cb96918868aa62c8a69a9e199711d8e7093bab67f484d266fcbf37ca4ad87e4e91ea5759fb322c7999a299f5bfdc179065b8 + checksum: 102040381b42edbab4fa34aa49c3cf8188fdb892c3e251bcb5bdf7c599597f3572d52d44fed7bead5fcaec24d624491c20dc96d2f164fa44e7fc232c7d787f69 languageName: node linkType: hard "@opensearch-project/opensearch@npm:^2.2.1": - version: 2.4.0 - resolution: "@opensearch-project/opensearch@npm:2.4.0" + version: 2.5.0 + resolution: "@opensearch-project/opensearch@npm:2.5.0" dependencies: aws4: ^1.11.0 debug: ^4.3.1 hpagent: ^1.2.0 ms: ^2.1.3 secure-json-parse: ^2.4.0 - checksum: 961ba055276c2cea9733247e57c1a1df76671a777b46ba4caa64a15c8b2aeb12d205c02026a6181382d3b575af49c4bf72b7bcb8fe82bc8dc2c519e1792746f3 + checksum: f9a4afa06c2917ffb76baac1ee1df9b8cf4594af6aded451b7c4838a4a0320101a432c0cbd3586d3533a4eb662fc414d4f1b315b73fac5b7a0c1d5f0ff0ac6ed languageName: node linkType: hard @@ -14180,13 +14100,13 @@ __metadata: linkType: hard "@playwright/test@npm:^1.32.3": - version: 1.40.1 - resolution: "@playwright/test@npm:1.40.1" + version: 1.41.0 + resolution: "@playwright/test@npm:1.41.0" dependencies: - playwright: 1.40.1 + playwright: 1.41.0 bin: playwright: cli.js - checksum: ae094e6cb809365c0707ee2b184e42d2a2542569ada020d2d44ca5866066941262bd9a67af185f86c2fb0133c9b712ea8cb73e2959a289e4261c5fd17077283c + checksum: 3a7039f8cd14dd242154255417c100a99c3254a3c1fd26df2a11be24c10b06ef77d2736336d7743dedc5e1a6a52748e58ced730b6048f8bd75d8867ce81661e0 languageName: node linkType: hard @@ -14956,21 +14876,6 @@ __metadata: languageName: node linkType: hard -"@rjsf/utils@npm:5.15.0": - version: 5.15.0 - resolution: "@rjsf/utils@npm:5.15.0" - 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: 369de8620fdbd26aea074e0a33d5ea3b1bb89e3389d826a70612dbec8881617bb0dc8403ca6774d0def332ffe15d26bed133d6ff7361ff2978a4b024cea829c3 - languageName: node - linkType: hard - "@rjsf/utils@npm:5.15.1": version: 5.15.1 resolution: "@rjsf/utils@npm:5.15.1" @@ -15143,16 +15048,16 @@ __metadata: linkType: hard "@rollup/plugin-json@npm:^6.0.0": - version: 6.0.1 - resolution: "@rollup/plugin-json@npm:6.0.1" + version: 6.1.0 + resolution: "@rollup/plugin-json@npm:6.1.0" dependencies: - "@rollup/pluginutils": ^5.0.1 + "@rollup/pluginutils": ^5.1.0 peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 86995e3ceec0205bd0b5ae3075f4592e0ab3e6e6327a5dcfc825b44113eaae5819d26d5403d29b177ac59299e0b08c641c8d030e0c72805b92805ededc9cac44 + checksum: cc018d20c80242a2b8b44fae61a968049cf31bb8406218187cc7cda35747616594e79452dd65722e7da6dd825b392e90d4599d43cd4461a02fefa2865945164e languageName: node linkType: hard @@ -15201,19 +15106,19 @@ __metadata: languageName: node linkType: hard -"@rollup/pluginutils@npm:^5.0.1": - version: 5.0.4 - resolution: "@rollup/pluginutils@npm:5.0.4" +"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.1.0": + version: 5.1.0 + resolution: "@rollup/pluginutils@npm:5.1.0" dependencies: "@types/estree": ^1.0.0 estree-walker: ^2.0.2 picomatch: ^2.3.1 peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 893d5805ac4121fc704926963a0ae4e79e9e2bc8d736c3b28499ab69a404cce5119ca3a4e0c3d3a81d62f1beb3966f35285c36935d94b061794f26e94fed4cd1 + checksum: 3cc5a6d91452a6eabbfd1ae79b4dd1f1e809d2eecda6e175deb784e75b0911f47e9ecce73f8dd315d6a8b3f362582c91d3c0f66908b6ced69345b3cbe28f8ce8 languageName: node linkType: hard @@ -15442,366 +15347,385 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^2.0.1, @smithy/abort-controller@npm:^2.0.13, @smithy/abort-controller@npm:^2.0.14": - version: 2.0.14 - resolution: "@smithy/abort-controller@npm:2.0.14" +"@smithy/abort-controller@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/abort-controller@npm:2.1.0" dependencies: - "@smithy/types": ^2.6.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: f89c7b0523fcb4df7dd7057d15a6deff9aa0b9ac5fe816a2f1331353d3874cf8d3e9b2280a1daa903c32be0fe280ef034a2222f6e62f733fc7dc40be3b1cbe38 + checksum: 52ad57706997dd1fabeb5b4d1f43d65403f31f8c7bf2fd6addb84b8132b406763574911499ab757be1c0c7329c06c574174750f17383507cfb05e1df05b26882 languageName: node linkType: hard -"@smithy/chunked-blob-reader-native@npm:^2.0.1": - version: 2.0.1 - resolution: "@smithy/chunked-blob-reader-native@npm:2.0.1" +"@smithy/chunked-blob-reader-native@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/chunked-blob-reader-native@npm:2.1.0" dependencies: - "@smithy/util-base64": ^2.0.1 + "@smithy/util-base64": ^2.1.0 tslib: ^2.5.0 - checksum: db13a380a51ace30c8ed5947ea1b9fa65f5f5d0dbb722b4abc4d19e4a1215979174f35365c692f9fe7d3c116eaaf90dd9fb58e1dcff4fe943fc76d86c7f1798d + checksum: 39ff866a5887dfbe515463d841d869559e18aa18e97a644be49f12821012c171d89d759dbe3999b0bedcafdad8c1202c747b2f5a71a6c1f63082b0fae13b844c languageName: node linkType: hard -"@smithy/chunked-blob-reader@npm:^2.0.0": - version: 2.0.0 - resolution: "@smithy/chunked-blob-reader@npm:2.0.0" +"@smithy/chunked-blob-reader@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/chunked-blob-reader@npm:2.1.0" dependencies: tslib: ^2.5.0 - checksum: a47e5298f0b28e25eaa5825ea9737718f0e2b7cf0f03a49cca186eb5544dd20ac91a2d92069f9805e40e5f3ab34d32f8091853518672fdbca009411179dbeb2a + checksum: 0e59309a3566057e6529d33954ac2621d979dcbc93f92696df617c89bf7b382576cac43b874cba8b394a16f619d60d25acc6f2c839278c2c50df3ddeacb90e02 languageName: node linkType: hard -"@smithy/config-resolver@npm:^2.0.18": - version: 2.0.18 - resolution: "@smithy/config-resolver@npm:2.0.18" +"@smithy/config-resolver@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/config-resolver@npm:2.1.0" dependencies: - "@smithy/node-config-provider": ^2.1.5 - "@smithy/types": ^2.5.0 - "@smithy/util-config-provider": ^2.0.0 - "@smithy/util-middleware": ^2.0.6 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/types": ^2.9.0 + "@smithy/util-config-provider": ^2.2.0 + "@smithy/util-middleware": ^2.1.0 tslib: ^2.5.0 - checksum: 40d89b243143baf61e2ab7495a97594b33a15ca7b498fc40b04c1b19f754eab95ab840733f6c63e7ac42b282c96d0925d256cdf399c915a0e24e75a7c6258a10 + checksum: 09bda075b007bf08a3253ea257685ade769f70e0735d154c4495469a87ac941efc76501c3a5afecb1209ade4a35db2e4c0ae6c50f71b9970576c7eade8f4b42b languageName: node linkType: hard -"@smithy/credential-provider-imds@npm:^2.0.0, @smithy/credential-provider-imds@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/credential-provider-imds@npm:2.1.1" +"@smithy/core@npm:^1.3.0": + version: 1.3.0 + resolution: "@smithy/core@npm:1.3.0" dependencies: - "@smithy/node-config-provider": ^2.1.5 - "@smithy/property-provider": ^2.0.14 - "@smithy/types": ^2.5.0 - "@smithy/url-parser": ^2.0.13 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/middleware-retry": ^2.1.0 + "@smithy/middleware-serde": ^2.1.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/util-middleware": ^2.1.0 tslib: ^2.5.0 - checksum: 110c4185b39849c9baac6355deac959fbe6ff5bfcaeb6cafd6ff3c30b98fffe618d3b08aa2ef538b8f6f1f84e0f56b7f2d7f60c603967f5410768e8da002f8e9 + checksum: b35792e3915412e15062e561c3de84cd5ffdf3fe6d053460a48843bd97d16af44048e8cede18011b5fec0b12732f7d22feedcae526cd077d18c2a3567e291686 languageName: node linkType: hard -"@smithy/eventstream-codec@npm:^2.0.1, @smithy/eventstream-codec@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/eventstream-codec@npm:2.0.13" +"@smithy/credential-provider-imds@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/credential-provider-imds@npm:2.2.0" + dependencies: + "@smithy/node-config-provider": ^2.2.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/types": ^2.9.0 + "@smithy/url-parser": ^2.1.0 + tslib: ^2.5.0 + checksum: 4c1722f5e541cb64211f8d6cd81298ae6c74a41f93c223f7c8e2b118cf103cdd16e20ff6440c8393aa4f017c619fa8ca691049729f5869b8f9aa852b1b9cb448 + languageName: node + linkType: hard + +"@smithy/eventstream-codec@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/eventstream-codec@npm:2.1.0" dependencies: "@aws-crypto/crc32": 3.0.0 - "@smithy/types": ^2.5.0 - "@smithy/util-hex-encoding": ^2.0.0 + "@smithy/types": ^2.9.0 + "@smithy/util-hex-encoding": ^2.1.0 tslib: ^2.5.0 - checksum: fdae10c869061e6335903d9f0d80dbd0bb9fb5af484c97e5c9490a59ce3d27ca0bba8683149ee2dee7045c84c4d8c014b411611164535bb53936e1fef21ed8bc + checksum: de1f72d3d4146b3c4bb81aa93b423b6cce89a606feeb209c6b181643686cd1832af56ebd632041c8d708e1923f8c779353953b988b437a35ca4a9b57c9c57329 languageName: node linkType: hard -"@smithy/eventstream-serde-browser@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/eventstream-serde-browser@npm:2.0.13" +"@smithy/eventstream-serde-browser@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/eventstream-serde-browser@npm:2.1.0" dependencies: - "@smithy/eventstream-serde-universal": ^2.0.13 - "@smithy/types": ^2.5.0 + "@smithy/eventstream-serde-universal": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 1107de0ed525cd7cc1315693d8b1601da09c66131b808496f0869324e87e9bced2efc06425dc8761756f4ceca24b6ae9ba7d4fca239fcf49d4fcc5aed93f4421 + checksum: 77b2a904ec7562ebd4eb69b960ecf1b134c8e9a676b52804ec7d40703f505d36158390f511f3d5d56ae1991d6f4ac30c4b8c0889e09ffa384f470e573ab838e2 languageName: node linkType: hard -"@smithy/eventstream-serde-config-resolver@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/eventstream-serde-config-resolver@npm:2.0.13" +"@smithy/eventstream-serde-config-resolver@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/eventstream-serde-config-resolver@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 29de012f1224ec5b9079088d55f06315be60729a6455aa1b340f6eac05fe53fd07c785d8f1908bdf8a97aa7fb4142a6ebf6715f479bf09c021680b55050c83bc + checksum: 62b4c7062a775954a76744dd268eeb0504669f81e537245a876851d97ed4187ceb0685fe02bfa73e6e04502f81cb81b4acdf40c8237d7049c7ed8df8c1952ac2 languageName: node linkType: hard -"@smithy/eventstream-serde-node@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/eventstream-serde-node@npm:2.0.13" +"@smithy/eventstream-serde-node@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/eventstream-serde-node@npm:2.1.0" dependencies: - "@smithy/eventstream-serde-universal": ^2.0.13 - "@smithy/types": ^2.5.0 + "@smithy/eventstream-serde-universal": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: c83fdaf2ccc42a4f5f0d153adb37dd409cc78c15c1c73608a39af42219a714e30d9e47c3d80f2da1b810643c1964649b8d115e3a706f43b6401c3aab3b8f322f + checksum: f882576d7a26c8ff3013550a6d8c224ab2a4082fb28fb21edbe4fa80593041e7cad0b86c0c8c1ffcebffda9fd55f63d84ae4f8524984dcb7243afc221ccdd000 languageName: node linkType: hard -"@smithy/eventstream-serde-universal@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/eventstream-serde-universal@npm:2.0.13" +"@smithy/eventstream-serde-universal@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/eventstream-serde-universal@npm:2.1.0" dependencies: - "@smithy/eventstream-codec": ^2.0.13 - "@smithy/types": ^2.5.0 + "@smithy/eventstream-codec": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 138fa619e3ae588438fd962a1a12988c8ec22b330d7cc787be75b5ec7650aa5cabec047c8ef0601545d0614d13803f1ec1f2d185f68bface54ccf643c5055075 + checksum: 206e7c7154a485c5538d970fc95b8b3d0ebbce6be0f02617146ab17b02787e4b424e6ae06cc38397fb9477a6db25b5afff76b4756ba2f736a68fd01154fc9f28 languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^2.2.6": - version: 2.2.6 - resolution: "@smithy/fetch-http-handler@npm:2.2.6" +"@smithy/fetch-http-handler@npm:^2.4.0": + version: 2.4.0 + resolution: "@smithy/fetch-http-handler@npm:2.4.0" dependencies: - "@smithy/protocol-http": ^3.0.9 - "@smithy/querystring-builder": ^2.0.13 - "@smithy/types": ^2.5.0 - "@smithy/util-base64": ^2.0.1 + "@smithy/protocol-http": ^3.1.0 + "@smithy/querystring-builder": ^2.1.0 + "@smithy/types": ^2.9.0 + "@smithy/util-base64": ^2.1.0 tslib: ^2.5.0 - checksum: 2bc59c5bd9ad5ffe72f1a686853444318118a0ac833acf6029114236804480ac3d9a9d41e0d92cea0263a2aa7d76a82dd8b6850ecfea2e4eeed30e1d8225ccc3 + checksum: 1f6165ca546bb274d6111b9819ae7d4969ea79a81e718b41438feae04d2aaee942ef62464c3e6e2999e78f27b977c39c560e06fbb76fb9fda443c2bc77db2a3d languageName: node linkType: hard -"@smithy/hash-blob-browser@npm:^2.0.14": - version: 2.0.14 - resolution: "@smithy/hash-blob-browser@npm:2.0.14" +"@smithy/hash-blob-browser@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/hash-blob-browser@npm:2.1.0" dependencies: - "@smithy/chunked-blob-reader": ^2.0.0 - "@smithy/chunked-blob-reader-native": ^2.0.1 - "@smithy/types": ^2.5.0 + "@smithy/chunked-blob-reader": ^2.1.0 + "@smithy/chunked-blob-reader-native": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: c492891d1854ad2ed9a99dbe815b2e5e9970cef45647c770182be47bb715ddf238fae2865af7e4c3f04ffc4e6ce386fe2a6bc211549b2c3dfa2c0eb7b91924a6 + checksum: c76e9a9393f1fcfa3b567083ea50764f565d01879bb8062da09c8cf403a92867e7e60fdae0d6f82d4df7a684026537efa9e6be7d26245e08ea5ec6bd4680de19 languageName: node linkType: hard -"@smithy/hash-node@npm:^2.0.15": - version: 2.0.15 - resolution: "@smithy/hash-node@npm:2.0.15" +"@smithy/hash-node@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/hash-node@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 - "@smithy/util-buffer-from": ^2.0.0 - "@smithy/util-utf8": ^2.0.2 + "@smithy/types": ^2.9.0 + "@smithy/util-buffer-from": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: c3a2efed56ee6f58811d3a87a6e272a9c5fd82db527ea2c72cfe39401b61417676f2d7f952926be7b51ece134e662a8608a4ff4c2c500eb756a91a41384b716e + checksum: fbeca22f0ce172e16530c6b84ac8452a6fdf965451bfacd7a626dc992ec69696edea7dc95e5e4bc8109ccb905db104d62b023788432df075e5a1a70e976907fa languageName: node linkType: hard -"@smithy/hash-stream-node@npm:^2.0.15": - version: 2.0.15 - resolution: "@smithy/hash-stream-node@npm:2.0.15" +"@smithy/hash-stream-node@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/hash-stream-node@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 - "@smithy/util-utf8": ^2.0.2 + "@smithy/types": ^2.9.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: 9588a91c6cfbe65289632a9d4369b340e949b83552311520e1df95d2f06456f8d11be0c6227eb266c96cbc56b7f9b631d75462616544b38fb160a616244a3996 + checksum: 0f86820521fda9d82b5114630ac69cb0a04ad68158ef02636b3c7bcd46461b9f7ec1bf3c46a1cb34bcac135faf61f94f127913f365f6ee9187928932b4bfaabb languageName: node linkType: hard -"@smithy/invalid-dependency@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/invalid-dependency@npm:2.0.13" +"@smithy/invalid-dependency@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/invalid-dependency@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: f744eb38f5ee77d0b8ef5c57dfabf9befda4626f68808742e8b42754eba05e1def3e2a24e0daf2940b5454f52460af14e871dd8431b0237e87cb300be6704057 + checksum: 72b8f405cc77a0050f46f4ef648322aa5c1a421f25cac282b172f421b20a790809ffd621959e2278d174d6daf6f3c45acc533236fbfbc157a2537aeb88206f26 languageName: node linkType: hard -"@smithy/is-array-buffer@npm:^2.0.0": - version: 2.0.0 - resolution: "@smithy/is-array-buffer@npm:2.0.0" +"@smithy/is-array-buffer@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/is-array-buffer@npm:2.1.0" dependencies: tslib: ^2.5.0 - checksum: 6d101cf509a7818667f42d297894f88f86ef41d3cc9d02eae38bbe5e69b16edf83b8e67eb691964d859a16a4e39db1aad323d83f6ae55ae4512a14ff6406c02d + checksum: cf32161a01a0384b47738bbc58dd6a317e3b5113f411ad141f174cc44e2a9e91f72082bdefa4477dc53c8e3ab6292d1487f26d66fce4f1fe7cc5da4ecde31e11 languageName: node linkType: hard -"@smithy/md5-js@npm:^2.0.15": - version: 2.0.15 - resolution: "@smithy/md5-js@npm:2.0.15" +"@smithy/md5-js@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/md5-js@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 - "@smithy/util-utf8": ^2.0.2 + "@smithy/types": ^2.9.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: d5a40f063629977201bcf72092ed4e2bfea18134ef693721f69823356a878f919ec4b00b621ee078201167e429e1eb79e1d80c26f03b06d7ee999bfbd882788b + checksum: b8d2f24df059e33feff8362fc9c4bdffc6f3e220f5a9c25959ea763d2f92d482ab7fb554164bc846b7d838c398be1fa76147cca616bf3e04c560e31c1cc315d5 languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^2.0.15": - version: 2.0.15 - resolution: "@smithy/middleware-content-length@npm:2.0.15" +"@smithy/middleware-content-length@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/middleware-content-length@npm:2.1.0" dependencies: - "@smithy/protocol-http": ^3.0.9 - "@smithy/types": ^2.5.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: f22a35e175f09b929655eb1445dc0954b2f1580bffc41b91cd01f67bf0e41367e510919f213c239157083b2a25f1aa0b9cc60b1b6832f3e03d4e00ec3228e7cb + checksum: 794a467d1db31015ee0fc3886363b4081b7213268c8ce175647077b2b7485a9a280b00349013b79d5f545476b7818ace85e14428df5b5587bb96219685cc7ebe languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/middleware-endpoint@npm:2.2.0" +"@smithy/middleware-endpoint@npm:^2.4.0": + version: 2.4.0 + resolution: "@smithy/middleware-endpoint@npm:2.4.0" dependencies: - "@smithy/middleware-serde": ^2.0.13 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/shared-ini-file-loader": ^2.2.4 - "@smithy/types": ^2.5.0 - "@smithy/url-parser": ^2.0.13 - "@smithy/util-middleware": ^2.0.6 + "@smithy/middleware-serde": ^2.1.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/url-parser": ^2.1.0 + "@smithy/util-middleware": ^2.1.0 tslib: ^2.5.0 - checksum: 2cf37d0859b2bb24deeca9e9907be38f120be56967970c0adbb443a9e126fd9889012b2d871df1fa1a1b2367f80b097f3f152d6bf8e4fdaf01fc6c714a1cc963 + checksum: 0ff6c10d5ddeef3add524c1b4fbe155aeaf6aeeff9c714111236bc5ad76f8459ec82dc9bd07355a63ef509ffb51173514d268d83b89eb75537976722400e7786 languageName: node linkType: hard -"@smithy/middleware-retry@npm:^2.0.20": - version: 2.0.20 - resolution: "@smithy/middleware-retry@npm:2.0.20" +"@smithy/middleware-retry@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/middleware-retry@npm:2.1.0" dependencies: - "@smithy/node-config-provider": ^2.1.5 - "@smithy/protocol-http": ^3.0.9 - "@smithy/service-error-classification": ^2.0.6 - "@smithy/types": ^2.5.0 - "@smithy/util-middleware": ^2.0.6 - "@smithy/util-retry": ^2.0.6 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/service-error-classification": ^2.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/util-middleware": ^2.1.0 + "@smithy/util-retry": ^2.1.0 tslib: ^2.5.0 uuid: ^8.3.2 - checksum: 8b76aaeba90dd80409a615f5c866ae8490b537bcc21c0bb5371026a891b7c74ac0a1647175bd1752b2c3d6a1b443eddddf2dc093b24da585d924e957dea18113 + checksum: 4ac9dacd7295f31378d8828810e44f7f7c526761010cef0e5cbd602cdc7306906a42e57b7d06e5e31e100f2cf9a3d73398d6350e9dc502b3375a2182608dbb16 languageName: node linkType: hard -"@smithy/middleware-serde@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/middleware-serde@npm:2.0.13" +"@smithy/middleware-serde@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/middleware-serde@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 549bdc9d2a79ee746572d631c0f10f700fa251a46ca289271ce1904027b483ac617f2e01c43b3f7f202395588f6607f436b32930318a83ecd6004a0b869ccf09 + checksum: d225f8bd960a1586219c53926ec33ae06f868f558ccc1777850abd160fb1d179ca4d4838c67032e8ea5cc8491e721b1317d14f040ffe735a6b0515e6847eda1c languageName: node linkType: hard -"@smithy/middleware-stack@npm:^2.0.7": - version: 2.0.7 - resolution: "@smithy/middleware-stack@npm:2.0.7" +"@smithy/middleware-stack@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/middleware-stack@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 46405edb32290c1d6e291352a943687afcdacbaea413494f86b61b99b7a85ffc8f8f5aaf58f14ecc3c7cd80535231047d748e5d9ee3c38cd1b02c20daea938aa + checksum: 160abf4bd8ad0799f25053054585b6da987373f1352649f215a496d007a8c2ffed9cb1f2fde7219dcf8dc6883952be63d547f7b6cfcab45db61e645ff6d4bebb languageName: node linkType: hard -"@smithy/node-config-provider@npm:^2.1.5": - version: 2.1.5 - resolution: "@smithy/node-config-provider@npm:2.1.5" +"@smithy/node-config-provider@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/node-config-provider@npm:2.2.0" dependencies: - "@smithy/property-provider": ^2.0.14 - "@smithy/shared-ini-file-loader": ^2.2.4 - "@smithy/types": ^2.5.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/shared-ini-file-loader": ^2.3.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 813a0b0fa9758cc181074e1b3c1d7d3a9598e7bbbbed5da24eb38ec3053a8c00d675ee293d245d84cb601ade2e83e3faa054e68131307973419f93828abeb780 + checksum: d46a83f51e7186bdc80404df260e676979f5f576ad6e958ee59a24feeb0ac661558646d772991e70bef63398c24e4cf0dfea38cd76935860aaab9c7d61e4d234 languageName: node linkType: hard -"@smithy/node-http-handler@npm:^2.1.7, @smithy/node-http-handler@npm:^2.1.9": - version: 2.1.10 - resolution: "@smithy/node-http-handler@npm:2.1.10" +"@smithy/node-http-handler@npm:^2.1.7, @smithy/node-http-handler@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/node-http-handler@npm:2.3.0" dependencies: - "@smithy/abort-controller": ^2.0.14 - "@smithy/protocol-http": ^3.0.10 - "@smithy/querystring-builder": ^2.0.14 - "@smithy/types": ^2.6.0 + "@smithy/abort-controller": ^2.1.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/querystring-builder": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: b24a3d2ebf87458f92274ba099af05a1a8d933d8df3767ab5d3baf273890c1cfd4be291b06b5323e5119898ba07e88a1f257b8970f7e75fc8944b7071090fa55 + checksum: 8f431d7fa4e07908ecfd58d13721b5adc41519415e9ea58d104ab44da008c0244fd551a6fddc27e9bac1ca8ba98d3f117b37c379c096e5038ff70b723466dce6 languageName: node linkType: hard -"@smithy/property-provider@npm:^2.0.0, @smithy/property-provider@npm:^2.0.14": - version: 2.0.14 - resolution: "@smithy/property-provider@npm:2.0.14" +"@smithy/property-provider@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/property-provider@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 44cd1b4eeb07be4b88c6a2e8a1f4cd6b56e40f1f457b64f596fc2f46ce7c4991230b0c9654cb4489f93897678b81457a1cac104f566d9856cfbc92a66efa1a2e + checksum: abeceb40091e121bdbc4788af8c4664d4b624a5a3ffe17185cbe29c21deb785b9788dfec70bb552d82422ab566f4c8aed0b7697d50abc8bf76e498ad929e49a5 languageName: node linkType: hard -"@smithy/protocol-http@npm:^3.0.10, @smithy/protocol-http@npm:^3.0.9": - version: 3.0.10 - resolution: "@smithy/protocol-http@npm:3.0.10" +"@smithy/protocol-http@npm:^3.1.0": + version: 3.1.0 + resolution: "@smithy/protocol-http@npm:3.1.0" dependencies: - "@smithy/types": ^2.6.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 77bda5c76e00e0fee6a0654d10a0127287402484522dcdcb0eda84a6be196304301a68d263ba27639fb288dbcbb891bfa3efa50a24ea9a9878915a0e1ddc8620 + checksum: 3aae910192708bfd5cc3de85dc28c2eb7f6b425d6edc2b930f769330bc4912f8e7ff2a5dc8b9dd98614d1f9fa8d4f64a9f9eb45e54c4da94e29612accc3218fc languageName: node linkType: hard -"@smithy/querystring-builder@npm:^2.0.13, @smithy/querystring-builder@npm:^2.0.14": - version: 2.0.14 - resolution: "@smithy/querystring-builder@npm:2.0.14" +"@smithy/querystring-builder@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/querystring-builder@npm:2.1.0" dependencies: - "@smithy/types": ^2.6.0 - "@smithy/util-uri-escape": ^2.0.0 + "@smithy/types": ^2.9.0 + "@smithy/util-uri-escape": ^2.1.0 tslib: ^2.5.0 - checksum: e1287709055abd016b214e4cede9d976a63aa73aff8f3092db60a0fe7e103f7a1294bdedf39a7bbea4b2bf1b959682cbcf8e078ca0489a8a58b8b5706679b55d + checksum: 307cfec9c5765b9aca10318913cd91513d323895d9cfb863309b49fe634dfdb3ebf74ef3dc17e3d4aa60d1c4e8f48a63cfd11c2b2099b36cd4d9f53198e933a0 languageName: node linkType: hard -"@smithy/querystring-parser@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/querystring-parser@npm:2.0.13" +"@smithy/querystring-parser@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/querystring-parser@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: aaaa21dcdaa44d5d3d734512e3fe8591fff9713dc32da129aa836d938f5469286952eba997adc68fb2f9d8655b0e02a4bba7a6163ff22f799880c913b74396dd + checksum: 59c149d9654712066496c4685ab1ebf1ca792dd05de8bb88cdd512a2408b2c62cd618a3d3aab1eae2a74eb5b6da3649ef68b01e67b1c4838fe6881dc25e73775 languageName: node linkType: hard -"@smithy/service-error-classification@npm:^2.0.6": - version: 2.0.6 - resolution: "@smithy/service-error-classification@npm:2.0.6" +"@smithy/service-error-classification@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/service-error-classification@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 - checksum: 07be989a2d3e17e14f8c7824bf9342632ec5ed1e4e0b4f2d242442f49a50058db5cbb7b8419b684126bf5c4ba08f6bce3360f43d73bd2def15771a1af7c1c95f + "@smithy/types": ^2.9.0 + checksum: 3889559eea95d96175b701d968d2b40409c0abee7de7434e6e9ebf4d5d1ecf90bda0cbf62b9768b787f0d18e39e729bc8d67bd6b1537df253cb854b263a96dc6 languageName: node linkType: hard -"@smithy/shared-ini-file-loader@npm:^2.0.6, @smithy/shared-ini-file-loader@npm:^2.2.4": - version: 2.2.4 - resolution: "@smithy/shared-ini-file-loader@npm:2.2.4" +"@smithy/shared-ini-file-loader@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/shared-ini-file-loader@npm:2.3.0" dependencies: - "@smithy/types": ^2.5.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 790cc9c1e0d39ec179fcb97f612205770112ed14fa6626b2dee81ef140d6fa0d89a87825ccddda35475f9de9e6b8b70228565b2ed90c1487de20b603cc79505a + checksum: ea2855ef47df8711b89623f74e84151ced3716fd0255310071e67e8d1a303e0b1a9aa86a72cc7216ad82a162f37b019c639e5a7c5b4a8462499fa4def7e40bdb languageName: node linkType: hard -"@smithy/signature-v4@npm:^2.0.0": - version: 2.0.1 - resolution: "@smithy/signature-v4@npm:2.0.1" +"@smithy/signature-v4@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/signature-v4@npm:2.1.0" dependencies: - "@smithy/eventstream-codec": ^2.0.1 - "@smithy/is-array-buffer": ^2.0.0 - "@smithy/types": ^2.0.2 - "@smithy/util-hex-encoding": ^2.0.0 - "@smithy/util-middleware": ^2.0.0 - "@smithy/util-uri-escape": ^2.0.0 - "@smithy/util-utf8": ^2.0.0 + "@smithy/eventstream-codec": ^2.1.0 + "@smithy/is-array-buffer": ^2.1.0 + "@smithy/types": ^2.9.0 + "@smithy/util-hex-encoding": ^2.1.0 + "@smithy/util-middleware": ^2.1.0 + "@smithy/util-uri-escape": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: 2c4bc499251dfbdbea0359fc5196002ac805df7f6f87d7cba36164d8fcd16a749a3c1a52259569134628511dc496724d5e76744c1c39fee3a3f42c5fbfe3749b + checksum: 3e2fa005930f8228b9480087f4eeacbf36200e268c760890182e21ae4035b5e02e9d10bc6d9f9ae0bc257b02cadadb522afdf1f3bddf3c2d61c3e3796f90e8ca languageName: node linkType: hard -"@smithy/smithy-client@npm:^2.1.15": - version: 2.1.15 - resolution: "@smithy/smithy-client@npm:2.1.15" +"@smithy/smithy-client@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/smithy-client@npm:2.3.0" dependencies: - "@smithy/middleware-stack": ^2.0.7 - "@smithy/types": ^2.5.0 - "@smithy/util-stream": ^2.0.20 + "@smithy/middleware-endpoint": ^2.4.0 + "@smithy/middleware-stack": ^2.1.0 + "@smithy/protocol-http": ^3.1.0 + "@smithy/types": ^2.9.0 + "@smithy/util-stream": ^2.1.0 tslib: ^2.5.0 - checksum: ad9aa105748866f22147d5e357759edd4cc4e263269b50ad4d9d2f4ec211297d90bd768cd4f182eb8230a32134166b38532b24a8884589e75c417a6e964eaa6d + checksum: ed101b2b8cb4c439fb7e0e37d399317e599b8ea9cef267da5491c63797d85f82b42675a4e69e2795ad984a7ef00f87c56276a755155e11fc6f5c56f41b6b813a languageName: node linkType: hard @@ -15814,185 +15738,185 @@ __metadata: languageName: node linkType: hard -"@smithy/types@npm:^2.0.2, @smithy/types@npm:^2.5.0, @smithy/types@npm:^2.6.0": - version: 2.6.0 - resolution: "@smithy/types@npm:2.6.0" +"@smithy/types@npm:^2.9.0": + version: 2.9.0 + resolution: "@smithy/types@npm:2.9.0" dependencies: tslib: ^2.5.0 - checksum: 9233d1e6e414a8b807f9fe7a7c30064626f77b0242d8634b9b1c192f77b27a997a3caf90ecf7f4361d5926c9e9cc761991eecfb47bbfa6ce2be21c5533a3bea6 + checksum: 74d59ddcc2eca419c493b99d09f912e72511d088df0c6b6548df876dd49407b3cbb68550c9d6fa1d03d65f96bb099c450bdad1b4724d52144ca65f547850a4bb languageName: node linkType: hard -"@smithy/url-parser@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/url-parser@npm:2.0.13" - dependencies: - "@smithy/querystring-parser": ^2.0.13 - "@smithy/types": ^2.5.0 - tslib: ^2.5.0 - checksum: 96b64d0740aa8ce365316a361f5549c55fee92218e6d5673750ce8036bb68a9c200f2a39a945e548815c5206a5f28cb0022155e60d357fbb4a6bb41381d4b622 - languageName: node - linkType: hard - -"@smithy/util-base64@npm:^2.0.1": - version: 2.0.1 - resolution: "@smithy/util-base64@npm:2.0.1" - dependencies: - "@smithy/util-buffer-from": ^2.0.0 - tslib: ^2.5.0 - checksum: 6320916b50a0f4048462564cbc413e619ee02747e188463721670ce554d0b1652517068a1aa066209101a2185b4f3d13afd0c173aac99c461ca685a1fa15f934 - languageName: node - linkType: hard - -"@smithy/util-body-length-browser@npm:^2.0.0": - version: 2.0.0 - resolution: "@smithy/util-body-length-browser@npm:2.0.0" - dependencies: - tslib: ^2.5.0 - checksum: 4bccdd857bd24c9dcb6e9f2d5be03d59415f9a94d660ec7b3efb45e9aa04017f34c387368f176f24233a071af3b7a2b5f8236a2f5a83bfc884d24dfcc341e836 - languageName: node - linkType: hard - -"@smithy/util-body-length-node@npm:^2.1.0": +"@smithy/url-parser@npm:^2.1.0": version: 2.1.0 - resolution: "@smithy/util-body-length-node@npm:2.1.0" + resolution: "@smithy/url-parser@npm:2.1.0" dependencies: + "@smithy/querystring-parser": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: e4635251898f12e1825f2848e0b7cc9d01ec6635b3f1f71b790734bb702b88e795f6c539d42d95472dad00e50e9ff13fcf396791092b131e5834069cb8f52ed0 + checksum: e61ee1d7a3357f02f8f0d8364de3d2798134b0b5c686e3ab12917352feff5e445d0b8b16237f2c5444a9e48c8df57e8ca91770b29d804f8f469d6bdbc7498f97 languageName: node linkType: hard -"@smithy/util-buffer-from@npm:^2.0.0": - version: 2.0.0 - resolution: "@smithy/util-buffer-from@npm:2.0.0" +"@smithy/util-base64@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-base64@npm:2.1.0" dependencies: - "@smithy/is-array-buffer": ^2.0.0 + "@smithy/util-buffer-from": ^2.1.0 tslib: ^2.5.0 - checksum: d33cbf3e488d23390c88705ddae71b08de7a87b6453e38b508cd37a22a02e8b5be9f0cd46c1347b496c3977a815a7399b18840544ecdc4cce8cf3dcd0f5bb009 + checksum: 76a58830c82c4400374eddc09cd38f3f62f14f0d42295dfb468ed7cfc3928a7093c2879c01ed2e8c858f0bab47710a0514deb8da754d640b94a70281bec87315 languageName: node linkType: hard -"@smithy/util-config-provider@npm:^2.0.0": - version: 2.0.0 - resolution: "@smithy/util-config-provider@npm:2.0.0" +"@smithy/util-body-length-browser@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-body-length-browser@npm:2.1.0" dependencies: tslib: ^2.5.0 - checksum: cdc34db5b42658a7c98652ddb2e35b31e0d76f22a051d71724927999a53467fb38fe6dcf228585544bc168cbd54ded3913e14cbc33c947d3c8a45ca518a9b7b0 + checksum: ca37935d801ae4812e39c70e54651aaa029ad0bb6720a3529d9a0367a64316e892683805b25a36981126f458a3d3f5633be4f9b9e8de2a7293b8ea08bfd8607a languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^2.0.19": - version: 2.0.19 - resolution: "@smithy/util-defaults-mode-browser@npm:2.0.19" +"@smithy/util-body-length-node@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-body-length-node@npm:2.2.0" dependencies: - "@smithy/property-provider": ^2.0.14 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 + tslib: ^2.5.0 + checksum: a2ada7daeb31147675b66f0a95cd24ed10ee800211ddde34b1bbbd0a2bfbfdc82efbc8fe2c9bf4e18a67e7112aaf432f381a32e19be06735c8f4e0c3eec1a4a5 + languageName: node + linkType: hard + +"@smithy/util-buffer-from@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-buffer-from@npm:2.1.0" + dependencies: + "@smithy/is-array-buffer": ^2.1.0 + tslib: ^2.5.0 + checksum: 0e90dd3f324eae8863377d11f88cbdabf22aa29f5cb365bda8c5a23f24bbc2671c314aefccfab33e048fbeb18c939228bb43a5f0dc719fed71d484142ef3aaf5 + languageName: node + linkType: hard + +"@smithy/util-config-provider@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-config-provider@npm:2.2.0" + dependencies: + tslib: ^2.5.0 + checksum: ec61ff7f2f89c7c7c621141b9e19e8a5fa3c05041632d9b894b28b7d8bae9231271a61acfce19737bde0efce186062fa03cc05e4a006d96ea5c35ecf8a7e7e8d + languageName: node + linkType: hard + +"@smithy/util-defaults-mode-browser@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-defaults-mode-browser@npm:2.1.0" + dependencies: + "@smithy/property-provider": ^2.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 bowser: ^2.11.0 tslib: ^2.5.0 - checksum: 13b1f9fed2a9bbb9f755b192e1ddaccdb5624f104f89c0f0404c48ad1eafb006733f9b930692e50261c8479821cdcce08cfb71771ea5c0d112638bd4d23ba24d + checksum: 55a5cf94ddeb573b959265609e3854bdca62d9c1460a9d12b765266d6a8bdba8485a8beb765495755ffb32df1cc78b97c8f4f1c2b3556f073cd988b278e07b4f languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^2.0.25": - version: 2.0.25 - resolution: "@smithy/util-defaults-mode-node@npm:2.0.25" +"@smithy/util-defaults-mode-node@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-defaults-mode-node@npm:2.1.0" dependencies: - "@smithy/config-resolver": ^2.0.18 - "@smithy/credential-provider-imds": ^2.1.1 - "@smithy/node-config-provider": ^2.1.5 - "@smithy/property-provider": ^2.0.14 - "@smithy/smithy-client": ^2.1.15 - "@smithy/types": ^2.5.0 + "@smithy/config-resolver": ^2.1.0 + "@smithy/credential-provider-imds": ^2.2.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/property-provider": ^2.1.0 + "@smithy/smithy-client": ^2.3.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 8e82f7f0c4260475e172f5baaf449155150c7d5ccb7939ccee3a061831b58998c55046cfd89761c06e43637e3e50805ca38277c5410f59b0906323e748285b80 + checksum: 4f244dc6d85c356f0e83296d75a57179ec4ce16001d26169a93d3d449a0be0748495309db96f4425dbd0ecf85d00a46be6a5869c14d1b3083d393efd9fef5edf languageName: node linkType: hard -"@smithy/util-endpoints@npm:^1.0.4": - version: 1.0.4 - resolution: "@smithy/util-endpoints@npm:1.0.4" +"@smithy/util-endpoints@npm:^1.1.0": + version: 1.1.0 + resolution: "@smithy/util-endpoints@npm:1.1.0" dependencies: - "@smithy/node-config-provider": ^2.1.5 - "@smithy/types": ^2.5.0 + "@smithy/node-config-provider": ^2.2.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 8c121070c0207b728e498a9d0b6082fcc83098b0ab33fde9b0b2db1bef724affc8712d9ae251bc155f595b7ca61a61529b519597c549808129d51bfdef9ad119 + checksum: ab646e2a8779e5901ff8be43744516ef413514efc9b42c82cea0461c9ee9b25b44709666b1504124d98c3512e93e5b24e532b0cade7031e4ea2ad7c3a752b306 languageName: node linkType: hard -"@smithy/util-hex-encoding@npm:^2.0.0": - version: 2.0.0 - resolution: "@smithy/util-hex-encoding@npm:2.0.0" +"@smithy/util-hex-encoding@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-hex-encoding@npm:2.1.0" dependencies: tslib: ^2.5.0 - checksum: 884373e089d909e3c9805bdb78f367d1f3612e4e1e6d8f0263cc82a8b9689eddc0bc80b8b58aa711bd5b48d9cb124f9996906c172e951c9dac78984459e831cf + checksum: 6a86bd3c7429b1762300a500d86b17a20499d9364c14c7e08aba49db3ee98b08dfa576513bbbd0cfed466807e04b6d71ff4922e71b89e59a79f0ffe482691364 languageName: node linkType: hard -"@smithy/util-middleware@npm:^2.0.0, @smithy/util-middleware@npm:^2.0.6": - version: 2.0.6 - resolution: "@smithy/util-middleware@npm:2.0.6" +"@smithy/util-middleware@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-middleware@npm:2.1.0" dependencies: - "@smithy/types": ^2.5.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: bf31193bbd08691c23e18da069fe95e2e989fcfde87133d183d469dc6e34d76918d56d68f5e5ff15d4f58575e7426ca6f952d248e51421739a2968c51e42e5b7 + checksum: 5b64efb80ad8f0855fd313812ea083a601d78e219898bab467fbfda50a8f7e1ee8399b895ca8c797c4becc8edc701d3ee976b9ae7b57b7b126ae69fc926574ac languageName: node linkType: hard -"@smithy/util-retry@npm:^2.0.6": - version: 2.0.6 - resolution: "@smithy/util-retry@npm:2.0.6" +"@smithy/util-retry@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-retry@npm:2.1.0" dependencies: - "@smithy/service-error-classification": ^2.0.6 - "@smithy/types": ^2.5.0 + "@smithy/service-error-classification": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: c37d163f83981ca58c7d924b178a09e18abc915ffb5efb20fcc4e662ad909938296fd295244ed84a209e84e56d66a629a9eba655306ca401c1a3b91c4433ff22 + checksum: 944ea383095357b2f4892849b2be05502183b5a07f825ca4012366e0e878dd9f478e774f1b413dc4190d38ae15e5cf3e26f484670f6b793488c07ccdaaa5e129 languageName: node linkType: hard -"@smithy/util-stream@npm:^2.0.20": - version: 2.0.20 - resolution: "@smithy/util-stream@npm:2.0.20" +"@smithy/util-stream@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-stream@npm:2.1.0" dependencies: - "@smithy/fetch-http-handler": ^2.2.6 - "@smithy/node-http-handler": ^2.1.9 - "@smithy/types": ^2.5.0 - "@smithy/util-base64": ^2.0.1 - "@smithy/util-buffer-from": ^2.0.0 - "@smithy/util-hex-encoding": ^2.0.0 - "@smithy/util-utf8": ^2.0.2 + "@smithy/fetch-http-handler": ^2.4.0 + "@smithy/node-http-handler": ^2.3.0 + "@smithy/types": ^2.9.0 + "@smithy/util-base64": ^2.1.0 + "@smithy/util-buffer-from": ^2.1.0 + "@smithy/util-hex-encoding": ^2.1.0 + "@smithy/util-utf8": ^2.1.0 tslib: ^2.5.0 - checksum: 24aeaa4cbb69c1faecf35a5c15631beae92742b0deb140fd565053aa995bd5587fef3150e58cc87d16896bf35ebefd5afcc894daee0dde4d44deafd4a158ff22 + checksum: 41a4929ba5fd0dec38bbd859f1ef8d4fc244dc0ce8fcc897ae450e1b22e949b12c8d972120066055e03757702494241d9cd65cfdaa35f977cf3a513248bd52b6 languageName: node linkType: hard -"@smithy/util-uri-escape@npm:^2.0.0": - version: 2.0.0 - resolution: "@smithy/util-uri-escape@npm:2.0.0" +"@smithy/util-uri-escape@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-uri-escape@npm:2.1.0" dependencies: tslib: ^2.5.0 - checksum: d201cee524ece997c406902463b5ea0b72599994f7b3ac1d923d5645497e9ef93126d146016f13dd4afafe33b9a3e92faf4e023cf0af510b270c1b9ce3d78da8 + checksum: 11aca3e04a57428266fdb09f408f21bb51d5fa0b6b31ceb5769a63c670ad8f24c95bcbc1d6046d625b7992293e86f46207d1018233130e9f4c4e97d236ff9cd8 languageName: node linkType: hard -"@smithy/util-utf8@npm:^2.0.0, @smithy/util-utf8@npm:^2.0.2": - version: 2.0.2 - resolution: "@smithy/util-utf8@npm:2.0.2" +"@smithy/util-utf8@npm:^2.0.0, @smithy/util-utf8@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-utf8@npm:2.1.0" dependencies: - "@smithy/util-buffer-from": ^2.0.0 + "@smithy/util-buffer-from": ^2.1.0 tslib: ^2.5.0 - checksum: e38fd6324ca2858f76fb6fce427c03faec599213acf95a5b18eb77b72cdf9327bd688e5a260dbccc0f512ea5426422ed200122a9542c00b14a6d9becc3f84c79 + checksum: eb33393c3e83262418f9a08ed7dc3dd3895c281a4a38b03fca9a2686b67b64db7ba657287da0201d9083d41a4528be39ff8b9ab7bd5b9b9b2ce4d1c3a144c7bc languageName: node linkType: hard -"@smithy/util-waiter@npm:^2.0.13": - version: 2.0.13 - resolution: "@smithy/util-waiter@npm:2.0.13" +"@smithy/util-waiter@npm:^2.1.0": + version: 2.1.0 + resolution: "@smithy/util-waiter@npm:2.1.0" dependencies: - "@smithy/abort-controller": ^2.0.13 - "@smithy/types": ^2.5.0 + "@smithy/abort-controller": ^2.1.0 + "@smithy/types": ^2.9.0 tslib: ^2.5.0 - checksum: 1325887f9002b9f08c5cfcabcf35ce4488b4c2d009333955a166b27aa40b149a19f8359fdd8b265995409f64686bfb3aa02eb7bc18aea15aaa8d309d640107a5 + checksum: 1b861e2eec1848afcca08c13dac3a32b02187f9958f26d79cb5805ba140fca228268c54f7122fae1b74c4000a70fccad4aad61f21ec02acfa4e9511eebecc31e languageName: node linkType: hard @@ -16277,12 +16201,12 @@ __metadata: linkType: hard "@stoplight/types@npm:^14.0.0": - version: 14.0.0 - resolution: "@stoplight/types@npm:14.0.0" + version: 14.1.1 + resolution: "@stoplight/types@npm:14.1.1" dependencies: "@types/json-schema": ^7.0.4 utility-types: ^3.10.0 - checksum: 462fb6c718a2679927421ca1fffb5e31be2d150130e95a2771ffba04f68fc0e0f8ef3d4ae050e63fd4044bc4103e2ea82c98e1f5c7ff192a78914838eb250e5e + checksum: 1da2e683e88afe2f72c3b3af341537bc9bac153d224f65744ca60d44eade93609ce91172064ae27093e1ebfa7bcbf05fb232a1910d83b2aee5b1eed4bb726200 languageName: node linkType: hard @@ -16499,406 +16423,452 @@ __metadata: languageName: node linkType: hard -"@swagger-api/apidom-ast@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-ast@npm:0.83.0" +"@swagger-api/apidom-ast@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-ast@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-error": ^0.83.0 + "@swagger-api/apidom-error": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 unraw: ^3.0.0 - checksum: 7449e1c3eb316920e277d773a3504af9379ade513836342a55817888c73ad65bf08c6c11222fbd9f6862108ab3fad3d2ce2dfa7ab4f9acf48a3134f27f057f87 + checksum: 11770246944b3bb5964a88e71a7e32e37691b7a3b6ec9ae6acf58cd580571ca75c079d749bb952cd08c86be2155cbef3ed418ad6194681e1e2fea643a2128af2 languageName: node linkType: hard -"@swagger-api/apidom-core@npm:>=0.83.0 <1.0.0, @swagger-api/apidom-core@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-core@npm:0.83.0" +"@swagger-api/apidom-core@npm:>=0.90.0 <1.0.0, @swagger-api/apidom-core@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-core@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-ast": ^0.83.0 - "@swagger-api/apidom-error": ^0.83.0 + "@swagger-api/apidom-ast": ^0.92.0 + "@swagger-api/apidom-error": ^0.92.0 "@types/ramda": ~0.29.6 minim: ~0.23.8 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 short-unique-id: ^5.0.2 stampit: ^4.3.2 - checksum: acbdd94eabb7ad44ba5c7c1e69a831bd5b53aca6f4e66abb66ad5e8d53717cb453a5885c51008b6a7b5f7e16de8660a1b5652a4498883c84d37cb62b093e3e91 + checksum: e02f1a838ab1d811960a48f98922c66bb306f1a5a1a154b8fe4c6445fb0a20c671409fee14a2e49051387bc7b5c28e218161bcc1519c6ad9cbc767bf432ee05d languageName: node linkType: hard -"@swagger-api/apidom-error@npm:>=0.83.0 <1.0.0, @swagger-api/apidom-error@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-error@npm:0.83.0" +"@swagger-api/apidom-error@npm:>=0.90.0 <1.0.0, @swagger-api/apidom-error@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-error@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - checksum: 94fee6b4ee4a60a7d121d17c92808bec452bd7c638c3ecceda6fc427f47a0297e78a2366a37c7216b84b4a95aead825eb421356fa17dc67dd44da86e27660d1c + checksum: bdd3051a47f4300344c0f1f2a55c4bb3dbe147ba8ebd27c94a77db2c90e8cc371bca63b72dfb49d0034794b82929edbf70d20ab33f59ba9f8c2d2fc8dc0430db languageName: node linkType: hard -"@swagger-api/apidom-json-pointer@npm:>=0.83.0 <1.0.0, @swagger-api/apidom-json-pointer@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-json-pointer@npm:0.83.0" +"@swagger-api/apidom-json-pointer@npm:>=0.90.0 <1.0.0, @swagger-api/apidom-json-pointer@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-json-pointer@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-error": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-error": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: b48d784f18a8d8e948292c1126a0b768a0df347d31b6b1e4fa28df64ceb83cbb5d465a80fc87e127529e339000eb97d28f7c4d632af47db3dbe7eeb92f9477c1 + checksum: 89d748fd1f52fce381d4e07710244d94c4d9f8a20411ca8bcfb33e7ec515432c7766660b296a9c603fa6b861b39eca4917151f98f3688f1bdcf10f25f9d90134 languageName: node linkType: hard -"@swagger-api/apidom-ns-api-design-systems@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-ns-api-design-systems@npm:0.83.0" +"@swagger-api/apidom-ns-api-design-systems@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-ns-api-design-systems@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-error": ^0.83.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: 711a533d1a386e296525bbb131948e24ca548ee0d4de67acd8ae9f37097fef5801d82887eecdb9a45f954fb10c30666634fa78edb2e09d061beaab8dde47da35 + checksum: 8e993f6b8cd37cb9857a34437e2b16e087ccce524373726a167bf98ab622c44a03c47c81e218ff4b00aa7bd973a25bd696e2437c5fd018ace09ba2ad0fcda9de languageName: node linkType: hard -"@swagger-api/apidom-ns-asyncapi-2@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:0.83.0" +"@swagger-api/apidom-ns-asyncapi-2@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-json-schema-draft-7": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-json-schema-draft-7": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: 0c7e6bc35c2b5e46bd08922309cd494133302ce3b6b8d0cbfbfb99106ea7c1e160ca4ab11f21161598c532c86fafa9127320e5b561560a01e51ceef9d545e767 + checksum: bef3de2c2a854590c8bb1cd892a5b170b65e14119a97528652457bf1e3e19f4a05d7da41ddb697f64de9972c8fad8afc7e6ccfa97ce8809fc9eba8c1305d509c languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-4@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:0.83.0" +"@swagger-api/apidom-ns-json-schema-draft-4@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-ast": ^0.83.0 - "@swagger-api/apidom-core": ^0.83.0 + "@swagger-api/apidom-ast": ^0.92.0 + "@swagger-api/apidom-core": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: 7fb5db60a95d3531b9fb38693a0b758a8bb3e946f7e7f4e202eaef093cdd53c6289031c8b8977e8548c6376b8e41a627827b64e2c9f5de2f63fc3a427e2f670b + checksum: 6b0d57acf1c34df314c401ab25d0feb3ad5638fc8c848f6b84c76691fef177a39a9e8ebfa16309d22c764d9bfb292ed5ad39943b2cece67dde746a6e9d5fdc12 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-6@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:0.83.0" +"@swagger-api/apidom-ns-json-schema-draft-6@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-error": ^0.83.0 - "@swagger-api/apidom-ns-json-schema-draft-4": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-ns-json-schema-draft-4": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: 60d3d359bf0e8054bad013fb2d7bd4c020d4fb0ce6819538b47986ea7f89269af5f1c3b65c7ddb864bc502a7c41e6069c042a9be753cd9d47dc13b9d0572d216 + checksum: 5660459753ff1359527e61820db59a6465ecc8b51cc5a6c14e155b2144b67570c6fc2c7c41d97617470d1478b85e26879fadc3f1ff4460c6309411c13db209e6 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-7@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:0.83.0" +"@swagger-api/apidom-ns-json-schema-draft-7@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-error": ^0.83.0 - "@swagger-api/apidom-ns-json-schema-draft-6": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-ns-json-schema-draft-6": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: 01623f0c65795d1022e903d39858caac018f9fe338049247ea668805e1926d05713faae9f8ea43188e465a1e2f6783a5e3b38036965b56859036a16d8deb3b86 + checksum: 838d2b9917b4086880156e895d67adfd6400236e97b2a75814356dc55b0d45afd3e458bfe97b52af39aeea4c3483fc40f7a1551af14285977009513a168fb87c languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-2@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-ns-openapi-2@npm:0.83.0" +"@swagger-api/apidom-ns-openapi-2@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-ns-openapi-2@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-error": ^0.83.0 - "@swagger-api/apidom-ns-json-schema-draft-4": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-ns-json-schema-draft-4": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: 078b138517b0c0dffa67186f2a23938ba87c98c9dd98d431ff812a8be45b3b711e22749b62e22ccd70d4615a92c0ca442b793386fe201583aa8c52556260b082 + checksum: 154de0b299a3ff0fcac40cf995dafb8c173cb4e294c75f952a9fa9cd5452eaab7783a9e5abb425fbc6e7135466155645e9b96fa9495f3effa7aec18f3152e6c3 languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-3-0@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:0.83.0" +"@swagger-api/apidom-ns-openapi-3-0@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-error": ^0.83.0 - "@swagger-api/apidom-ns-json-schema-draft-4": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-ns-json-schema-draft-4": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: dabe0745da3c4a3e719f1d9d7d3fbcd177c3735ec00ad762414ed6d9d82eed43b0897896d48e3b8690186029b952146b8bfcab2406d91797e6a9f81f451c51f3 + checksum: 9ae883feea63c06f2514ba834b637bd00d6a56c35fe9b875507698d991199202d307a90bd06ebeaeb5642e3e42fe54238249858568c8a61a1797792fa5fff259 languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-3-1@npm:>=0.83.0 <1.0.0, @swagger-api/apidom-ns-openapi-3-1@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:0.83.0" +"@swagger-api/apidom-ns-openapi-3-1@npm:>=0.90.0 <1.0.0, @swagger-api/apidom-ns-openapi-3-1@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-ast": ^0.83.0 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.83.0 + "@swagger-api/apidom-ast": ^0.92.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 - checksum: 499818a4e437017f7a7ca8861dc1b8e90ba8bb8c300a1f2754bb7b2b05f95e0e897f6305bec1aa5c5af0f03c94e541660a412da25467091bcf35847cc2ee6a4c + checksum: 316861ccd563d28c46039fa4202337f2266e0b99bf803bc71f64d307d824a74dcf7e4cdf7fc4ac25d6cf3521aebc74938c2001eb74ef0c364bc02470a1ffc723 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:0.83.0" +"@swagger-api/apidom-ns-workflows-1@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-ns-workflows-1@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-api-design-systems": ^0.83.0 - "@swagger-api/apidom-parser-adapter-json": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 + ramda-adjunct: ^4.1.1 + stampit: ^4.3.2 + checksum: 684804790b58b52a28ae10ffc7fc2fa5bf6b99d8cb3e5d9409e28325c4d4b9ce5b5cc10e0cc401fb21788753ea65287e33db79337388afccd54f6902f60d9159 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:0.92.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-api-design-systems": ^0.92.0 + "@swagger-api/apidom-parser-adapter-json": ^0.92.0 + "@types/ramda": ~0.29.6 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 5a0ccf6158f4d9582002c3df4c30136ad8e0f7ee8e75a32f000d638e9b1906e1c42d9137fc4093532bbdbc7ebb3b23eb9fe2819690ae7643e9dde301710b264f + checksum: d9c361b8bb7b8a056acc2c52ef70a2d7304c511efc836cfebc315558ced7e93fe4e958dd554030a3315702d49ace30082ff7f2f91e9a76aaa2fff944a19fe39e languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-api-design-systems": ^0.83.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-api-design-systems": ^0.92.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: add8a138f379eddf4ce0fa78ffaf91d65c66b073d7304e11ed9db7f6262e2a981e8c9cb5cd36bb2471f573a37179c0f5414be9934714cc9166a98bfb6766931e + checksum: 248e61ed6e202eeab048c7c5e3eff0e0f2b6bfea958a02cbc6d8b831693a015d063db118af25c2e7380a4828ab84bf991764d200409a8eb99ffadb0dc6db65c0 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-asyncapi-2": ^0.83.0 - "@swagger-api/apidom-parser-adapter-json": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-asyncapi-2": ^0.92.0 + "@swagger-api/apidom-parser-adapter-json": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 0f510d2fb6b69daaebbc55cb186820394584941495ca2d7ae3ad608cc78f48f7b49d8dbf7299ac3fde2c553c8b0244bf265037e435e1e79176afc30029f127ca + checksum: 0fc981bc839758af1b3a8dfa0695376919a515a11ae71e6f9f1e0c91dd1530aa659fa7405cb73109db28fd95f594f09b5ee941611cc4ce4f3d1817335b12ec4b languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-asyncapi-2": ^0.83.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-asyncapi-2": ^0.92.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 46c4fff48263ec0bb40698ded08018c2d6bb653da1e88b1a50ea1b433b83a922a65029d09a77b0febaed6b26822ac520222a8495eafc5f86d81be003b8d0f418 + checksum: a1554f73cc20b75df71296322f6bdf5b5a0f1d775bd9bff89d7798843606e1a383c48960ddc2b1f879c962d2d56962e6096c3000ec2ad6091d49627aa2992b2e languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-json@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-json@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-json@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-json@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-ast": ^0.83.0 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-error": ^0.83.0 + "@swagger-api/apidom-ast": ^0.92.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-error": ^0.92.0 "@types/ramda": ~0.29.6 node-gyp: latest - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 - stampit: ^4.3.2 tree-sitter: =0.20.4 tree-sitter-json: =0.20.1 web-tree-sitter: =0.20.3 - checksum: be94a40fb8d342fe6394f01a803f0403612a796017bd6169dd52c201b26d60ed36cf6b7363faf2c8203fa67b65349d74c99b685c589ffbad30c26df29a3a53db + checksum: ca66dd9fffaa84249398420b9cf2301721d2b173340e0f07097348b73654f54698a370a94d814d7f51b7e662f968054b7fc745607074dbd71892c53714a18b62 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-2@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-2@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-openapi-json-2@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-2@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-openapi-2": ^0.83.0 - "@swagger-api/apidom-parser-adapter-json": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-openapi-2": ^0.92.0 + "@swagger-api/apidom-parser-adapter-json": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: e65c17bc9809af2b4c240c7f128258602bb8bdb440ad508ef08f5829b3347cc053624d117a4297c806a621ed61d9a53158a4aa4ed5cb3487a38935c32226d57d + checksum: 383827eec8fbc2bb36c095c8db4f8dce5264e5ffdfa7aca9a938d603294d99f0a552d57947222c160fbbbc1b79be7d08a7091348f3b373bbe25bd52a34bee529 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.83.0 - "@swagger-api/apidom-parser-adapter-json": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.92.0 + "@swagger-api/apidom-parser-adapter-json": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 3a0df777ad9dfdc6e9f6fb4984dfd3e3299a3ceff430719dc26eda9526e2102f786c89a08705cd780602eab5e85344ebe82dca1043741ecbf3ebd7b1961c109c + checksum: 592c1149d901a3c21594aca5c96a997382648ff559fb67cd6b75630440248a52f26df91ad96fa762e585e297725e20eb6f5623f91a6b6a5e2c950f57df4de760 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.83.0 - "@swagger-api/apidom-parser-adapter-json": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.92.0 + "@swagger-api/apidom-parser-adapter-json": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 5cec1f6237871f479233d75b862ccf774ffe5c6d63c9f08734fa6c0067e53ec9091683e5d309bf94cf080bd570bd4cc2496c85988ec0d52cdc378219033a8bdc + checksum: feaa0b825921ea9defde642b65a07049a8539905142baa113b3b5e90c76630a58ef2557a6f770740e32e5cfa46486fc9f7d3c468b8ec29aaa53cb507c4ad3469 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-openapi-2": ^0.83.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-openapi-2": ^0.92.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: bee0a9f82ddd02c1cbcf2b90896b70c2607a3ff53ca4431d176639878e0da0173946d6e303bab69d4d794dde178fcbd3c815428123f73eca2095ca89e828330d + checksum: efd8dbd705592accadce53b25fc293ee48d1d11ec191f618df4243e6fdfea1add502ef3a5d433051883092dd29bf0a9f2026f2314a0cced1b8f04af59e63e995 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.83.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.92.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: d6b3db2b4bf6280a14a76c29b9b6998380a1af09c0726bf736c7b64b30999268c2360776a284c76c2ec45d19f7c106816c98b2f399ec6225cfc9222dee3fb6ff + checksum: 47a034efae971b56d13e96bc64d0973a2015ca303bf63334117ebbcfb2b2676d50a0b68aa24ea5a3b669786a524035762d52ae1cc795f3c3dc65249297a23068 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.83.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.92.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 "@types/ramda": ~0.29.6 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.0.0 - checksum: 6bd8cf74b04d7f8fbf0cb0202253db349c7ce1ace7ccc9cff72ae36035a3dac5606e73fc5a829f0ac02af2369aff81ad3991701674091e692ffefb4ffed9499d + checksum: c565913065e401109e7e4494f1024d24958959c742e5f842247a56eca6b75dcc9c3495a4c550912a62d62db896b2803bd317642336b4b18c851adc141fa38b61 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^0.83.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:0.83.0" +"@swagger-api/apidom-parser-adapter-workflows-json-1@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-workflows-json-1@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-ast": ^0.83.0 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-error": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-workflows-1": ^0.92.0 + "@swagger-api/apidom-parser-adapter-json": ^0.92.0 + "@types/ramda": ~0.29.6 + ramda: ~0.29.1 + ramda-adjunct: ^4.0.0 + checksum: 570f8323aaa5c67da3b5421d6ca6a9f0c3bf486a602584fa5969476e6a4943abe9a7f8f2bd7dfc1a7019286746e65cc76b050cadfabab276e0d452fbad4db59f + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-workflows-yaml-1@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-workflows-yaml-1@npm:0.92.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-ns-workflows-1": ^0.92.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 + "@types/ramda": ~0.29.6 + ramda: ~0.29.1 + ramda-adjunct: ^4.0.0 + checksum: 020ecd34fb45ba57977377f71dc0b28ebba95b950bb873e1f6222eb6b544f91243dfb6b1f7555fe5f279d7bee044089337216a3f4b8e58612fb7066530938f32 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^0.92.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:0.92.0" + dependencies: + "@babel/runtime-corejs3": ^7.20.7 + "@swagger-api/apidom-ast": ^0.92.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-error": ^0.92.0 "@types/ramda": ~0.29.6 node-gyp: latest - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 - stampit: ^4.3.2 tree-sitter: =0.20.4 tree-sitter-yaml: =0.5.0 web-tree-sitter: =0.20.3 - checksum: df777f06199a82b8ccfb3ea53def7bbd08d06f3e3f4b5083526661bc86dd920ac83ca5b34dcaa26c0194d1dd7e104b6f324454790504b6934eb684011f6a5749 + checksum: 1ee0bf2c2f7fed54ff194917034f31080ad4ad36e14dc2018c80d8bda38f8b6574ace974eca1a65aa336a86df375dabd0661215909551031e796dcee9d0d1a14 languageName: node linkType: hard -"@swagger-api/apidom-reference@npm:>=0.83.0 <1.0.0": - version: 0.83.0 - resolution: "@swagger-api/apidom-reference@npm:0.83.0" +"@swagger-api/apidom-reference@npm:>=0.90.0 <1.0.0": + version: 0.92.0 + resolution: "@swagger-api/apidom-reference@npm:0.92.0" dependencies: "@babel/runtime-corejs3": ^7.20.7 - "@swagger-api/apidom-core": ^0.83.0 - "@swagger-api/apidom-error": ^0.83.0 - "@swagger-api/apidom-json-pointer": ^0.83.0 - "@swagger-api/apidom-ns-asyncapi-2": ^0.83.0 - "@swagger-api/apidom-ns-openapi-2": ^0.83.0 - "@swagger-api/apidom-ns-openapi-3-0": ^0.83.0 - "@swagger-api/apidom-ns-openapi-3-1": ^0.83.0 - "@swagger-api/apidom-parser-adapter-api-design-systems-json": ^0.83.0 - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": ^0.83.0 - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": ^0.83.0 - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": ^0.83.0 - "@swagger-api/apidom-parser-adapter-json": ^0.83.0 - "@swagger-api/apidom-parser-adapter-openapi-json-2": ^0.83.0 - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": ^0.83.0 - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": ^0.83.0 - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": ^0.83.0 - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": ^0.83.0 - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": ^0.83.0 - "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.83.0 + "@swagger-api/apidom-core": ^0.92.0 + "@swagger-api/apidom-error": ^0.92.0 + "@swagger-api/apidom-json-pointer": ^0.92.0 + "@swagger-api/apidom-ns-asyncapi-2": ^0.92.0 + "@swagger-api/apidom-ns-openapi-2": ^0.92.0 + "@swagger-api/apidom-ns-openapi-3-0": ^0.92.0 + "@swagger-api/apidom-ns-openapi-3-1": ^0.92.0 + "@swagger-api/apidom-ns-workflows-1": ^0.92.0 + "@swagger-api/apidom-parser-adapter-api-design-systems-json": ^0.92.0 + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": ^0.92.0 + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": ^0.92.0 + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": ^0.92.0 + "@swagger-api/apidom-parser-adapter-json": ^0.92.0 + "@swagger-api/apidom-parser-adapter-openapi-json-2": ^0.92.0 + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": ^0.92.0 + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": ^0.92.0 + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": ^0.92.0 + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": ^0.92.0 + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": ^0.92.0 + "@swagger-api/apidom-parser-adapter-workflows-json-1": ^0.92.0 + "@swagger-api/apidom-parser-adapter-workflows-yaml-1": ^0.92.0 + "@swagger-api/apidom-parser-adapter-yaml-1-2": ^0.92.0 "@types/ramda": ~0.29.6 axios: ^1.4.0 minimatch: ^7.4.3 process: ^0.11.10 - ramda: ~0.29.0 + ramda: ~0.29.1 ramda-adjunct: ^4.1.1 stampit: ^4.3.2 dependenciesMeta: @@ -16914,6 +16884,8 @@ __metadata: optional: true "@swagger-api/apidom-ns-openapi-3-1": optional: true + "@swagger-api/apidom-ns-workflows-1": + optional: true "@swagger-api/apidom-parser-adapter-api-design-systems-json": optional: true "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": @@ -16936,96 +16908,100 @@ __metadata: optional: true "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": optional: true + "@swagger-api/apidom-parser-adapter-workflows-json-1": + optional: true + "@swagger-api/apidom-parser-adapter-workflows-yaml-1": + optional: true "@swagger-api/apidom-parser-adapter-yaml-1-2": optional: true - checksum: b19c9c98cda575b139b1556327809c2367cca9e169ac50ea64049f6cc64148630709e5cc11573124460bcd5f5fc834c0c4434b8564fac4488e16de3cef65a16f + checksum: 05b2c97233f2f60879d2dc62a811a4b31520acb7b3c730d47e60e5927f861c1bf1376e790648b773b242ccb1e24596c567014c570d123655dc59fc2c590668c7 languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-darwin-arm64@npm:1.3.102" +"@swc/core-darwin-arm64@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-darwin-arm64@npm:1.3.104" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-darwin-x64@npm:1.3.102" +"@swc/core-darwin-x64@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-darwin-x64@npm:1.3.104" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.102" +"@swc/core-linux-arm-gnueabihf@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.104" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.102" +"@swc/core-linux-arm64-gnu@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.104" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.102" +"@swc/core-linux-arm64-musl@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.104" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.102" +"@swc/core-linux-x64-gnu@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.104" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-linux-x64-musl@npm:1.3.102" +"@swc/core-linux-x64-musl@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-linux-x64-musl@npm:1.3.104" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.102" +"@swc/core-win32-arm64-msvc@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.104" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.102" +"@swc/core-win32-ia32-msvc@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.104" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.102": - version: 1.3.102 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.102" +"@swc/core-win32-x64-msvc@npm:1.3.104": + version: 1.3.104 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.104" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.3.102 - resolution: "@swc/core@npm:1.3.102" + version: 1.3.104 + resolution: "@swc/core@npm:1.3.104" dependencies: - "@swc/core-darwin-arm64": 1.3.102 - "@swc/core-darwin-x64": 1.3.102 - "@swc/core-linux-arm-gnueabihf": 1.3.102 - "@swc/core-linux-arm64-gnu": 1.3.102 - "@swc/core-linux-arm64-musl": 1.3.102 - "@swc/core-linux-x64-gnu": 1.3.102 - "@swc/core-linux-x64-musl": 1.3.102 - "@swc/core-win32-arm64-msvc": 1.3.102 - "@swc/core-win32-ia32-msvc": 1.3.102 - "@swc/core-win32-x64-msvc": 1.3.102 + "@swc/core-darwin-arm64": 1.3.104 + "@swc/core-darwin-x64": 1.3.104 + "@swc/core-linux-arm-gnueabihf": 1.3.104 + "@swc/core-linux-arm64-gnu": 1.3.104 + "@swc/core-linux-arm64-musl": 1.3.104 + "@swc/core-linux-x64-gnu": 1.3.104 + "@swc/core-linux-x64-musl": 1.3.104 + "@swc/core-win32-arm64-msvc": 1.3.104 + "@swc/core-win32-ia32-msvc": 1.3.104 + "@swc/core-win32-x64-msvc": 1.3.104 "@swc/counter": ^0.1.1 "@swc/types": ^0.1.5 peerDependencies: @@ -17054,7 +17030,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 45c0edb06f87a811e28fb3ed587fbe6b7ca67ff2440fe15666d43729788903a4af61e3b57842aecc0b2b70e3c9981b698d8233746ba94dfb5a19e1c62eea33ad + checksum: 95fbf1412c8685d311cf2d7efbfa43e082d2d9e84ece48c4d8d96d6c67c5923569bfb26352451eb3e4d98adcb556dcfac65271c0fba77f078bb755fe2f64b295 languageName: node linkType: hard @@ -17075,14 +17051,14 @@ __metadata: linkType: hard "@swc/jest@npm:^0.2.22": - version: 0.2.29 - resolution: "@swc/jest@npm:0.2.29" + version: 0.2.30 + resolution: "@swc/jest@npm:0.2.30" dependencies: - "@jest/create-cache-key-function": ^27.4.2 + "@jest/create-cache-key-function": ^29.7.0 jsonc-parser: ^3.2.0 peerDependencies: "@swc/core": "*" - checksum: 9eaad322310f34e81f67d41411a7d60663341af1bd9fb65456faa914c936d849d6f643fa3b942a187d52e71e62c33097098c639d25c2047fa874f49bf51cec76 + checksum: 8ce25300949b8dfedaadec866d056a511ae2791e5cbbc8008b7d086c9c29b1b727c3f42aade88e824aa8205616e9aab812f9fa83ab4384e72f49a469f503256b languageName: node linkType: hard @@ -17188,15 +17164,15 @@ __metadata: linkType: hard "@testing-library/jest-dom@npm:^6.0.0": - version: 6.1.6 - resolution: "@testing-library/jest-dom@npm:6.1.6" + version: 6.2.0 + resolution: "@testing-library/jest-dom@npm:6.2.0" dependencies: "@adobe/css-tools": ^4.3.2 "@babel/runtime": ^7.9.2 aria-query: ^5.0.0 chalk: ^3.0.0 css.escape: ^1.5.1 - dom-accessibility-api: ^0.5.6 + dom-accessibility-api: ^0.6.3 lodash: ^4.17.15 redent: ^3.0.0 peerDependencies: @@ -17213,7 +17189,7 @@ __metadata: optional: true vitest: optional: true - checksum: 8d1a80678027915228b483a116fb9e358d25e2faffcd9a2c40b371752fbd53b5cb87351215866a43dd09393e7d364c46fc43923566b00ef63bbf3576d47da940 + checksum: 3d46e36b1b7c2cb3c92f64d55d458aab44ae135ac77299df14d14dcf567a286590de58b2f140011b8f7a343f0703ff88f144f27c6ae4921fd612741771d8ee2c languageName: node linkType: hard @@ -17635,6 +17611,13 @@ __metadata: languageName: node linkType: hard +"@types/cookie@npm:^0.6.0": + version: 0.6.0 + resolution: "@types/cookie@npm:0.6.0" + checksum: 5edce7995775b0b196b142883e4d4f71fd93c294eaec973670f1fa2540b70ea7390408ed513ddefef5fcb12a578100c76596e8f2a714b0c2ae9f70ee773f4510 + languageName: node + linkType: hard + "@types/cookiejar@npm:*": version: 2.1.1 resolution: "@types/cookiejar@npm:2.1.1" @@ -17930,7 +17913,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.17, @types/express@npm:^4.17.6": +"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.17, @types/express@npm:^4.17.21, @types/express@npm:^4.17.6": version: 4.17.21 resolution: "@types/express@npm:4.17.21" dependencies: @@ -18009,7 +17992,7 @@ __metadata: languageName: node linkType: hard -"@types/hoist-non-react-statics@npm:^3.3.0, @types/hoist-non-react-statics@npm:^3.3.1": +"@types/hoist-non-react-statics@npm:^3.3.0": version: 3.3.1 resolution: "@types/hoist-non-react-statics@npm:3.3.1" dependencies: @@ -18061,9 +18044,9 @@ __metadata: linkType: hard "@types/humanize-duration@npm:^3.18.1, @types/humanize-duration@npm:^3.25.1, @types/humanize-duration@npm:^3.27.1": - version: 3.27.3 - resolution: "@types/humanize-duration@npm:3.27.3" - checksum: 33a13bf6206a7708ed0cac83fa98e13314774ba4fd15ab19e454ef9e413d625e9e508ddcbfc32ee9b0093d938ad4a3aee764543b4edc0ebb05d62c1bbc363598 + version: 3.27.4 + resolution: "@types/humanize-duration@npm:3.27.4" + checksum: aa7fa41af839021c846a1728d2f097b7885f80acbc5050623a9804d23fd8fee19d2654eaae331f000a4e551b88d99cd0b5f6cc97aa99f869b9205f6248066827 languageName: node linkType: hard @@ -18164,10 +18147,10 @@ __metadata: languageName: node linkType: hard -"@types/js-levenshtein@npm:^1.1.1": - version: 1.1.1 - resolution: "@types/js-levenshtein@npm:1.1.1" - checksum: 1d1ff1ee2ad551909e47f3ce19fcf85b64dc5146d3b531c8d26fc775492d36e380b32cf5ef68ff301e812c3b00282f37aac579ebb44498b94baff0ace7509769 +"@types/js-levenshtein@npm:^1.1.1, @types/js-levenshtein@npm:^1.1.3": + version: 1.1.3 + resolution: "@types/js-levenshtein@npm:1.1.3" + checksum: eb338696da976925ea8448a42d775d7615a14323dceeb08909f187d0b3d3b4c1f67a1c36ef586b1c2318b70ab141bba8fc58311ba1c816711704605aec09db8b languageName: node linkType: hard @@ -18397,12 +18380,12 @@ __metadata: linkType: hard "@types/node-fetch@npm:^2.5.0, @types/node-fetch@npm:^2.5.12, @types/node-fetch@npm:^2.5.7": - version: 2.6.10 - resolution: "@types/node-fetch@npm:2.6.10" + version: 2.6.11 + resolution: "@types/node-fetch@npm:2.6.11" dependencies: "@types/node": "*" form-data: ^4.0.0 - checksum: e0c9a6023752ff6c744a33a3045b9adb11fd1882997ef891bf7ce91f937ddab91c0acee4c8e806a8a5aec0e8d8c132709141e8512fec28030d7cc9ef92c7ff1e + checksum: 180e4d44c432839bdf8a25251ef8c47d51e37355ddd78c64695225de8bc5dc2b50b7bb855956d471c026bb84bd7295688a0960085e7158cbbba803053492568b languageName: node linkType: hard @@ -18416,11 +18399,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:^20.1.1": - version: 20.10.6 - resolution: "@types/node@npm:20.10.6" + version: 20.11.5 + resolution: "@types/node@npm:20.11.5" dependencies: undici-types: ~5.26.4 - checksum: ada40e4ccbda3697dca88f8d13f4c996c493be6fbc15f5f5d3b91096d56bd700786a2c148a92a2b4c5d1f133379e63f754a786b3aebfc6a7d09fc7ea16dc017b + checksum: a542727de1334ae20a3ca034b0ecf4b464a57ca01efc4f9cf43bd9ab93896125ab3c2de060ecd8f6ae23b86c6bf3463f681b643e69c032c6a662d376c98a6092 languageName: node linkType: hard @@ -18439,9 +18422,9 @@ __metadata: linkType: hard "@types/node@npm:^16.11.26, @types/node@npm:^16.7.10, @types/node@npm:^16.9.2": - version: 16.18.69 - resolution: "@types/node@npm:16.18.69" - checksum: ac7076062e59169ac1907e9347d939ed5f79c6a3ec2a531fe7186caf2fcf8d66de9b87ad42d92c4dfa6cb44b1018ab89fef1e054a82af36deea04ba32a5a670a + version: 16.18.72 + resolution: "@types/node@npm:16.18.72" + checksum: c0f1748b20566417d3b777d11962f84500b4cb9c77ebb59c51f2882c3e5141bd4636709dc63fe2e45d6d6799fc4c5a98931abcb2dd3a5b107e448d76ae848320 languageName: node linkType: hard @@ -18453,11 +18436,11 @@ __metadata: linkType: hard "@types/node@npm:^18.17.8": - version: 18.19.4 - resolution: "@types/node@npm:18.19.4" + version: 18.19.8 + resolution: "@types/node@npm:18.19.8" dependencies: undici-types: ~5.26.4 - checksum: 3a32a31b2df85d4bebb5e3c91ec1a0908d587a2a2fd31ab4eeebd609d1c04bbcc9ba97e290e3230f843c9f43f17efb9f5cde56412b4b0f5acbfe5577179b23c8 + checksum: fa291495d6157a9d9393b4c3bdbf1ce12a8f661dc9da6a4fa19bcdb19af1c62bb8dbf7fb66ae135f29cd788b618e9845b83e9c47edcf39f0953a8561fdacd9a3 languageName: node linkType: hard @@ -18751,11 +18734,11 @@ __metadata: linkType: hard "@types/react-virtualized-auto-sizer@npm:^1.0.1": - version: 1.0.3 - resolution: "@types/react-virtualized-auto-sizer@npm:1.0.3" + version: 1.0.4 + resolution: "@types/react-virtualized-auto-sizer@npm:1.0.4" dependencies: "@types/react": "*" - checksum: 7fcc516241903b937481b567a560c75cd23d27e63222938db725972d93cde0c07f846f98e104c78edcaa765608be156a9d08cf24e2261a3e11463b11343d964c + checksum: e0d41ac6cf0f48dfef45c0cd70146578f42ad83dad90911aa0dfe72b0e1ea62ca9ff56d4f43f322ec6dae2e7cb4d025aefe0e85241f7782c249aeface1050512 languageName: node linkType: hard @@ -18769,13 +18752,13 @@ __metadata: linkType: hard "@types/react@npm:^18": - version: 18.2.46 - resolution: "@types/react@npm:18.2.46" + version: 18.2.48 + resolution: "@types/react@npm:18.2.48" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: cb0e4dc7f41988a059e1246a19ec377101f5b16097ec4bf7000ef3c431ec0c8c873f40e95075821f908db1f4e3352775f0f18cea53dcad14dce67c0f5110f2bd + checksum: c9ca43ed2995389b7e09492c24e6f911a8439bb8276dd17cc66a2fbebbf0b42daf7b2ad177043256533607c2ca644d7d928fdfce37a67af1f8646d2bac988900 languageName: node linkType: hard @@ -19003,7 +18986,7 @@ __metadata: languageName: node linkType: hard -"@types/statuses@npm:^2.0.1": +"@types/statuses@npm:^2.0.4": version: 2.0.4 resolution: "@types/statuses@npm:2.0.4" checksum: 3a806c3b96d1845e3e7441fbf0839037e95f717334760ddb7c29223c9a34a7206b68e2998631f89f1a1e3ef5b67b15652f6e8fa14987ebd7f6d38587c1bffd18 @@ -19229,15 +19212,6 @@ __metadata: languageName: node linkType: hard -"@types/yargs@npm:^16.0.0": - version: 16.0.4 - resolution: "@types/yargs@npm:16.0.4" - dependencies: - "@types/yargs-parser": "*" - checksum: caa21d2c957592fe2184a8368c8cbe5a82a6c2e2f2893722e489f842dc5963293d2f3120bc06fe3933d60a3a0d1e2eb269649fd6b1947fe1820f8841ba611dd9 - languageName: node - linkType: hard - "@types/yargs@npm:^17.0.8": version: 17.0.12 resolution: "@types/yargs@npm:17.0.12" @@ -20274,12 +20248,12 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^5.0.0": - version: 5.0.0 - resolution: "ansi-escapes@npm:5.0.0" +"ansi-escapes@npm:^6.2.0": + version: 6.2.0 + resolution: "ansi-escapes@npm:6.2.0" dependencies: - type-fest: ^1.0.2 - checksum: d4b5eb8207df38367945f5dd2ef41e08c28edc192dc766ef18af6b53736682f49d8bfcfa4e4d6ecbc2e2f97c258fda084fb29a9e43b69170b71090f771afccac + type-fest: ^3.0.0 + checksum: f0bc667d5f1ededc3ea89b73c34f0cba95473525b07e1290ddfd3fc868c94614e95f3549f5c4fd0c05424af7d3fd298101fb3d9a52a597d3782508b340783bd7 languageName: node linkType: hard @@ -20338,7 +20312,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 @@ -20884,14 +20858,14 @@ __metadata: linkType: hard "aws-sdk-client-mock-jest@npm:^3.0.0": - version: 3.0.0 - resolution: "aws-sdk-client-mock-jest@npm:3.0.0" + version: 3.0.1 + resolution: "aws-sdk-client-mock-jest@npm:3.0.1" dependencies: "@types/jest": ^28.1.3 tslib: ^2.1.0 peerDependencies: - aws-sdk-client-mock: 3.0.0 - checksum: 83f49e1d048bf32bb88b6a2ac8b3d14761a14dd699adc7c0e4bd9397b4771dd3e23779ec180bf63c03be7e85b2322840373a4c4d9840722ab15d409d6f4e8bd1 + aws-sdk-client-mock: 3.0.1 + checksum: c5c72ae63c9d3862636b833c66ebc708a1c170ba1159508f9a1e56c8e71ba82f7f85a00e68148b72cc699ab3e7ce6945d29bfd23151ae62c3f78133d56585ddd languageName: node linkType: hard @@ -20957,13 +20931,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:0.27.2, axios@npm:^0.27.2": - version: 0.27.2 - resolution: "axios@npm:0.27.2" +"axios@npm:1.6.5, axios@npm:^1.4.0, axios@npm:^1.6.0": + version: 1.6.5 + resolution: "axios@npm:1.6.5" dependencies: - follow-redirects: ^1.14.9 + follow-redirects: ^1.15.4 form-data: ^4.0.0 - checksum: 38cb7540465fe8c4102850c4368053c21683af85c5fdf0ea619f9628abbcb59415d1e22ebc8a6390d2bbc9b58a9806c874f139767389c862ec9b772235f06854 + proxy-from-env: ^1.1.0 + checksum: e28d67b2d9134cb4608c44d8068b0678cfdccc652742e619006f27264a30c7aba13b2cd19c6f1f52ae195b5232734925928fb192d5c85feea7edd2f273df206d languageName: node linkType: hard @@ -20976,14 +20951,13 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.4.0, axios@npm:^1.6.0": - version: 1.6.4 - resolution: "axios@npm:1.6.4" +"axios@npm:^0.27.2": + version: 0.27.2 + resolution: "axios@npm:0.27.2" dependencies: - follow-redirects: ^1.15.4 + follow-redirects: ^1.14.9 form-data: ^4.0.0 - proxy-from-env: ^1.1.0 - checksum: 48d8af8488ac7402fae312437c0189b3b609a472fca2f7fc796129c804d98520589b6317096eba8509711d49f855a3f620b6a24ff23acd73ac26433d0383b8f9 + checksum: 38cb7540465fe8c4102850c4368053c21683af85c5fdf0ea619f9628abbcb59415d1e22ebc8a6390d2bbc9b58a9806c874f139767389c862ec9b772235f06854 languageName: node linkType: hard @@ -20997,12 +20971,12 @@ __metadata: linkType: hard "azure-devops-node-api@npm:^12.0.0": - version: 12.1.0 - resolution: "azure-devops-node-api@npm:12.1.0" + version: 12.3.0 + resolution: "azure-devops-node-api@npm:12.3.0" dependencies: tunnel: 0.0.6 typed-rest-client: ^1.8.4 - checksum: aa3c3f3eff89485a44ea31843749c5abf5ddfb0d2f059a3f5623d75d5eddbab5b839a5458c158e7941b9c8a2adfde2ecfea128ed076f730c309c869e8a318a78 + checksum: 4f76f4633f57b92267b9f841591ee2c9548bc51421d3d5b0072c854f6a3f3bc77b3a334863a22f1b903c620492a8be877ee16ff5af05e6d131b281a683a7f695 languageName: node linkType: hard @@ -21321,13 +21295,13 @@ __metadata: linkType: hard "better-sqlite3@npm:^9.0.0": - version: 9.2.2 - resolution: "better-sqlite3@npm:9.2.2" + version: 9.3.0 + resolution: "better-sqlite3@npm:9.3.0" dependencies: bindings: ^1.5.0 node-gyp: latest prebuild-install: ^7.1.1 - checksum: 11d78ed15c8f059c5b58845c40b921692468cef291975ad9f9395278c6ba3005ae2aceb20175fe18e901983ed68c785fdd39c729dc789d72be4184a406bd9a2c + checksum: 03dedaeef92aaa5e963e9fad5849afca3568c987b4d6f36957f9879137c994aa18f9654fe7bcc3804620ede55eabd19ff9bcba03ad0bf985aa8bd5561e4aaa43 languageName: node linkType: hard @@ -21758,16 +21732,6 @@ __metadata: languageName: node linkType: hard -"buffer-polyfill@npm:buffer@^6.0.3, buffer@npm:^6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.2.1 - checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 - languageName: node - linkType: hard - "buffer-writer@npm:2.0.0": version: 2.0.0 resolution: "buffer-writer@npm:2.0.0" @@ -21813,6 +21777,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + "builtin-modules@npm:^3.3.0": version: 3.3.0 resolution: "builtin-modules@npm:3.3.0" @@ -22312,10 +22286,10 @@ __metadata: languageName: node linkType: hard -"classnames@npm:*, classnames@npm:^2.2.5, classnames@npm:^2.2.6, classnames@npm:^2.3.1": - version: 2.3.3 - resolution: "classnames@npm:2.3.3" - checksum: 0cb4db9cc3b8d2363c81f857f85b30351605fe683c89d140939aed4e06895a9570be737494ef3907e7069e2b98ed25ba3960fbf087b33309a18707fc38565e95 +"classnames@npm:*, classnames@npm:^2.2.5, classnames@npm:^2.2.6, classnames@npm:^2.3.1, classnames@npm:^2.5.1": + version: 2.5.1 + resolution: "classnames@npm:2.5.1" + checksum: da424a8a6f3a96a2e87d01a432ba19315503294ac7e025f9fece656db6b6a0f7b5003bb1fbb51cbb0d9624d964f1b9bb35a51c73af9b2434c7b292c42231c1e5 languageName: node linkType: hard @@ -22417,13 +22391,13 @@ __metadata: languageName: node linkType: hard -"cli-truncate@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-truncate@npm:3.1.0" +"cli-truncate@npm:^4.0.0": + version: 4.0.0 + resolution: "cli-truncate@npm:4.0.0" dependencies: slice-ansi: ^5.0.0 - string-width: ^5.0.0 - checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a + string-width: ^7.0.0 + checksum: d5149175fd25ca985731bdeec46a55ec237475cf74c1a5e103baea696aceb45e372ac4acbaabf1316f06bd62e348123060f8191ffadfeedebd2a70a2a7fb199d languageName: node linkType: hard @@ -22551,10 +22525,10 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^2.0.0": - version: 2.0.0 - resolution: "clsx@npm:2.0.0" - checksum: a2cfb2351b254611acf92faa0daf15220f4cd648bdf96ce369d729813b85336993871a4bf6978ddea2b81b5a130478339c20d9d0b5c6fc287e5147f0c059276e +"clsx@npm:^2.0.0, clsx@npm:^2.1.0": + version: 2.1.0 + resolution: "clsx@npm:2.1.0" + checksum: 43fefc29b6b49c9476fbce4f8b1cc75c27b67747738e598e6651dd40d63692135dc60b18fa1c5b78a2a9ba8ae6fd2055a068924b94e20b42039bd53b78b98e1d languageName: node linkType: hard @@ -23305,9 +23279,9 @@ __metadata: linkType: hard "core-js@npm:^3.26.0, core-js@npm:^3.6.5": - version: 3.33.3 - resolution: "core-js@npm:3.33.3" - checksum: 070b9c696f5a9b22bab0208daf9fcdffbc3b4f4c89ed2be512b7d99d4be363accfbb26fa6eec7261055d89e8ea0a5bcfccad5923fe43f1f2eafca9f568cc5596 + version: 3.35.0 + resolution: "core-js@npm:3.35.0" + checksum: 25c224aca3df012b98f08f13ccbd8171ef5852acd33fd5e58e106d27f5f0c97de2fdbc520f0b4364d26253caf2deb3e5d265310f57d2a66ae6cc922850e649f0 languageName: node linkType: hard @@ -23671,20 +23645,20 @@ __metadata: linkType: hard "css-loader@npm:^6.5.1": - version: 6.8.1 - resolution: "css-loader@npm:6.8.1" + version: 6.9.1 + resolution: "css-loader@npm:6.9.1" dependencies: icss-utils: ^5.1.0 - postcss: ^8.4.21 + postcss: ^8.4.33 postcss-modules-extract-imports: ^3.0.0 - postcss-modules-local-by-default: ^4.0.3 - postcss-modules-scope: ^3.0.0 + postcss-modules-local-by-default: ^4.0.4 + postcss-modules-scope: ^3.1.1 postcss-modules-values: ^4.0.0 postcss-value-parser: ^4.2.0 - semver: ^7.3.8 + semver: ^7.5.4 peerDependencies: webpack: ^5.0.0 - checksum: 7c1784247bdbe76dc5c55fb1ac84f1d4177a74c47259942c9cfdb7a8e6baef11967a0bc85ac285f26bd26d5059decb848af8154a03fdb4f4894f41212f45eef3 + checksum: b0c1776f9c46474219eb471eeb8f4c8986a7735dc8356e578a63303cf292a7c8cb868fa74bf94a1a174e948fcb6523c63fca081cac6bbf246be8275b3cc384f0 languageName: node linkType: hard @@ -24759,13 +24733,20 @@ __metadata: languageName: node linkType: hard -"dom-accessibility-api@npm:^0.5.6, dom-accessibility-api@npm:^0.5.9": +"dom-accessibility-api@npm:^0.5.9": version: 0.5.13 resolution: "dom-accessibility-api@npm:0.5.13" checksum: a5a5f14c01e466d424750aaac9225f1dc43cf16d101a1c40e01a554abce63c48084707002c39b805f2ce212273c179dd6d2258175997cd06d5f79851bf52dd40 languageName: node linkType: hard +"dom-accessibility-api@npm:^0.6.3": + version: 0.6.3 + resolution: "dom-accessibility-api@npm:0.6.3" + checksum: c325b5144bb406df23f4affecffc117dbaec9af03daad9ee6b510c5be647b14d28ef0a4ea5ca06d696d8ab40bb777e5fed98b985976fdef9d8790178fa1d573f + languageName: node + linkType: hard + "dom-converter@npm:^0.2.0": version: 0.2.0 resolution: "dom-converter@npm:0.2.0" @@ -25105,8 +25086,8 @@ __metadata: linkType: hard "elastic-builder@npm:^2.16.0": - version: 2.23.0 - resolution: "elastic-builder@npm:2.23.0" + version: 2.24.0 + resolution: "elastic-builder@npm:2.24.0" dependencies: lodash.has: ^4.5.2 lodash.hasin: ^4.5.2 @@ -25116,7 +25097,7 @@ __metadata: lodash.isobject: ^3.0.2 lodash.isstring: ^4.0.1 lodash.omit: ^4.5.0 - checksum: 6cd3d6fd3ea20adb2f48a21d3bd25fd89dd9f692feab95357356b8a814f5a36579c7a8326e818127fc5ec50774c1818c4f8e5d0aeea00cccd0aeda5563e17123 + checksum: 4bbfa66a179b78dbd90a0a3ee19cf7fc2105deca195c65d3047cf2ef2e6fa4925049038ed1f28d46a3ce96daa47f2cf8d924ea2e2fc0c585569a5a7acd09f2ed languageName: node linkType: hard @@ -25149,6 +25130,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^10.3.0": + version: 10.3.0 + resolution: "emoji-regex@npm:10.3.0" + checksum: 5da48edfeb9462fb1ae5495cff2d79129974c696853fb0ce952cbf560f29a2756825433bf51cfd5157ec7b9f93f46f31d712e896d63e3d8ac9c3832bdb45ab73 + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -25598,7 +25586,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.18.10, esbuild@npm:~0.18.20": +"esbuild@npm:^0.18.10": version: 0.18.20 resolution: "esbuild@npm:0.18.20" dependencies: @@ -25675,33 +25663,33 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.19.0": - version: 0.19.10 - resolution: "esbuild@npm:0.19.10" +"esbuild@npm:^0.19.0, esbuild@npm:~0.19.10": + version: 0.19.11 + resolution: "esbuild@npm:0.19.11" dependencies: - "@esbuild/aix-ppc64": 0.19.10 - "@esbuild/android-arm": 0.19.10 - "@esbuild/android-arm64": 0.19.10 - "@esbuild/android-x64": 0.19.10 - "@esbuild/darwin-arm64": 0.19.10 - "@esbuild/darwin-x64": 0.19.10 - "@esbuild/freebsd-arm64": 0.19.10 - "@esbuild/freebsd-x64": 0.19.10 - "@esbuild/linux-arm": 0.19.10 - "@esbuild/linux-arm64": 0.19.10 - "@esbuild/linux-ia32": 0.19.10 - "@esbuild/linux-loong64": 0.19.10 - "@esbuild/linux-mips64el": 0.19.10 - "@esbuild/linux-ppc64": 0.19.10 - "@esbuild/linux-riscv64": 0.19.10 - "@esbuild/linux-s390x": 0.19.10 - "@esbuild/linux-x64": 0.19.10 - "@esbuild/netbsd-x64": 0.19.10 - "@esbuild/openbsd-x64": 0.19.10 - "@esbuild/sunos-x64": 0.19.10 - "@esbuild/win32-arm64": 0.19.10 - "@esbuild/win32-ia32": 0.19.10 - "@esbuild/win32-x64": 0.19.10 + "@esbuild/aix-ppc64": 0.19.11 + "@esbuild/android-arm": 0.19.11 + "@esbuild/android-arm64": 0.19.11 + "@esbuild/android-x64": 0.19.11 + "@esbuild/darwin-arm64": 0.19.11 + "@esbuild/darwin-x64": 0.19.11 + "@esbuild/freebsd-arm64": 0.19.11 + "@esbuild/freebsd-x64": 0.19.11 + "@esbuild/linux-arm": 0.19.11 + "@esbuild/linux-arm64": 0.19.11 + "@esbuild/linux-ia32": 0.19.11 + "@esbuild/linux-loong64": 0.19.11 + "@esbuild/linux-mips64el": 0.19.11 + "@esbuild/linux-ppc64": 0.19.11 + "@esbuild/linux-riscv64": 0.19.11 + "@esbuild/linux-s390x": 0.19.11 + "@esbuild/linux-x64": 0.19.11 + "@esbuild/netbsd-x64": 0.19.11 + "@esbuild/openbsd-x64": 0.19.11 + "@esbuild/sunos-x64": 0.19.11 + "@esbuild/win32-arm64": 0.19.11 + "@esbuild/win32-ia32": 0.19.11 + "@esbuild/win32-x64": 0.19.11 dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -25751,7 +25739,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: b97f2f837c931e065839fe9adebba44b80aaa81c6b32dca4e1e77c068a0afb045d08a94d86abdacb29daef783ec092f0db688a31f3d463e2e42ac17e5a478265 + checksum: ae949a796d1d06b55275ae7491ce137857468f69a93d8cc9c0943d2a701ac54e14dbb250a2ba56f2ad98283669578f1ec3bd85a4681910a5ff29a2470c3bd62c languageName: node linkType: hard @@ -25930,8 +25918,8 @@ __metadata: linkType: hard "eslint-plugin-jest@npm:^27.0.0": - version: 27.6.1 - resolution: "eslint-plugin-jest@npm:27.6.1" + version: 27.6.3 + resolution: "eslint-plugin-jest@npm:27.6.3" dependencies: "@typescript-eslint/utils": ^5.10.0 peerDependencies: @@ -25943,7 +25931,7 @@ __metadata: optional: true jest: optional: true - checksum: 03dc4784119a06504718b3ec1a5944c8d41fe73669d23433fa794e4059be857ec463da6d5982dcd2920da091fe7c5c033fa69a91f4dfbe3f41aac6db99b8c3d0 + checksum: e22e8dbd941b34bb95958f035ffabb94114506b294e74d6e411bc85bc9dc57888ffd3ebb5c28316a8b7cc9d391cca35557acc64bf815f48d1dcc5ea3d28fa43a languageName: node linkType: hard @@ -26098,13 +26086,13 @@ __metadata: linkType: hard "eslint@npm:^8.33.0, eslint@npm:^8.6.0": - version: 8.55.0 - resolution: "eslint@npm:8.55.0" + version: 8.56.0 + resolution: "eslint@npm:8.56.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.6.1 "@eslint/eslintrc": ^2.1.4 - "@eslint/js": 8.55.0 + "@eslint/js": 8.56.0 "@humanwhocodes/config-array": ^0.11.13 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 @@ -26141,7 +26129,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 83f82a604559dc1faae79d28fdf3dfc9e592ca221052e2ea516e1b379b37e77e4597705a16880e2f5ece4f79087c1dd13fd7f6e9746f794a401175519db18b41 + checksum: 883436d1e809b4a25d9eb03d42f584b84c408dbac28b0019f6ea07b5177940bf3cca86208f749a6a1e0039b63e085ee47aca1236c30721e91f0deef5cc5a5136 languageName: node linkType: hard @@ -26338,6 +26326,7 @@ __metadata: "@backstage/plugin-airbrake": "workspace:^" "@backstage/plugin-apache-airflow": "workspace:^" "@backstage/plugin-api-docs": "workspace:^" + "@backstage/plugin-app-visualizer": "workspace:^" "@backstage/plugin-azure-devops": "workspace:^" "@backstage/plugin-azure-sites": "workspace:^" "@backstage/plugin-badges": "workspace:^" @@ -26391,7 +26380,6 @@ __metadata: "@backstage/plugin-techdocs-react": "workspace:^" "@backstage/plugin-todo": "workspace:^" "@backstage/plugin-user-settings": "workspace:^" - "@backstage/plugin-visualizer": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@circleci/backstage-plugin": ^0.1.1 @@ -26495,6 +26483,7 @@ __metadata: "@backstage/plugin-search-react": "workspace:^" "@backstage/plugin-sentry": "workspace:^" "@backstage/plugin-shortcuts": "workspace:^" + "@backstage/plugin-signals": "workspace:^" "@backstage/plugin-stack-overflow": "workspace:^" "@backstage/plugin-stackstorm": "workspace:^" "@backstage/plugin-tech-insights": "workspace:^" @@ -26535,7 +26524,7 @@ __metadata: react-use: ^17.2.4 vite: ^4.4.9 vite-plugin-html: ^3.2.0 - vite-plugin-node-polyfills: ^0.17.0 + vite-plugin-node-polyfills: ^0.19.0 zen-observable: ^0.10.0 languageName: unknown linkType: soft @@ -26634,6 +26623,8 @@ __metadata: "@backstage/plugin-search-backend-module-techdocs": "workspace:^" "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-search-common": "workspace:^" + "@backstage/plugin-signals-backend": "workspace:^" + "@backstage/plugin-signals-node": "workspace:^" "@backstage/plugin-tech-insights-backend": "workspace:^" "@backstage/plugin-tech-insights-backend-module-jsonfc": "workspace:^" "@backstage/plugin-tech-insights-node": "workspace:^" @@ -27990,6 +27981,13 @@ __metadata: languageName: node linkType: hard +"get-east-asian-width@npm:^1.0.0": + version: 1.2.0 + resolution: "get-east-asian-width@npm:1.2.0" + checksum: ea55f4d4a42c4b00d3d9be3111bc17eb0161f60ed23fc257c1390323bb780a592d7a8bdd550260fd4627dabee9a118cdfa3475ae54edca35ebcd3bdae04179e3 + languageName: node + linkType: hard + "get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": version: 1.2.2 resolution: "get-intrinsic@npm:1.2.2" @@ -28160,17 +28158,17 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.1.6": - version: 7.1.6 - resolution: "glob@npm:7.1.6" +"glob@npm:7.2.3, glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.1.7, glob@npm:^7.2.0": + version: 7.2.3 + resolution: "glob@npm:7.2.3" dependencies: fs.realpath: ^1.0.0 inflight: ^1.0.4 inherits: 2 - minimatch: ^3.0.4 + minimatch: ^3.1.1 once: ^1.3.0 path-is-absolute: ^1.0.0 - checksum: 351d549dd90553b87c2d3f90ce11aed9e1093c74130440e7ae0592e11bbcd2ce7f0ebb8ba6bfe63aaf9b62166a7f4c80cb84490ae5d78408bb2572bf7d4ee0a6 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 languageName: node linkType: hard @@ -28189,20 +28187,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.1.7, glob@npm:^7.2.0": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - "glob@npm:^8.0.0, glob@npm:^8.0.1, glob@npm:^8.0.3": version: 8.1.0 resolution: "glob@npm:8.1.0" @@ -28456,7 +28440,7 @@ __metadata: languageName: node linkType: hard -"graphiql@npm:3.0.10, graphiql@npm:^3.0.6": +"graphiql@npm:3.0.10": version: 3.0.10 resolution: "graphiql@npm:3.0.10" dependencies: @@ -28472,6 +28456,22 @@ __metadata: languageName: node linkType: hard +"graphiql@npm:^3.0.6": + version: 3.1.0 + resolution: "graphiql@npm:3.1.0" + dependencies: + "@graphiql/react": ^0.20.2 + "@graphiql/toolkit": ^0.9.1 + graphql-language-service: ^5.2.0 + markdown-it: ^12.2.0 + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 + checksum: a8969ea299561fe627ba566fb72dd90eda31b195e9983af87c4079bf807f5b356d116ece133e46d5098d6809a88b8f3b64b04a9e95dfe34cd84eb8fd109e2b8a + languageName: node + linkType: hard + "graphlib@npm:^2.1.8": version: 2.1.8 resolution: "graphlib@npm:2.1.8" @@ -28867,7 +28867,7 @@ __metadata: languageName: node linkType: hard -"headers-polyfill@npm:^4.0.1": +"headers-polyfill@npm:^4.0.2": version: 4.0.2 resolution: "headers-polyfill@npm:4.0.2" checksum: a95280ed58df429fc86c4f49b21596be3ea3f5f3d790e7d75238668df9b90b292f15a968c7c19ae1db88c0ae036dd1bf363a71b8e771199d82848e2d8b3c6c2e @@ -29037,8 +29037,8 @@ __metadata: linkType: hard "html-webpack-plugin@npm:^5.3.1": - version: 5.5.4 - resolution: "html-webpack-plugin@npm:5.5.4" + version: 5.6.0 + resolution: "html-webpack-plugin@npm:5.6.0" dependencies: "@types/html-minifier-terser": ^6.0.0 html-minifier-terser: ^6.0.2 @@ -29046,8 +29046,14 @@ __metadata: pretty-error: ^4.0.0 tapable: ^2.0.0 peerDependencies: + "@rspack/core": 0.x || 1.x webpack: ^5.20.0 - checksum: b49befb73d67a3716fd0e6f7776b108d2b0b7050fb8221f05cd114cbae13c03150a13b7cdf5e76170be040ce7936a1cf76f7a4bfd9ebe1552b72d7889a74c374 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 32a6e41da538e798fd0be476637d7611a5e8a98a3508f031996e9eb27804dcdc282cb01f847cf5d066f21b49cfb8e21627fcf977ffd0c9bea81cf80e5a65070d languageName: node linkType: hard @@ -29583,30 +29589,7 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:8.2.5": - version: 8.2.5 - resolution: "inquirer@npm:8.2.5" - dependencies: - ansi-escapes: ^4.2.1 - chalk: ^4.1.1 - cli-cursor: ^3.1.0 - cli-width: ^3.0.0 - external-editor: ^3.0.3 - figures: ^3.0.0 - lodash: ^4.17.21 - mute-stream: 0.0.8 - ora: ^5.4.1 - run-async: ^2.4.0 - rxjs: ^7.5.5 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - through: ^2.3.6 - wrap-ansi: ^7.0.0 - checksum: f13ee4c444187786fb393609dedf6b30870115a57b603f2e6424f29a99abc13446fd45ee22461c33c9c40a92a60a8df62d0d6b25d74fc6676fa4cb211de55b55 - languageName: node - linkType: hard - -"inquirer@npm:^8.0.0, inquirer@npm:^8.2.0": +"inquirer@npm:8.2.6, inquirer@npm:^8.0.0, inquirer@npm:^8.2.0": version: 8.2.6 resolution: "inquirer@npm:8.2.6" dependencies: @@ -29969,6 +29952,15 @@ __metadata: languageName: node linkType: hard +"is-fullwidth-code-point@npm:^5.0.0": + version: 5.0.0 + resolution: "is-fullwidth-code-point@npm:5.0.0" + dependencies: + get-east-asian-width: ^1.0.0 + checksum: 8dfb2d2831b9e87983c136f5c335cd9d14c1402973e357a8ff057904612ed84b8cba196319fabedf9aefe4639e14fe3afe9d9966d1d006ebeb40fe1fed4babe5 + languageName: node + linkType: hard + "is-generator-fn@npm:^2.0.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" @@ -30505,8 +30497,8 @@ __metadata: linkType: hard "isomorphic-git@npm:^1.23.0": - version: 1.25.2 - resolution: "isomorphic-git@npm:1.25.2" + version: 1.25.3 + resolution: "isomorphic-git@npm:1.25.3" dependencies: async-lock: ^1.1.0 clean-git-ref: ^2.0.1 @@ -30521,7 +30513,7 @@ __metadata: simple-get: ^4.0.1 bin: isogit: cli.cjs - checksum: b8e7a1b66c393ac1ab30fd0deb561b97e4ca249aad97367f11be8ed18b20132460bec89451752e3533e64a5a8c47b3509dc5a7dee2eea266c812b45df633b441 + checksum: 747da1bd0435898a02f8c1ba07ce66c704ea311338b66a44830a5ce1fe9a256a3ea1ec9be5baa087f88134aa686b5d0c6dc2b9338b1fd523f2869ef2480e4d4e languageName: node linkType: hard @@ -30797,6 +30789,13 @@ __metadata: languageName: node linkType: hard +"jest-date-mock@npm:^1.0.8": + version: 1.0.8 + resolution: "jest-date-mock@npm:1.0.8" + checksum: 7b012870440b0df742d0b651435b91625dbbf02d916633a0c70c7deb5d5087f9aadc59847602312368826325909e70e95cd412896a0c9ee1d5ac382000bf5ef9 + languageName: node + linkType: hard + "jest-diff@npm:^28.1.3": version: 28.1.3 resolution: "jest-diff@npm:28.1.3" @@ -32173,8 +32172,8 @@ __metadata: linkType: hard "knex@npm:3, knex@npm:^3.0.0": - version: 3.0.1 - resolution: "knex@npm:3.0.1" + version: 3.1.0 + resolution: "knex@npm:3.1.0" dependencies: colorette: 2.0.19 commander: ^10.0.0 @@ -32185,7 +32184,7 @@ __metadata: getopts: 2.3.0 interpret: ^2.2.0 lodash: ^4.17.21 - pg-connection-string: 2.6.1 + pg-connection-string: 2.6.2 rechoir: ^0.8.0 resolve-from: ^5.0.0 tarn: ^3.0.2 @@ -32207,7 +32206,7 @@ __metadata: optional: true bin: knex: bin/cli.js - checksum: bcfc3f8da9a7e898a873d2a122856ac9355f5ee1c0ab39534d6cac9ea69388da2fe0fa607b20d65298e191a4377af72f8ff7f4430f8b8c4abc144010b7e9796c + checksum: 3905f8d27960975f7f57f3f488d1ef3ccf47784acc8eb627e8a28cbbe1f296c6879c8ef0cbd9e17e867be80117d305cd948545f3fbd4c74b24c90d2413bbc021 languageName: node linkType: hard @@ -32394,7 +32393,14 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:2.1.0, lilconfig@npm:^2.0.3": +"lilconfig@npm:3.0.0": + version: 3.0.0 + resolution: "lilconfig@npm:3.0.0" + checksum: a155f1cd24d324ab20dd6974db9ebcf3fb6f2b60175f7c052d917ff8a746b590bc1ee550f6fc3cb1e8716c8b58304e22fe2193febebc0cf16fa86d85e6f896c5 + languageName: node + linkType: hard + +"lilconfig@npm:^2.0.3": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 @@ -32454,22 +32460,22 @@ __metadata: linkType: hard "lint-staged@npm:^15.0.0": - version: 15.1.0 - resolution: "lint-staged@npm:15.1.0" + version: 15.2.0 + resolution: "lint-staged@npm:15.2.0" dependencies: chalk: 5.3.0 commander: 11.1.0 debug: 4.3.4 execa: 8.0.1 - lilconfig: 2.1.0 - listr2: 7.0.2 + lilconfig: 3.0.0 + listr2: 8.0.0 micromatch: 4.0.5 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.3.4 bin: lint-staged: bin/lint-staged.js - checksum: e99bdedb32d20fa22c0d0798ecf014fd00ac9cce1158373d7caf47855c0b9b4c20d228417677a05ea81f6941f957ae9347dccb3846a48bc1fdd0cdeed2ccf0ef + checksum: 4fb178b8d3ff454f7874697dfbd41017630f61a06296d12ac9dfd578d078c70aff7108b67fab38af94896ef2740a1e7541c1512d0d3c688ed90e6c3af3530f0d languageName: node linkType: hard @@ -32480,17 +32486,17 @@ __metadata: languageName: node linkType: hard -"listr2@npm:7.0.2": - version: 7.0.2 - resolution: "listr2@npm:7.0.2" +"listr2@npm:8.0.0": + version: 8.0.0 + resolution: "listr2@npm:8.0.0" dependencies: - cli-truncate: ^3.1.0 + cli-truncate: ^4.0.0 colorette: ^2.0.20 eventemitter3: ^5.0.1 - log-update: ^5.0.1 + log-update: ^6.0.0 rfdc: ^1.3.0 - wrap-ansi: ^8.1.0 - checksum: 1734c6b9367ceeb09bf372427930a4586b3727097373408f2f840896b9333cc80e53a1a696771a83a7d4d9ada46229843f3052b87f3b0b58c20e9451362c2dd3 + wrap-ansi: ^9.0.0 + checksum: 5cb110a710d14488c71d2207fc5141256abb1f21cbe5ebc12177ae640f94e040a1ef8c031b70ff9f24c4a8fa57c0825a54b534e52bdfaffc122a81082faae8ed languageName: node linkType: hard @@ -32843,16 +32849,16 @@ __metadata: languageName: node linkType: hard -"log-update@npm:^5.0.1": - version: 5.0.1 - resolution: "log-update@npm:5.0.1" +"log-update@npm:^6.0.0": + version: 6.0.0 + resolution: "log-update@npm:6.0.0" dependencies: - ansi-escapes: ^5.0.0 + ansi-escapes: ^6.2.0 cli-cursor: ^4.0.0 - slice-ansi: ^5.0.0 - strip-ansi: ^7.0.1 - wrap-ansi: ^8.0.1 - checksum: 2c6b47dcce6f9233df6d232a37d9834cb3657a0749ef6398f1706118de74c55f158587d4128c225297ea66803f35c5ac3db4f3f617046d817233c45eedc32ef1 + slice-ansi: ^7.0.0 + strip-ansi: ^7.1.0 + wrap-ansi: ^9.0.0 + checksum: 8803ceba2fb28626951b85de598c8d5a4f5e39f1f767cc54fd925412cc7780ba89ce1dbec24dc96fa46f89d226e1ae984534aa729dc9c9b734e36bb805428ffa languageName: node linkType: hard @@ -34088,13 +34094,13 @@ __metadata: linkType: hard "mini-css-extract-plugin@npm:^2.4.2": - version: 2.7.6 - resolution: "mini-css-extract-plugin@npm:2.7.6" + version: 2.7.7 + resolution: "mini-css-extract-plugin@npm:2.7.7" dependencies: schema-utils: ^4.0.0 peerDependencies: webpack: ^5.0.0 - checksum: be6f7cefc6275168eb0a6b8fe977083a18c743c9612c9f00e6c1a62c3393ca7960e93fba1a7ebb09b75f36a0204ad087d772c1ef574bc29c90c0e8175a3c0b83 + checksum: 04af0e7d8c1a4ff31c70ac2d0895837dae3d51cce3bfd90e3c1d90d50eef7de21778361a3064531df046d775d80b3bf056324dddea93831c7def2047c5aa8718 languageName: node linkType: hard @@ -34540,38 +34546,38 @@ __metadata: linkType: hard "msw@npm:^2.0.0, msw@npm:^2.0.8": - version: 2.0.11 - resolution: "msw@npm:2.0.11" + version: 2.1.2 + resolution: "msw@npm:2.1.2" dependencies: "@bundled-es-modules/cookie": ^2.0.0 "@bundled-es-modules/js-levenshtein": ^2.0.1 "@bundled-es-modules/statuses": ^1.0.1 "@mswjs/cookies": ^1.1.0 - "@mswjs/interceptors": ^0.25.13 + "@mswjs/interceptors": ^0.25.14 "@open-draft/until": ^2.1.0 - "@types/cookie": ^0.4.1 - "@types/js-levenshtein": ^1.1.1 - "@types/statuses": ^2.0.1 + "@types/cookie": ^0.6.0 + "@types/js-levenshtein": ^1.1.3 + "@types/statuses": ^2.0.4 chalk: ^4.1.2 chokidar: ^3.4.2 graphql: ^16.8.1 - headers-polyfill: ^4.0.1 + headers-polyfill: ^4.0.2 inquirer: ^8.2.0 is-node-process: ^1.2.0 js-levenshtein: ^1.1.6 - outvariant: ^1.4.0 + outvariant: ^1.4.2 path-to-regexp: ^6.2.0 - strict-event-emitter: ^0.5.0 - type-fest: ^2.19.0 - yargs: ^17.3.1 + strict-event-emitter: ^0.5.1 + type-fest: ^4.9.0 + yargs: ^17.7.2 peerDependencies: - typescript: ">= 4.7.x <= 5.2.x" + typescript: ">= 4.7.x <= 5.3.x" peerDependenciesMeta: typescript: optional: true bin: msw: cli/index.js - checksum: a87175f53e3b510dfdfb16e11f2b0d399a9859ce1f249a70741045ce6325b3512075878921d4bd30ad6cb0789cd6fc4f9eac5db68ae425777e96ad208285242d + checksum: 58b6e9ad480f5a3e7b7f6d32e9ea87a4b8b4940614991d8762f4b8a319f9d04fef8db4207bb427450f033cdade9495ef5b87dde91e26ded257c98e3544529cef languageName: node linkType: hard @@ -35095,8 +35101,8 @@ __metadata: linkType: hard "nodemon@npm:^3.0.1": - version: 3.0.2 - resolution: "nodemon@npm:3.0.2" + version: 3.0.3 + resolution: "nodemon@npm:3.0.3" dependencies: chokidar: ^3.5.2 debug: ^4 @@ -35110,7 +35116,7 @@ __metadata: undefsafe: ^2.0.5 bin: nodemon: bin/nodemon.js - checksum: 61f3dd207ad444f4a7a2f1aa44adc886605c96c7bc6286291c2360e5e2cd26c3828c90a1418a60783a9da2463593383149135a5a4c099918c54d34a611745499 + checksum: 121ebb6349167d87cefd5767ec453ceb49ec5a8d50146134a54b0e25502c29ad01caaa41460e303b35728439012564782d278b3fef3c615f3c278979c2b7d586 languageName: node linkType: hard @@ -35690,14 +35696,14 @@ __metadata: linkType: hard "openid-client@npm:^5.2.1, openid-client@npm:^5.3.0, openid-client@npm:^5.4.3": - version: 5.6.2 - resolution: "openid-client@npm:5.6.2" + version: 5.6.4 + resolution: "openid-client@npm:5.6.4" dependencies: jose: ^4.15.4 lru-cache: ^6.0.0 object-hash: ^2.2.0 oidc-token-hash: ^5.0.3 - checksum: e61bc7170bb53d9b50098476b68b72e07f93769caae8ae12ffb885c2dac5fb2fdf6de437a9eb29c5501f52b296f01c083de8d6f3500f2999fc863c9f9f5142fa + checksum: 69843f078dacbbc6bad6d65ca6689414ac73f095dfe2f8e606822e6cfc9d9cd7d0dfaf2649352eda604653806f0ea65326ad2d6266da897e4740ec93d26d21f6 languageName: node linkType: hard @@ -35776,10 +35782,10 @@ __metadata: languageName: node linkType: hard -"outvariant@npm:^1.2.1, outvariant@npm:^1.4.0": - version: 1.4.0 - resolution: "outvariant@npm:1.4.0" - checksum: ec32dfc315c464bb6e4906b2f450d259ce0b86caf70b70b249054359d9af21a7fccf53a8b6aa232f8d718449e31c1cfa594e6ebffaafe7bf908b502495256d7b +"outvariant@npm:^1.2.1, outvariant@npm:^1.4.0, outvariant@npm:^1.4.2": + version: 1.4.2 + resolution: "outvariant@npm:1.4.2" + checksum: 5d9e2b3edb1cc8be9cbfc1c8c97e8b05137c4384bbfc56e0a465de26c5d2f023e65732ddcda9d46599b06d667fbc0de32c30d2ecd11f6f3f43bcf8ce0d320918 languageName: node linkType: hard @@ -36567,14 +36573,7 @@ __metadata: languageName: node linkType: hard -"pg-connection-string@npm:2.6.1": - version: 2.6.1 - resolution: "pg-connection-string@npm:2.6.1" - checksum: 882344a47e1ecf3a91383e0809bf2ac48facea97fcec0358d6e060e1cbcb8737acde419b4c86f05da4ce4a16634ee50fff1d2bb787d73b52ccbfde697243ad8a - languageName: node - linkType: hard - -"pg-connection-string@npm:^2.3.0, pg-connection-string@npm:^2.5.0, pg-connection-string@npm:^2.6.2": +"pg-connection-string@npm:2.6.2, pg-connection-string@npm:^2.3.0, pg-connection-string@npm:^2.5.0, pg-connection-string@npm:^2.6.2": version: 2.6.2 resolution: "pg-connection-string@npm:2.6.2" checksum: 22265882c3b6f2320785378d0760b051294a684989163d5a1cde4009e64e84448d7bf67d9a7b9e7f69440c3ee9e2212f9aa10dd17ad6773f6143c6020cebbcb5 @@ -36700,6 +36699,13 @@ __metadata: languageName: node linkType: hard +"picomatch-browser@npm:^2.2.6": + version: 2.2.6 + resolution: "picomatch-browser@npm:2.2.6" + checksum: 946c50a8654da43167a0f9a90dd0b50f3d4e830ee71c0926ee9052d7e6f40d8907deaafba19cea71b97207b4aaa52c245335e4cd5bbaf78fe2ba567cd0c341fa + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3, picomatch@npm:^2.3.0, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -36843,27 +36849,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.40.1": - version: 1.40.1 - resolution: "playwright-core@npm:1.40.1" +"playwright-core@npm:1.41.0": + version: 1.41.0 + resolution: "playwright-core@npm:1.41.0" bin: playwright-core: cli.js - checksum: 84d92fb9b86e3c225b16b6886bf858eb5059b4e60fa1205ff23336e56a06dcb2eac62650992dede72f406c8e70a7b6a5303e511f9b4bc0b85022ede356a01ee0 + checksum: 14671265916a1fd0c71d94640de19c48bcce3f7dec35530f10e349e97030ea44ffa8ee518cbf811501e3ab2b74874aecf917e46bf40fea0570db1d4bea1fe7ac languageName: node linkType: hard -"playwright@npm:1.40.1": - version: 1.40.1 - resolution: "playwright@npm:1.40.1" +"playwright@npm:1.41.0": + version: 1.41.0 + resolution: "playwright@npm:1.41.0" dependencies: fsevents: 2.3.2 - playwright-core: 1.40.1 + playwright-core: 1.41.0 dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 9e36791c1b4a649c104aa365fdd9d049924eeb518c5967c0e921aa38b9b00994aa6ee54784d6c2af194b3b494b6f69772673081ef53c6c4a4b2065af9955c4ba + checksum: e7c32136911c58e06b964fe7d33f8b3d8f6a067ae5218662a0811dd6c90e007db1774eb7e161f4aa748d760f404f4c066b7b7303c2b617f7448b6ee4b86c9999 languageName: node linkType: hard @@ -37097,27 +37103,27 @@ __metadata: languageName: node linkType: hard -"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" +"postcss-modules-local-by-default@npm:^4.0.0, postcss-modules-local-by-default@npm:^4.0.4": + version: 4.0.4 + resolution: "postcss-modules-local-by-default@npm:4.0.4" dependencies: icss-utils: ^5.0.0 postcss-selector-parser: ^6.0.2 postcss-value-parser: ^4.1.0 peerDependencies: postcss: ^8.1.0 - checksum: 2f8083687f3d6067885f8863dd32dbbb4f779cfcc7e52c17abede9311d84faf6d3ed8760e7c54c6380281732ae1f78e5e56a28baf3c271b33f450a11c9e30485 + checksum: 578b955b0773147890caa88c30b10dfc849c5b1412a47ad51751890dba16fca9528c3ab00a19b186a8c2c150c2d08e2ce64d3d907800afee1f37c6d38252e365 languageName: node linkType: hard -"postcss-modules-scope@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-scope@npm:3.0.0" +"postcss-modules-scope@npm:^3.0.0, postcss-modules-scope@npm:^3.1.1": + version: 3.1.1 + resolution: "postcss-modules-scope@npm:3.1.1" dependencies: postcss-selector-parser: ^6.0.4 peerDependencies: postcss: ^8.1.0 - checksum: 330b9398dbd44c992c92b0dc612c0626135e2cc840fee41841eb61247a6cfed95af2bd6f67ead9dd9d0bb41f5b0367129d93c6e434fa3e9c58ade391d9a5a138 + checksum: 9e9d23abb0babc7fa243be65704d72a5a9ceb2bded4dbaef96a88210d468b03c8c3158c197f4e22300c851f08c6fdddd6ebe65f44e4c34448b45b8a2e063a16d languageName: node linkType: hard @@ -37330,14 +37336,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.1.0, postcss@npm:^8.4.21, postcss@npm:^8.4.27": - version: 8.4.32 - resolution: "postcss@npm:8.4.32" +"postcss@npm:^8.1.0, postcss@npm:^8.4.27, postcss@npm:^8.4.33": + version: 8.4.33 + resolution: "postcss@npm:8.4.33" dependencies: nanoid: ^3.3.7 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 220d9d0bf5d65be7ed31006c523bfb11619461d296245c1231831f90150aeb4a31eab9983ac9c5c89759a3ca8b60b3e0d098574964e1691673c3ce5c494305ae + checksum: 6f98b2af4b76632a3de20c4f47bf0e984a1ce1a531cf11adcb0b1d63a6cbda0aae4165e578b66c32ca4879038e3eaad386a6be725a8fb4429c78e3c1ab858fe9 languageName: node linkType: hard @@ -37869,7 +37875,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.10.1, qs@npm:^6.10.2, qs@npm:^6.11.0, qs@npm:^6.9.1, qs@npm:^6.9.4, qs@npm:^6.9.6": +"qs@npm:^6.10.1, qs@npm:^6.10.2, qs@npm:^6.11.0, qs@npm:^6.11.2, qs@npm:^6.9.1, qs@npm:^6.9.4, qs@npm:^6.9.6": version: 6.11.2 resolution: "qs@npm:6.11.2" dependencies: @@ -37969,10 +37975,10 @@ __metadata: languageName: node linkType: hard -"ramda@npm:~0.29.0": - version: 0.29.0 - resolution: "ramda@npm:0.29.0" - checksum: 9ab26c06eb7545cbb7eebcf75526d6ee2fcaae19e338f165b2bf32772121e7b28192d6664d1ba222ff76188ba26ab307342d66e805dbb02c860560adc4d5dd57 +"ramda@npm:~0.29.1": + version: 0.29.1 + resolution: "ramda@npm:0.29.1" + checksum: df7c627597a66d5f317f6ba77ad17d7ba818efc9c2c4a638440bc23f2c651e823970ea05b05a28895738c0e4b738fadbdc17b2c97b3ad922826febc09c859c44 languageName: node linkType: hard @@ -38036,6 +38042,13 @@ __metadata: languageName: node linkType: hard +"rate-limiter-flexible@npm:^4.0.0": + version: 4.0.0 + resolution: "rate-limiter-flexible@npm:4.0.0" + checksum: defaa10e35d77399c4bbdeaa0e3f0028bcc5f6d678118d54496d5c01a4c9d5d56e16885e2ea339e7dd1ea056a3594bba24a18b5da236965f1d186fd52bdbe9fe + languageName: node + linkType: hard + "raw-body@npm:2.5.1": version: 2.5.1 resolution: "raw-body@npm:2.5.1" @@ -38336,11 +38349,11 @@ __metadata: linkType: hard "react-hook-form@npm:^7.12.2, react-hook-form@npm:^7.13.0": - version: 7.48.2 - resolution: "react-hook-form@npm:7.48.2" + version: 7.49.3 + resolution: "react-hook-form@npm:7.49.3" peerDependencies: react: ^16.8.0 || ^17 || ^18 - checksum: 39652d08f78f16e5234049ceeb794d8bcd4d146772aca99c6db8c5aea8926cd4a230d02098886a441074deefbc24ffcb5ed57bc7cb0009d950115f5b3e627f12 + checksum: 9769845e2749f5c9d1d033be3819bc572ffa67f19ec2e567c61a58d0d060107facdf8425aab253c2e667c00853b7706a50bd6739fca6228c284c9313420ca26f languageName: node linkType: hard @@ -38475,35 +38488,25 @@ __metadata: languageName: node linkType: hard -"react-redux@npm:^8.1.3": - version: 8.1.3 - resolution: "react-redux@npm:8.1.3" +"react-redux@npm:^9.0.4": + version: 9.1.0 + resolution: "react-redux@npm:9.1.0" dependencies: - "@babel/runtime": ^7.12.1 - "@types/hoist-non-react-statics": ^3.3.1 "@types/use-sync-external-store": ^0.0.3 - hoist-non-react-statics: ^3.3.2 - react-is: ^18.0.0 use-sync-external-store: ^1.0.0 peerDependencies: - "@types/react": ^16.8 || ^17.0 || ^18.0 - "@types/react-dom": ^16.8 || ^17.0 || ^18.0 - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - react-native: ">=0.59" - redux: ^4 || ^5.0.0-beta.0 + "@types/react": ^18.2.25 + react: ^18.0 + react-native: ">=0.69" + redux: ^5.0.0 peerDependenciesMeta: "@types/react": optional: true - "@types/react-dom": - optional: true - react-dom: - optional: true react-native: optional: true redux: optional: true - checksum: 192ea6f6053148ec80a4148ec607bc259403b937e515f616a1104ca5ab357e97e98b8245ed505a17afee67a72341d4a559eaca9607968b4a422aa9b44ba7eb89 + checksum: 1b07714379ff0087b4fb43ffd138cc84efb7608c874d632a4e2162e1874f3e0f6b69a0a9b0f24f93cbf122c694ac9cfd315770676d4cabb167d159f1ef419560 languageName: node linkType: hard @@ -38782,8 +38785,8 @@ __metadata: linkType: hard "react-use@npm:^17.2.4, react-use@npm:^17.3.1, react-use@npm:^17.3.2, react-use@npm:^17.4.0": - version: 17.4.2 - resolution: "react-use@npm:17.4.2" + version: 17.4.3 + resolution: "react-use@npm:17.4.3" dependencies: "@types/js-cookie": ^2.2.6 "@xobotyi/scrollbar-width": ^1.9.5 @@ -38802,17 +38805,17 @@ __metadata: peerDependencies: react: "*" react-dom: "*" - checksum: 1b15add951a80eee637045e5e769dd565edde47838da3d8d0e9a4a2cfd547eb59626b5c5b020ba3c067c01356d2042c5948c534a90729114a7fc7d1e18763d0c + checksum: efa54c795ca900902022096c4c87b2a8c2290fe1748f3b2bf4d31ad40bfa35c1520f67e3da5f0a227a6429256df7bca251d9323487652debc924de5208a9cedd languageName: node linkType: hard "react-virtualized-auto-sizer@npm:^1.0.11, react-virtualized-auto-sizer@npm:^1.0.6": - version: 1.0.20 - resolution: "react-virtualized-auto-sizer@npm:1.0.20" + version: 1.0.21 + resolution: "react-virtualized-auto-sizer@npm:1.0.21" peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - checksum: 2c616ec7587de64a46aa8c6c301e75fee87eb7a39013f25d940b0fe95eee5e8a8a3c109923e241b427752d71fba80f44cd2c8557750967df0777d99ebd16ba24 + react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 + react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 + checksum: 9c0929a0363b3b3b10ad65ac57d7562a20966a9c38c28c10dfd296d0a6a3e678319dce2384c5177f43965c2b7f226f5766deffc4b7eaaab0ee7c2cfe0c7d6b48 languageName: node linkType: hard @@ -39012,8 +39015,8 @@ __metadata: linkType: hard "recharts@npm:^2.5.0": - version: 2.10.3 - resolution: "recharts@npm:2.10.3" + version: 2.10.4 + resolution: "recharts@npm:2.10.4" dependencies: clsx: ^2.0.0 eventemitter3: ^4.0.1 @@ -39027,7 +39030,7 @@ __metadata: prop-types: ^15.6.0 react: ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 503c9fefa8648e0e8834a11ccc09fdcc310d391807438f4c0567b1888d7cd5f7a1f65f020afb981ec54ad6f96d31ebe757ab9025e93782edabc5c741f1aa946a + checksum: f283a21367aa675af83ada6d92ebd7bfa8931ba805bba34ee6247f74cba1b5d37c5fd48d20baa3533bbd3f0a98a1566e5d3733d23825caee8b256dd66ae5ff2c languageName: node linkType: hard @@ -39109,7 +39112,7 @@ __metadata: languageName: node linkType: hard -"redux@npm:^4.0.0, redux@npm:^4.0.4, redux@npm:^4.1.2": +"redux@npm:^4.0.0, redux@npm:^4.0.4": version: 4.1.2 resolution: "redux@npm:4.1.2" dependencies: @@ -39118,6 +39121,13 @@ __metadata: languageName: node linkType: hard +"redux@npm:^5.0.0": + version: 5.0.1 + resolution: "redux@npm:5.0.1" + checksum: e74affa9009dd5d994878b9a1ce30d6569d986117175056edb003de2651c05b10fe7819d6fa94aea1a94de9a82f252f986547f007a2fbeb35c317a2e5f5ecf2c + languageName: node + linkType: hard + "reflect-metadata@npm:0.1.13": version: 0.1.13 resolution: "reflect-metadata@npm:0.1.13" @@ -39421,10 +39431,10 @@ __metadata: languageName: node linkType: hard -"reselect@npm:^4.1.8": - version: 4.1.8 - resolution: "reselect@npm:4.1.8" - checksum: a4ac87cedab198769a29be92bc221c32da76cfdad6911eda67b4d3e7136dca86208c3b210e31632eae31ebd2cded18596f0dd230d3ccc9e978df22f233b5583e +"reselect@npm:^5.0.1": + version: 5.1.0 + resolution: "reselect@npm:5.1.0" + checksum: 5bc9c5d03d7caea00d0c0e24330bf23d91801227346fec1cef6a60988ab8d3dd7cee76e6994ca0915bc1c20845bb2bd929b95753763e0a9db74c0f9dff5cb845 languageName: node linkType: hard @@ -39954,12 +39964,12 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:7.8.0": - version: 7.8.0 - resolution: "rxjs@npm:7.8.0" +"rxjs@npm:7.8.1, rxjs@npm:^7.2.0, rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" dependencies: tslib: ^2.1.0 - checksum: 61b4d4fd323c1043d8d6ceb91f24183b28bcf5def4f01ca111511d5c6b66755bc5578587fe714ef5d67cf4c9f2e26f4490d4e1d8cabf9bd5967687835e9866a2 + checksum: de4b53db1063e618ec2eca0f7965d9137cabe98cf6be9272efe6c86b47c17b987383df8574861bcced18ebd590764125a901d5506082be84a8b8e364bf05f119 languageName: node linkType: hard @@ -39972,15 +39982,6 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.2.0, rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" - dependencies: - tslib: ^2.1.0 - checksum: de4b53db1063e618ec2eca0f7965d9137cabe98cf6be9272efe6c86b47c17b987383df8574861bcced18ebd590764125a901d5506082be84a8b8e364bf05f119 - languageName: node - linkType: hard - "sade@npm:^1.7.3": version: 1.8.1 resolution: "sade@npm:1.8.1" @@ -40295,11 +40296,11 @@ __metadata: linkType: hard "serialize-javascript@npm:^6.0.1": - version: 6.0.1 - resolution: "serialize-javascript@npm:6.0.1" + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" dependencies: randombytes: ^2.1.0 - checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f + checksum: c4839c6206c1d143c0f80763997a361310305751171dd95e4b57efee69b8f6edd8960a0b7fbfc45042aadff98b206d55428aee0dc276efe54f100899c7fa8ab7 languageName: node linkType: hard @@ -40667,6 +40668,16 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^7.0.0": + version: 7.1.0 + resolution: "slice-ansi@npm:7.1.0" + dependencies: + ansi-styles: ^6.2.1 + is-fullwidth-code-point: ^5.0.0 + checksum: 10313dd3cf7a2e4b265f527b1684c7c568210b09743fd1bd74f2194715ed13ffba653dc93a5fa79e3b1711518b8990a732cb7143aa01ddafe626e99dfa6474b2 + languageName: node + linkType: hard + "slugify@npm:^1.6.4": version: 1.6.6 resolution: "slugify@npm:1.6.6" @@ -41298,7 +41309,7 @@ __metadata: languageName: node linkType: hard -"strict-event-emitter@npm:^0.5.0, strict-event-emitter@npm:^0.5.1": +"strict-event-emitter@npm:^0.5.1": version: 0.5.1 resolution: "strict-event-emitter@npm:0.5.1" checksum: 350480431bc1c28fdb601ef4976c2f8155fc364b4740f9692dd03e5bdd48aafc99a5e021fe655fbd986d0b803e9f3fc5c4b018b35cb838c4690d60f2a26f1cf3 @@ -41354,7 +41365,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" dependencies: @@ -41365,6 +41376,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^7.0.0": + version: 7.0.0 + resolution: "string-width@npm:7.0.0" + dependencies: + emoji-regex: ^10.3.0 + get-east-asian-width: ^1.0.0 + strip-ansi: ^7.1.0 + checksum: bc0de5700a2690895169fce447ec4ed44bc62de80312c2093d5606bfd48319bb88e48a99e97f269dff2bc9577448b91c26b3804c16e7d9b389699795e4655c3b + languageName: node + linkType: hard + "string.prototype.matchall@npm:^4.0.8": version: 4.0.8 resolution: "string.prototype.matchall@npm:4.0.8" @@ -41584,11 +41606,11 @@ __metadata: linkType: hard "style-loader@npm:^3.3.1": - version: 3.3.3 - resolution: "style-loader@npm:3.3.3" + version: 3.3.4 + resolution: "style-loader@npm:3.3.4" peerDependencies: webpack: ^5.0.0 - checksum: f59c953f56f6a935bd6a1dfa409f1128fed2b66b48ce4a7a75b85862a7156e5e90ab163878962762f528ec4d510903d828da645e143fbffd26f055dc1c094078 + checksum: caac3f2fe2c3c89e49b7a2a9329e1cfa515ecf5f36b9c4885f9b218019fda207a9029939b2c35821dec177a264a007e7c391ccdd3ff7401881ce6287b9c8f38b languageName: node linkType: hard @@ -41682,12 +41704,12 @@ __metadata: linkType: hard "sucrase@npm:^3.20.2": - version: 3.34.0 - resolution: "sucrase@npm:3.34.0" + version: 3.35.0 + resolution: "sucrase@npm:3.35.0" dependencies: "@jridgewell/gen-mapping": ^0.3.2 commander: ^4.0.0 - glob: 7.1.6 + glob: ^10.3.10 lines-and-columns: ^1.1.6 mz: ^2.7.0 pirates: ^4.0.1 @@ -41695,13 +41717,13 @@ __metadata: bin: sucrase: bin/sucrase sucrase-node: bin/sucrase-node - checksum: 61860063bdf6103413698e13247a3074d25843e91170825a9752e4af7668ffadd331b6e99e92fc32ee5b3c484ee134936f926fa9039d5711fafff29d017a2110 + checksum: 9fc5792a9ab8a14dcf9c47dcb704431d35c1cdff1d17d55d382a31c2e8e3063870ad32ce120a80915498486246d612e30cda44f1624d9d9a10423e1a43487ad1 languageName: node linkType: hard -"superagent@npm:^8.0.5": - version: 8.0.9 - resolution: "superagent@npm:8.0.9" +"superagent@npm:^8.1.2": + version: 8.1.2 + resolution: "superagent@npm:8.1.2" dependencies: component-emitter: ^1.3.0 cookiejar: ^2.1.4 @@ -41713,17 +41735,17 @@ __metadata: mime: 2.6.0 qs: ^6.11.0 semver: ^7.3.8 - checksum: 5d00cdc7ceb5570663da80604965750e6b1b8d7d7442b7791e285c62bcd8d578a8ead0242a2426432b59a255fb42eb3a196d636157538a1392e7b6c5f1624810 + checksum: f3601c5ccae34d5ba684a03703394b5d25931f4ae2e1e31a1de809f88a9400e997ece037f9accf148a21c408f950dc829db1e4e23576a7f9fe0efa79fd5c9d2f languageName: node linkType: hard "supertest@npm:^6.1.3, supertest@npm:^6.1.6, supertest@npm:^6.2.4, supertest@npm:^6.3.3": - version: 6.3.3 - resolution: "supertest@npm:6.3.3" + version: 6.3.4 + resolution: "supertest@npm:6.3.4" dependencies: methods: ^1.1.2 - superagent: ^8.0.5 - checksum: 38239e517f7ba62b7a139a79c5c48d55f8d67b5ff4b6e51d5b07732ca8bbc4a28ffa1b10916fbb403dd013a054dbf028edc5850057d9a43aecbff439d494673e + superagent: ^8.1.2 + checksum: 875c6fa7940f21e5be9bb646579cdb030d4057bf2da643e125e1f0480add1200395d2b17e10b8e54e1009efc63e047422501e9eb30e12828668498c0910f295f languageName: node linkType: hard @@ -41801,16 +41823,16 @@ __metadata: languageName: node linkType: hard -"swagger-client@npm:^3.24.6": - version: 3.24.6 - resolution: "swagger-client@npm:3.24.6" +"swagger-client@npm:^3.25.0": + version: 3.25.0 + resolution: "swagger-client@npm:3.25.0" dependencies: "@babel/runtime-corejs3": ^7.22.15 - "@swagger-api/apidom-core": ">=0.83.0 <1.0.0" - "@swagger-api/apidom-error": ">=0.83.0 <1.0.0" - "@swagger-api/apidom-json-pointer": ">=0.83.0 <1.0.0" - "@swagger-api/apidom-ns-openapi-3-1": ">=0.83.0 <1.0.0" - "@swagger-api/apidom-reference": ">=0.83.0 <1.0.0" + "@swagger-api/apidom-core": ">=0.90.0 <1.0.0" + "@swagger-api/apidom-error": ">=0.90.0 <1.0.0" + "@swagger-api/apidom-json-pointer": ">=0.90.0 <1.0.0" + "@swagger-api/apidom-ns-openapi-3-1": ">=0.90.0 <1.0.0" + "@swagger-api/apidom-reference": ">=0.90.0 <1.0.0" cookie: ~0.6.0 deepmerge: ~4.3.0 fast-json-patch: ^3.0.0-1 @@ -41821,18 +41843,18 @@ __metadata: qs: ^6.10.2 traverse: ~0.6.6 undici: ^5.24.0 - checksum: 8bb1aeea4576fdd88543c4e011b1f087c52b34e5a069d560937a5c32a6e1e6c7eda243810886f8b09e4e12062e8f2768edaa5e6193140a28f9604bac42b18104 + checksum: 2e989059b4edeab26b148993cea8a68c4ad34927d4058479f2722c01d8bd0f67bfb1f69dc93ce24a5adb5a8e0f45e4438ad38f8bfb70f8d0b1a8d66650abe060 languageName: node linkType: hard "swagger-ui-react@npm:^5.0.0": - version: 5.10.5 - resolution: "swagger-ui-react@npm:5.10.5" + version: 5.11.0 + resolution: "swagger-ui-react@npm:5.11.0" dependencies: - "@babel/runtime-corejs3": ^7.23.5 - "@braintree/sanitize-url": =6.0.4 + "@babel/runtime-corejs3": ^7.23.7 + "@braintree/sanitize-url": =7.0.0 base64-js: ^1.5.1 - classnames: ^2.3.1 + classnames: ^2.5.1 css.escape: 1.5.1 deep-extend: 0.6.0 dompurify: =3.0.6 @@ -41850,23 +41872,23 @@ __metadata: react-immutable-proptypes: 2.2.0 react-immutable-pure-component: ^2.2.0 react-inspector: ^6.0.1 - react-redux: ^8.1.3 + react-redux: ^9.0.4 react-syntax-highlighter: ^15.5.0 - redux: ^4.1.2 + redux: ^5.0.0 redux-immutable: ^4.0.0 remarkable: ^2.0.1 - reselect: ^4.1.8 + reselect: ^5.0.1 serialize-error: ^8.1.0 sha.js: ^2.4.11 - swagger-client: ^3.24.6 + swagger-client: ^3.25.0 url-parse: ^1.5.10 xml: =1.0.1 xml-but-prettier: ^1.0.1 zenscroll: ^4.0.2 peerDependencies: - react: ">=17.0.0" - react-dom: ">=17.0.0" - checksum: 79256d68d56389d089a953f7d6c3a95a67c0b4e2794ae3992ba60adc0312aeb4446d8ba1e20687fcd7708d562e7c15fa733dbcb54cd8f99948ebf4c4513fa042 + react: ">=16.8.0 <19" + react-dom: ">=16.8.0 <19" + checksum: f46acfe503f80566f5a28c5a7a27091f80a764d4602e81ef2dc59466097bdf0e6f6568b866a0a90ab23db39a88fe6f5e4d96b3d5367d05b8ecedb256477fb1cb languageName: node linkType: hard @@ -42608,17 +42630,10 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.0.3": - version: 2.0.3 - resolution: "tslib@npm:2.0.3" - checksum: 00fcdd1f9995c9f8eb6a4a1ad03f55bc95946321b7f55434182dddac259d4e095fedf78a84f73b6e32dd3f881d9281f09cb583123d3159ed4bdac9ad7393ef8b - languageName: node - linkType: hard - -"tslib@npm:2.5.0": - version: 2.5.0 - resolution: "tslib@npm:2.5.0" - checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 +"tslib@npm:2.6.2, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.4.1 || ^1.9.3, tslib@npm:^2.5.0, tslib@npm:^2.6.0, tslib@npm:^2.6.2": + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad languageName: node linkType: hard @@ -42629,13 +42644,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.4.1 || ^1.9.3, tslib@npm:^2.5.0, tslib@npm:^2.6.0, tslib@npm:^2.6.2": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad - languageName: node - linkType: hard - "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -42648,10 +42656,10 @@ __metadata: linkType: hard "tsx@npm:^4.0.0": - version: 4.6.2 - resolution: "tsx@npm:4.6.2" + version: 4.7.0 + resolution: "tsx@npm:4.7.0" dependencies: - esbuild: ~0.18.20 + esbuild: ~0.19.10 fsevents: ~2.3.3 get-tsconfig: ^4.7.2 dependenciesMeta: @@ -42659,7 +42667,7 @@ __metadata: optional: true bin: tsx: dist/cli.mjs - checksum: a9f13bdb67bfb316bbfc92303d8464323ab1b673aa93ea97271c211a8ba7c59274d4b32eeec5ad8fbd0b04260a092a3ad2116abeb6913254ba456010ff685743 + checksum: a3a17fa8a40dbe0aff26fb2bc71a069e568152e0685b0bd9a31ea1091806274ba14882551433ed01efa7eae16f1aa965e2e47f3075ec1e914c42cf5dfce1f924 languageName: node linkType: hard @@ -42777,13 +42785,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^1.0.2": - version: 1.4.0 - resolution: "type-fest@npm:1.4.0" - checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 - languageName: node - linkType: hard - "type-fest@npm:^2.19.0": version: 2.19.0 resolution: "type-fest@npm:2.19.0" @@ -42791,6 +42792,20 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^3.0.0": + version: 3.13.1 + resolution: "type-fest@npm:3.13.1" + checksum: c06b0901d54391dc46de3802375f5579868949d71f93b425ce564e19a428a0d411ae8d8cb0e300d330071d86152c3ea86e744c3f2860a42a79585b6ec2fdae8e + languageName: node + linkType: hard + +"type-fest@npm:^4.9.0": + version: 4.9.0 + resolution: "type-fest@npm:4.9.0" + checksum: 73383de23237b399a70397a53101152548846d919aebcc7d8733000c6c354dc2632fe37c4a70b8571b79fdbfa099e2d8304c5ac56b3254780acff93e4c7a797f + languageName: node + linkType: hard + "type-is@npm:^1.6.4, type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -43029,12 +43044,12 @@ __metadata: languageName: node linkType: hard -"uid@npm:2.0.1": - version: 2.0.1 - resolution: "uid@npm:2.0.1" +"uid@npm:2.0.2": + version: 2.0.2 + resolution: "uid@npm:2.0.2" dependencies: "@lukeed/csprng": ^1.0.0 - checksum: 0a3c697d8dd1f3b647afa35c411b11fd8fa2fb6dbd8a49fe109a4aa5214068c2c58781aa6e4516dfd16f0fc524fb7bba0833e9c1dc1ed3f1965b520349be9ad5 + checksum: 98aabddcd6fe46f9b331b0378a93ee9cc51474348ada02006df9d10b4abc783ed596748ed9f20d7f6c5ff395dbcd1e764a65a68db6f39a31c95ae85ef13fe979 languageName: node linkType: hard @@ -43876,8 +43891,8 @@ __metadata: linkType: hard "vite-plugin-html@npm:^3.2.0": - version: 3.2.1 - resolution: "vite-plugin-html@npm:3.2.1" + version: 3.2.2 + resolution: "vite-plugin-html@npm:3.2.2" dependencies: "@rollup/pluginutils": ^4.2.0 colorette: ^2.0.16 @@ -43893,27 +43908,25 @@ __metadata: pathe: ^0.2.0 peerDependencies: vite: ">=2.0.0" - checksum: 6add7cd7a8f9e83b0c58b20cde2d4da7e132ef56db6a60f3d4cc7022c944896236aeca6bde4c6dc2da3d506f756f63de56251adc47f0ae359c07485b24dd64db + checksum: 2fd6e1f91f74a4432222ed28e68d5f27e58ccbc9ad44e71ff9d02b684b358b0c634bdb4dd32e9d93d09e88d83c3b7b74b89698e25510bc5b94173cdc067b3ac2 languageName: node linkType: hard -"vite-plugin-node-polyfills@npm:^0.17.0": - version: 0.17.0 - resolution: "vite-plugin-node-polyfills@npm:0.17.0" +"vite-plugin-node-polyfills@npm:^0.19.0": + version: 0.19.0 + resolution: "vite-plugin-node-polyfills@npm:0.19.0" dependencies: "@rollup/plugin-inject": ^5.0.5 - buffer-polyfill: "npm:buffer@^6.0.3" node-stdlib-browser: ^1.2.0 - process: ^0.11.10 peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - checksum: 760d29c25adfa72b5fc731c1bb0826f9c6cc495afc856d38f634ac811566b158a11b1ea968e5d9d536889072470666e9b933ca38ea0c533854375806503b1729 + checksum: f01962d9c0bdb97c22c8d8994396ae950350c2bbeebcc837303e520216390fb194423cde92a47df5c835375efb86f5b33cc8ab224b0a7bf8e3e2800a66630f60 languageName: node linkType: hard "vite@npm:^4.4.9": - version: 4.5.1 - resolution: "vite@npm:4.5.1" + version: 4.5.2 + resolution: "vite@npm:4.5.2" dependencies: esbuild: ^0.18.10 fsevents: ~2.3.2 @@ -43947,7 +43960,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 72b3584b3d3b8d14e8a37f0248e47fb8b4d02ab35de5b5a8e5ca8ae55c3be2aab73760dc36edac4fa722de182f78cc492eb44888fcb4a9a0712c4605dad644f9 + checksum: 9d1f84f703c2660aced34deee7f309278ed368880f66e9570ac115c793d91f7fffb80ab19c602b3c8bc1341fe23437d86a3fcca2a9ef82f7ef0cdac5a40d0c86 languageName: node linkType: hard @@ -44540,7 +44553,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": +"wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" dependencies: @@ -44551,6 +44564,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^9.0.0": + version: 9.0.0 + resolution: "wrap-ansi@npm:9.0.0" + dependencies: + ansi-styles: ^6.2.1 + string-width: ^7.0.0 + strip-ansi: ^7.1.0 + checksum: b2d43b76b3d8dcbdd64768165e548aad3e54e1cae4ecd31bac9966faaa7cf0b0345677ad6879db10ba58eb446ba8fa44fb82b4951872fd397f096712467a809f + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -44591,7 +44615,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:*, ws@npm:8.14.2, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.8.0": +"ws@npm:*, ws@npm:8.14.2, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.14.2, ws@npm:^8.8.0": version: 8.14.2 resolution: "ws@npm:8.14.2" peerDependencies: