diff --git a/.changeset/blue-lions-greet.md b/.changeset/blue-lions-greet.md
new file mode 100644
index 0000000000..c4f4d2a337
--- /dev/null
+++ b/.changeset/blue-lions-greet.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-user-settings': patch
+---
+
+Handle errors that may occur when the user logs out
diff --git a/.changeset/brown-grapes-battle.md b/.changeset/brown-grapes-battle.md
new file mode 100644
index 0000000000..f94c938b02
--- /dev/null
+++ b/.changeset/brown-grapes-battle.md
@@ -0,0 +1,8 @@
+---
+'@backstage/plugin-catalog-backend-module-bitbucket-cloud': minor
+---
+
+Bitbucket Cloud provider: Add option to configure schedule via `app-config.yaml` instead of in code.
+
+Please find how to configure the schedule at the config at
+https://backstage.io/docs/integrations/bitbucketCloud/discovery
diff --git a/.changeset/calm-moose-fetch.md b/.changeset/calm-moose-fetch.md
new file mode 100644
index 0000000000..96a364c801
--- /dev/null
+++ b/.changeset/calm-moose-fetch.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-catalog-react': minor
+'@backstage/plugin-catalog': patch
+---
+
+Implemented the visual parts of `EntityKindPicker` so that it can be shown alongside the other filters on the left side of your catalog pages.
diff --git a/.changeset/cuddly-bikes-tease.md b/.changeset/cuddly-bikes-tease.md
new file mode 100644
index 0000000000..d3fc8bd1bb
--- /dev/null
+++ b/.changeset/cuddly-bikes-tease.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-app-api': patch
+---
+
+Fixed a bug where gathered index routes would fail to bind routable extensions. This would typically show up when placing a routable extension in the entity page overview tab.
diff --git a/.changeset/curly-rats-itch.md b/.changeset/curly-rats-itch.md
new file mode 100644
index 0000000000..b6fba9dc1e
--- /dev/null
+++ b/.changeset/curly-rats-itch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Tweak the Jest Caching loader to only operate when in `watch` mode
diff --git a/.changeset/fuzzy-dolls-give.md b/.changeset/fuzzy-dolls-give.md
new file mode 100644
index 0000000000..4de4d2e128
--- /dev/null
+++ b/.changeset/fuzzy-dolls-give.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-tasks': patch
+---
+
+Added new function `readTaskScheduleDefinitionFromConfig` to read `TaskScheduleDefinition` (aka. schedule) from the `Config`.
diff --git a/.changeset/giant-pianos-repeat.md b/.changeset/giant-pianos-repeat.md
new file mode 100644
index 0000000000..d83ce285e3
--- /dev/null
+++ b/.changeset/giant-pianos-repeat.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch
+---
+
+Add `bitbucketCloudCatalogModule` (new backend-plugin-api, alpha).
diff --git a/.changeset/hot-geese-vanish.md b/.changeset/hot-geese-vanish.md
new file mode 100644
index 0000000000..b392c875c7
--- /dev/null
+++ b/.changeset/hot-geese-vanish.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': minor
+---
+
+Google OAuth refresh tokens will now be revoked on logout by calling Google's API
diff --git a/.changeset/large-jars-fry.md b/.changeset/large-jars-fry.md
new file mode 100644
index 0000000000..0da3f4302b
--- /dev/null
+++ b/.changeset/large-jars-fry.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-bazaar': patch
+---
+
+Link to the user catalog entity of a member
diff --git a/.changeset/lazy-eyes-switch.md b/.changeset/lazy-eyes-switch.md
new file mode 100644
index 0000000000..f712f852ae
--- /dev/null
+++ b/.changeset/lazy-eyes-switch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-user-settings-backend': patch
+---
+
+Use `Response.status` instead of `.send(number)`
diff --git a/.changeset/little-hats-yell.md b/.changeset/little-hats-yell.md
new file mode 100644
index 0000000000..6063459d8d
--- /dev/null
+++ b/.changeset/little-hats-yell.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-scaffolder-backend': minor
+---
+
+Update the `github:publish` action to allow passing whether pull
+requests must be up to date with the default branch before merging.
diff --git a/.changeset/mighty-lions-march.md b/.changeset/mighty-lions-march.md
new file mode 100644
index 0000000000..2f0b63d238
--- /dev/null
+++ b/.changeset/mighty-lions-march.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-vault-backend': patch
+---
+
+VaultBuilder.tsx renamed to VaultBuilder in order for module to be correctly loaded.
diff --git a/.changeset/old-melons-bathe.md b/.changeset/old-melons-bathe.md
new file mode 100644
index 0000000000..ac21377171
--- /dev/null
+++ b/.changeset/old-melons-bathe.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder': patch
+---
+
+Fixed a bug where the `allowed*` values for the `RepoUrlPicker` would be reset on render.
diff --git a/.changeset/plenty-laws-end.md b/.changeset/plenty-laws-end.md
new file mode 100644
index 0000000000..e026ca3fca
--- /dev/null
+++ b/.changeset/plenty-laws-end.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': patch
+---
+
+Fixed an issue where `getClient()` for a `pluginId` would return different clients and not share them
diff --git a/.changeset/pre.json b/.changeset/pre.json
index faed720d63..c5f8b30596 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -176,34 +176,65 @@
"@backstage/plugin-xcmetrics": "0.2.29"
},
"changesets": [
+ "blue-lions-greet",
+ "brave-peaches-brush",
"breezy-pots-worry",
"bright-rules-shout",
+ "calm-moose-fetch",
+ "calm-pianos-burn",
"clean-camels-sneeze",
+ "clever-ties-burn",
+ "cuddly-bikes-tease",
+ "curly-rats-itch",
"curvy-kiwis-fold",
"curvy-lemons-change",
+ "dry-shirts-attack",
"dull-rocks-warn",
"eleven-apples-accept",
"fair-tools-melt",
+ "fifty-berries-learn",
"grumpy-pans-knock",
+ "hot-geese-vanish",
"itchy-schools-run",
"kind-penguins-report",
"large-dingos-juggle",
"lazy-beds-pull",
"lazy-fireants-check",
"little-roses-rule",
+ "loud-dots-sit",
+ "lovely-peaches-fold",
"lucky-cows-boil",
+ "mean-spiders-design",
+ "mighty-lions-march",
+ "odd-pandas-suffer",
"odd-singers-taste",
"old-cobras-suffer",
+ "old-needles-brake",
"perfect-moose-drum",
+ "plenty-kids-fetch",
+ "plenty-laws-end",
"poor-clouds-ring",
+ "pretty-buttons-develop",
+ "quiet-dancers-jog",
"quiet-hats-kick",
"quiet-ligers-draw",
+ "rare-hotels-cough",
+ "red-dots-sleep",
"red-pants-rush",
+ "renovate-5da63a4",
"renovate-a02d90b",
"rich-carrots-reflect",
"rude-bulldogs-sleep",
+ "search-bobcats-love",
+ "search-cars-hide",
+ "search-clouds-begin",
+ "search-cycles-sniff",
+ "search-dull-planes-prove",
+ "search-rats-grin",
"selfish-turkeys-exist",
"shaggy-books-smell",
+ "silent-bees-repeat",
+ "silly-rules-join",
"sixty-items-nail",
"slow-mirrors-eat",
"smooth-tables-pull",
@@ -217,8 +248,11 @@
"thick-kings-destroy",
"tiny-mails-bathe",
"tough-hairs-sparkle",
+ "twelve-melons-notice",
+ "warm-days-watch",
"wild-weeks-live",
"wise-ligers-scream",
- "yellow-lemons-march"
+ "yellow-lemons-march",
+ "young-bugs-remember"
]
}
diff --git a/.changeset/pretty-buttons-develop.md b/.changeset/pretty-buttons-develop.md
new file mode 100644
index 0000000000..7c686df250
--- /dev/null
+++ b/.changeset/pretty-buttons-develop.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Auth0 provider now supports optional `connection` and `connectionScope` parameters to configure social identity providers.
diff --git a/.changeset/purple-masks-travel.md b/.changeset/purple-masks-travel.md
new file mode 100644
index 0000000000..65d0a5fe9b
--- /dev/null
+++ b/.changeset/purple-masks-travel.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-github': patch
+---
+
+Add missing config schema for the `GitHubEntityProvider`.
diff --git a/.changeset/rare-cougars-cross.md b/.changeset/rare-cougars-cross.md
new file mode 100644
index 0000000000..3bfb31ae3d
--- /dev/null
+++ b/.changeset/rare-cougars-cross.md
@@ -0,0 +1,16 @@
+---
+'@backstage/backend-common': patch
+'@backstage/cli': patch
+'@backstage/plugin-airbrake-backend': patch
+'@backstage/plugin-badges-backend': patch
+'@backstage/plugin-catalog-backend': patch
+'@backstage/plugin-graphql-backend': patch
+'@backstage/plugin-periskop-backend': patch
+'@backstage/plugin-permission-backend': patch
+'@backstage/plugin-rollbar-backend': patch
+'@backstage/plugin-search-backend': patch
+'@backstage/plugin-tech-insights-backend': patch
+'@backstage/plugin-user-settings-backend': patch
+---
+
+Use `response.json` rather than `response.send` where appropriate, as outlined in `SECURITY.md`
diff --git a/.changeset/rare-hotels-cough.md b/.changeset/rare-hotels-cough.md
new file mode 100644
index 0000000000..1a2395cf56
--- /dev/null
+++ b/.changeset/rare-hotels-cough.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-plugin-api': patch
+---
+
+Added documentation for `createBackendModule`, with guidelines for choosing a module ID.
diff --git a/.changeset/red-dots-sleep.md b/.changeset/red-dots-sleep.md
new file mode 100644
index 0000000000..0accac9734
--- /dev/null
+++ b/.changeset/red-dots-sleep.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Switching off duplicated timestamp in case of logging via task logger in a custom action
diff --git a/.changeset/search-bobcats-love.md b/.changeset/search-bobcats-love.md
new file mode 100644
index 0000000000..f562961c1b
--- /dev/null
+++ b/.changeset/search-bobcats-love.md
@@ -0,0 +1,28 @@
+---
+'@backstage/plugin-search-react': minor
+---
+
+The search query state now has an optional `pageLimit` property that determines how many results will be requested per page, it defaults to 25.
+
+Examples:
+_Basic_
+
+```jsx
+
+ {results => {
+ // Item rendering logic is omitted
+ }}
+
+```
+
+_With context_
+
+```jsx
+
+
+ {results => {
+ // Item rendering logic is omitted
+ }}
+
+
+```
diff --git a/.changeset/search-cars-hide.md b/.changeset/search-cars-hide.md
new file mode 100644
index 0000000000..b89662e90a
--- /dev/null
+++ b/.changeset/search-cars-hide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-search-common': minor
+---
+
+There is a new property called `pageLimit` on the `SearchQuery` interface that specifies how many results should be returned per page.
diff --git a/.changeset/search-clouds-begin.md b/.changeset/search-clouds-begin.md
new file mode 100644
index 0000000000..b3c6fa4b69
--- /dev/null
+++ b/.changeset/search-clouds-begin.md
@@ -0,0 +1,23 @@
+---
+'@backstage/plugin-search-react': minor
+---
+
+The `` component now accepts an optional property `disableRenderingWithNoResults` to disable rendering when no results are returned.
+Possibility to provide a custom no results component if needed through the `noResultsComponent` property.
+
+Examples:
+
+_Rendering a custom no results component_
+
+```jsx
+}
+/>
+```
+
+_Disable rendering when there are no results_
+
+```jsx
+
+```
diff --git a/.changeset/search-cycles-sniff.md b/.changeset/search-cycles-sniff.md
new file mode 100644
index 0000000000..350e499a18
--- /dev/null
+++ b/.changeset/search-cycles-sniff.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-search-backend-node': patch
+'@backstage/plugin-search-backend-module-pg': patch
+'@backstage/plugin-search-backend-module-elasticsearch': patch
+---
+
+The search engine has been updated to take advantage of the `pageLimit` property on search queries. If none is provided, the search engine will continue to use its default value of 25 results per page.
diff --git a/.changeset/search-dull-planes-prove.md b/.changeset/search-dull-planes-prove.md
new file mode 100644
index 0000000000..f185207ede
--- /dev/null
+++ b/.changeset/search-dull-planes-prove.md
@@ -0,0 +1,30 @@
+---
+'@backstage/plugin-search-react': minor
+---
+
+The `` component now accepts an optional property `disableRenderingWithNoResults` to disable rendering when no results are returned.
+Possibility to provide a custom no results component if needed through the `noResultsComponent` property.
+
+Examples:
+
+_Rendering a custom no results component_
+
+```jsx
+}
+ title="Documentation"
+ noResultsComponent={}
+/>
+```
+
+_Disable rendering when there are no results_
+
+```jsx
+}
+ title="Documentation"
+ disableRenderingWithNoResults
+/>
+```
diff --git a/.changeset/search-rats-grin.md b/.changeset/search-rats-grin.md
new file mode 100644
index 0000000000..7b561d9c19
--- /dev/null
+++ b/.changeset/search-rats-grin.md
@@ -0,0 +1,14 @@
+---
+'@backstage/plugin-search-backend': minor
+---
+
+The query received by search engines now contains a property called `pageLimit`, it specifies how many results to return per page when sending a query request to the search backend.
+
+Example:
+_Returns up to 30 results per page_
+
+```
+GET /query?pageLimit=30
+```
+
+The search backend validates the page limit and this value must not exceed 100, but it doesn't set a default value for the page limit parameter, it leaves it up to each search engine to set this, so Lunr, Postgres and Elastic Search set 25 results per page as a default value.
diff --git a/.changeset/slimy-suns-learn.md b/.changeset/slimy-suns-learn.md
new file mode 100644
index 0000000000..4a924a7a18
--- /dev/null
+++ b/.changeset/slimy-suns-learn.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Fixed setting default branch for Bitbucket Server
diff --git a/.changeset/tough-seahorses-learn.md b/.changeset/tough-seahorses-learn.md
new file mode 100644
index 0000000000..518b6b6967
--- /dev/null
+++ b/.changeset/tough-seahorses-learn.md
@@ -0,0 +1,26 @@
+---
+'@backstage/plugin-bazaar-backend': minor
+---
+
+**BREAKING** The bazaar-backend `createRouter` now requires that the `identityApi` is passed to the router.
+
+These changes are **required** to `packages/backend/src/plugins/bazaar.ts`
+
+The user entity ref is now added to the members table and is taken from the requesting user using the `identityApi`.
+
+```diff
+import { PluginEnvironment } from '../types';
+import { createRouter } from '@backstage/plugin-bazaar-backend';
+import { Router } from 'express';
+
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ return await createRouter({
+ logger: env.logger,
+ config: env.config,
+ database: env.database,
++ identity: env.identity,
+ });
+}
+```
diff --git a/.changeset/unlucky-seas-sip.md b/.changeset/unlucky-seas-sip.md
new file mode 100644
index 0000000000..947e248244
--- /dev/null
+++ b/.changeset/unlucky-seas-sip.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': minor
+---
+
+Added optional `sourcePath` parameter to `publish:gitlab:merge-request` action, `targetPath` is now optional and falls back to current workspace path.
diff --git a/.changeset/warm-days-watch.md b/.changeset/warm-days-watch.md
new file mode 100644
index 0000000000..b0a211c7a8
--- /dev/null
+++ b/.changeset/warm-days-watch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Added support for copy entity URL in entity page context menu
diff --git a/.changeset/young-bugs-remember.md b/.changeset/young-bugs-remember.md
new file mode 100644
index 0000000000..8f78495ed7
--- /dev/null
+++ b/.changeset/young-bugs-remember.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-catalog-backend-module-github': patch
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Updated the `moduleId` of the experimental module export.
diff --git a/.changeset/young-olives-cheer.md b/.changeset/young-olives-cheer.md
new file mode 100644
index 0000000000..536a8d6370
--- /dev/null
+++ b/.changeset/young-olives-cheer.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-github-issues': patch
+---
+
+Add filtering and ordering to the graphql query
diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml
index d6adca927e..87dec287d7 100644
--- a/.github/workflows/sync_snyk-monitor.yml
+++ b/.github/workflows/sync_snyk-monitor.yml
@@ -30,6 +30,7 @@ jobs:
--remote-repo-url=https://github.com/backstage/backstage
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
+ NODE_OPTIONS: --max-old-space-size=4096
# 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.
@@ -44,6 +45,7 @@ jobs:
--sarif-file-output=snyk.sarif
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
+ NODE_OPTIONS: --max-old-space-size=4096
- name: Upload Snyk report
uses: github/codeql-action/upload-sarif@v2
with:
diff --git a/ADOPTERS.md b/ADOPTERS.md
index e7e0e7784c..ca56a00890 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -1,7 +1,7 @@
# Adopters
_If you're using Backstage in your organization, please try to add your company name to this list. It really helps the project to gain momentum and credibility. It's a small contribution back to the project with a big impact._
-_You can do this by using the [Adopter form](https://form.typeform.com/to/zcOaKikB) or by editing this file after following the [CONTRIBUTING.md](./CONTRIBUTING.md)._
+_You can do this by using the [Adopter form](https://info.backstage.spotify.com/public-adopter-hand-raiser-form) or by editing this file after following the [CONTRIBUTING.md](./CONTRIBUTING.md)._
| Organization | Contact | Description of Use |
| --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -91,7 +91,7 @@ _You can do this by using the [Adopter form](https://form.typeform.com/to/zcOaKi
| [HBO Max](https://hbomax.com) | [@mdb](https://github.com/mdb), [@nesta219](https://github.com/nesta219), [@nmische](https://github.com/nmische), [@hbomark](https://github.com/hbomark) | Developer portal hosting service catalog and API documentation, as well as cloud infrastructure details, operational visibility tools, and a custom plugin for browsing notable platform change events, such as deployments and configuration updates. |
| [RCHLO](https://www.riachuelo.com.br) & [MIDWAY](https://www.midway.com.br) | [@marcosborges](https://github.com/marcosborges), [@defaultbr](https://github.com/defaultbr) | Self-Service Platform |
| [HP Inc](https://www.hp.com) | [Damon Kaswell](https://github.com/dekoding) | DevEx engagement hub (dev portal: docs, standards, Q&A) and extensive assets catalog (APIs, services, code, data, etc.) for the pan-HP internal developer community. |
-| [VMware](https://www.vmware.com) | [Waldir Montoya](https://github.com/waldirmontoya25), [Kris Applegate](https://github.com/krisapplegate), [Jamie Klassen](https://github.com/jamieklassen) | Part of [Tanzu Application Platform](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/index.html) offering; internal developer portal |
+| [VMware](https://www.vmware.com) | [Waldir Montoya](https://github.com/waldirmontoya25), [Kris Applegate](https://github.com/krisapplegate), [Jamie Klassen](https://github.com/jamieklassen) | Part of [Tanzu Application Platform](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/index.html) offering; internal developer portal |
| [Ualá](https://www.uala.com.ar/) | [Santiago Bernal](https://github.com/sabernal) | Initial work being done to centralize documentation for all our microservices and APIs, as well as scaffolding new services and tracking code quality |
| [IKEA IT AB](https://www.ingka.com) | [@bjornramberg](https://github.com/bjornramberg), [@supriyachitale](https://github.com/supriyachitale) | Supporting engineers at scale with self serve access and connecting the dots of our engineering platform and services, enabling product teams to move faster and go further, and unleashing innovation, reuse and co-creation across the organisation. |
| [Invitae](https://www.invitae.com/en) | [@ryan-hanchett](https://github.com/ryan-hanchett), [@gmandler42](https://github.com/gmandler42) | Centralized Developer Experience portal, putting all of our tooling behind a single pane of glass and creating a living service catalog. |
@@ -171,7 +171,7 @@ _You can do this by using the [Adopter form](https://form.typeform.com/to/zcOaKi
| [AEB](https://www.aeb.com/) | [David Fankhänel](mailto:dfl@aeb.com) | Central developer platform for creating new apps via templates, getting an overview via software catalog, etc |
| [SALTO Systems](https://saltosystems.com) | [Ian Cowley](mailto:i.cowley@saltosystems.com) | Currently using Backstage as an internal documentation portal. |
| [Lummo](https://lummo.com) | [Anjul Sahu](mailto:anjul@lummo.com) | We are building the internal developer portal using Backstage and bringing up all integrations and service information at one place. |
-| [Frontside](https://frontside.com/backstage) | [Taras Mankovski](mailto:taras@frontside.com) | An active community member and contributor, Frontside offers both custom development as well as enterprise support services to help teams get the most out of Backstage for the long-run. |
+| [Frontside](https://frontside.com/backstage) | [Taras Mankovski](mailto:taras@frontside.com) | An active community member and contributor, Frontside offers both custom development as well as enterprise support services to help teams get the most out of Backstage for the long-run. |
| [Stepstone](https://www.stepstone.com/en/) | [Neil Kennedy](mailto:neil.kennedy@stepstone.com) | StepStone is using Backstage to solve problems around ownership and visibility of our applications. We have thousands of repos, multiple legacy systems and a growing platform that is hard to maintain. Backstage is forming the centre of our push to embrace the chaos. |
| [idwall](https://idwall.co) | [Rodrigo Catão Araujo](mailto:rodrigo@idwall.co) | Developer Portal for internal engineers to access service catalog, documentation, observability, infrastructure and internal tooling. |
| [Jaguar Land Rover](https://www.jaguarlandrover.com) | [Josh Walker](mailto:jwalke18@jaguarlandrover.com) | Users can request a Gitlab user, which creates a commit with the Terraform code. |
@@ -202,16 +202,16 @@ _You can do this by using the [Adopter form](https://form.typeform.com/to/zcOaKi
| [Skillz](https://skillz.com/) | [Peiman Jafari](https://github.com/peimanja) | Internal developers portal for technical documentations, components ownership and relationship, software templates and integrations with internal tools |
| [Telus](https://www.telus.com/en/) | [Leo Li](mailto:leo.li@telus.com), [Laurent Robichaud](mailto:laurent.robichaud@telus.com), [Seb Barre](https://github.com/sbarre) | Simplifying the developer experience through centralized team member portals. Our current focus includes the adoption of Tech Docs, Software Catalog, Software Templates, the plethora of plugins, and contributing features back to Backstage. 🤖 |
| [Fidelity Investments](https://fidelity.com) | [Ankita Upadhyay](mailto:ankita.upadhyay@fmr.com) | Getting started with the adoption for Monorepo projects |
-| [Verisk](https://verisk.com) | [Callen Barton](mailto:#xw_architecture@verisk.com), [Kevin Johnson](mailto:#xw_architecture@verisk.com) | Developer portal to quickly create and deploy microservices. |
+| [Verisk](https://verisk.com) | [Callen Barton](mailto:#xw_architecture@verisk.com), [Kevin Johnson](mailto:#xw_architecture@verisk.com) | Developer portal to quickly create and deploy microservices. |
| [iodigital](https://iodigital.com) | [Jan-Willem Mulder](mailto:jan-willem.mulder@iodigital.com) | Internal developer portal for discovery of applications, projects and teams. Using several plugins like the Software Catalog and Tech Insights for promoting best practices and supporting our SDLC toolchain |
| [Fanatics](https://www.fanaticsinc.com/) | [Rory Scott](mailto:rscott@fanatics.com) | Internal Portal consolidating documentation, making it easier to manage applications, internal developer community platform, and self-service cloud infrastructure + pipelines. |
| [Appfolio](https://appfolio.com) | [Andy Vaughn](mailto:andy.vaughn@appfolio.com) | Internal software catalog, tech radar, documentation portal to disambiguate software and domain ownership, foster exploration of available developer platform services and tools, improve communication, democratize documentation and knowledge sharing, and coordinate the software lifecycle; all in service of a best-in-class developer experience. |
| [isaac](https://isaac.com.br/) | [Leonardo Borges](mailto:leonardo.borges@isaac.com.br), [Ordilei Souza](mailto:ordilei.souza@isaac.com.br) | We're using Backstage as our Internal Developer Portal and main microservices catalog for mapping ownership, health and metrics for each one. |
-| [Paraná Banco](https://site.paranabanco.com.br/) | [Joao Antunes](mailto:joaopma@pbtech.net.br) | Internal software catalog, documentation and ownership, improve communication, democratize documentation and knowledge sharing, and coordinate the software lifecycle; all in service of a best-in-class developer experience. |
-| [Stone](https://stone.com.br/) | [Levy Fialho](mailto:lfialho@stone.com.br) | We're using Backstage as our Credit Team Developer Portal and microservices catalog for mapping ownership. We are also using mkdocs for microservices documentation. |
+| [Paraná Banco](https://site.paranabanco.com.br/) | [Joao Antunes](mailto:joaopma@pbtech.net.br) | Internal software catalog, documentation and ownership, improve communication, democratize documentation and knowledge sharing, and coordinate the software lifecycle; all in service of a best-in-class developer experience. |
+| [Stone](https://stone.com.br/) | [Levy Fialho](mailto:lfialho@stone.com.br) | We're using Backstage as our Credit Team Developer Portal and microservices catalog for mapping ownership. We are also using mkdocs for microservices documentation. |
| [REI](https://www.rei.com/) | [Jen Evans](mailto:jenevan@rei.com) | Developer portal focused on an enterprise-wide app catalog to track ownership and surface APIs. |
| [next](https://next.me) | [Devan Jeronimo Nack](mailto:devan.j.nack@next.me), [Everson Crusara](mailto:everson.crusara@next.me), [Thiago Carneiro da Silva](mailto:thiagoc.silva@next.me) | We are building our Internal Developer Portal using Backstage to improve developer's experience by centralizing our services catalog and identifing microservices' ownership. Also we are going to improve Technical Documentation and speed up development using software templates to help squads in creation and deployment of new microservices. |
-| [Vipps](https://vipps.no) | [Martin Ehrnst](https://github.com/ehrnst) | Vipps use backstage for our service catalog, documentation, and developer portal. Using templates we are able to simplify the developer experience when deploying new services to our platform. |
-| [Ferrovial](https://ferrovial.com) | [Jose Luis Rosado](mailto:jlrosado@ferrovial.com) | Backstage is helping us to improve and acelerate dev experience helping teams to quickly find technical documentation, infrastructure templates, pipelines, software components and quickstarters that have been developed by our squads in a inner source friendly environment.
- |
-
+| [Vipps](https://vipps.no) | [Martin Ehrnst](https://github.com/ehrnst) | Vipps use backstage for our service catalog, documentation, and developer portal. Using templates we are able to simplify the developer experience when deploying new services to our platform. |
+| [Ferrovial](https://ferrovial.com) | [Jose Luis Rosado](mailto:jlrosado@ferrovial.com) | Backstage is helping us to improve and acelerate dev experience helping teams to quickly find technical documentation, infrastructure templates, pipelines, software components and quickstarters that have been developed by our squads in a inner source friendly environment. |
+| [Inter&Co](https://bancointer.com.br) | [Arnaud Lanna](https://github.com/arnaudlanna), [Adriano Silva](https://github.com/adrianovss), [Bruno Grossi](https://github.com/begrossi) | We're using Backstage as our internal Developer Portal to catalog and collect repositories and microservices pieces of information like ownership, deployment time, and documentation. |
+| [StatusNeo](https://statusneo.com/) | [Karan Nangru](mailto:nangru@statusneo.com), [@NishkarshRaj](https://github.com/NishkarshRaj), and [Gaurav Sarien](mailto:gaurav.sarien@statusneo.com) | Harnessing the power of central catalog inventory and self-serving software templates |
diff --git a/app-config.yaml b/app-config.yaml
index 22ca1fcaff..57349d213a 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -138,6 +138,11 @@ techdocs:
dynatrace:
baseUrl: https://your.dynatrace.instance.com
+# Score-cards sample configuration.
+scorecards:
+ jsonDataUrl: https://raw.githubusercontent.com/Oriflame/backstage-plugins/main/plugins/score-card/sample-data/
+ wikiLinkTemplate: https://link-to-wiki/{id}
+
sentry:
organization: my-company
diff --git a/contrib/docs/tutorials/authenticate-api-requests.md b/contrib/docs/tutorials/authenticate-api-requests.md
index 45ae38b8b7..c8f4083a0c 100644
--- a/contrib/docs/tutorials/authenticate-api-requests.md
+++ b/contrib/docs/tutorials/authenticate-api-requests.md
@@ -8,30 +8,28 @@ API requests from frontend plugins include an authorization header with a Backst
As techdocs HTML pages load assets without an Authorization header the code below also sets a token cookie when the user logs in (and when the token is about to expire).
+Create `packages/backend/src/authMiddleware.ts`:
+
```typescript
-// packages/backend/src/index.ts from a create-app deployment
-
-import cookieParser from 'cookie-parser';
-import { Request, Response, NextFunction } from 'express';
-import { JWT } from 'jose';
-import { URL } from 'url';
+import { SingleHostDiscovery } from '@backstage/backend-common';
+import type { Config } from '@backstage/config';
import {
- IdentityClient,
getBearerTokenFromAuthorizationHeader,
+ IdentityClient,
} from '@backstage/plugin-auth-node';
-
-// ...
+import { NextFunction, Request, Response, RequestHandler } from 'express';
+import { decodeJwt } from 'jose';
+import { URL } from 'url';
+import { PluginEnvironment } from './types';
function setTokenCookie(
res: Response,
options: { token: string; secure: boolean; cookieDomain: string },
) {
try {
- const payload = JWT.decode(options.token) as object & {
- exp: number;
- };
- res.cookie(`token`, options.token, {
- expires: new Date(payload?.exp ? payload?.exp * 1000 : 0),
+ const payload = decodeJwt(options.token);
+ res.cookie('token', options.token, {
+ expires: new Date(payload.exp ? payload.exp * 1000 : 0),
secure: options.secure,
sameSite: 'lax',
domain: options.cookieDomain,
@@ -43,9 +41,10 @@ function setTokenCookie(
}
}
-async function main() {
- // ...
-
+export const createAuthMiddleware = async (
+ config: Config,
+ appEnv: PluginEnvironment,
+) => {
const discovery = SingleHostDiscovery.fromConfig(config);
const identity = IdentityClient.create({
discovery,
@@ -54,7 +53,7 @@ async function main() {
const baseUrl = config.getString('backend.baseUrl');
const secure = baseUrl.startsWith('https://');
const cookieDomain = new URL(baseUrl).hostname;
- const authMiddleware = async (
+ const authMiddleware: RequestHandler = async (
req: Request,
res: Response,
next: NextFunction,
@@ -62,13 +61,21 @@ async function main() {
try {
const token =
getBearerTokenFromAuthorizationHeader(req.headers.authorization) ||
- req.cookies['token'];
- req.user = await identity.authenticate(token);
+ (req.cookies.token as string | undefined);
+ if (!token) {
+ res.status(401).send('Unauthorized');
+ return;
+ }
+ try {
+ req.user = await identity.authenticate(token);
+ } catch {
+ await appEnv.tokenManager.authenticate(token);
+ }
if (!req.headers.authorization) {
// Authorization header may be forwarded by plugin requests
req.headers.authorization = `Bearer ${token}`;
}
- if (token !== req.cookies['token']) {
+ if (token && token !== req.cookies.token) {
setTokenCookie(res, {
token,
secure,
@@ -77,9 +84,24 @@ async function main() {
}
next();
} catch (error) {
- res.status(401).send(`Unauthorized`);
+ res.status(401).send('Unauthorized');
}
};
+ return authMiddleware;
+};
+```
+
+```typescript
+// packages/backend/src/index.ts from a create-app deployment
+
+import { createAuthMiddleware } from './authMiddleware';
+
+// ...
+
+async function main() {
+ // ...
+
+ const authMiddleware = await createAuthMiddleware(config, appEnv);
const apiRouter = Router();
apiRouter.use(cookieParser());
@@ -99,12 +121,10 @@ async function main() {
}
```
+Create `packages/app/src/cookieAuth.ts`:
+
```typescript
-// packages/app/src/App.tsx from a create-app deployment
-
-import { discoveryApiRef, useApi } from '@backstage/core-plugin-api';
-
-// ...
+import type { IdentityApi } from '@backstage/core-plugin-api';
// Parses supplied JWT token and returns the payload
function parseJwt(token: string): { exp: number } {
@@ -113,9 +133,11 @@ function parseJwt(token: string): { exp: number } {
const jsonPayload = decodeURIComponent(
atob(base64)
.split('')
- .map(function (c) {
- return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
- })
+ .map(
+ c =>
+ // eslint-disable-next-line prefer-template
+ '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2),
+ )
.join(''),
);
@@ -132,7 +154,7 @@ function msUntilExpiry(token: string): number {
// Calls the specified url regularly using an auth token to set a token cookie
// to authorize regular HTTP requests when loading techdocs
-async function setTokenCookie(url: string, identityApi: IdentityApi) {
+export async function setTokenCookie(url: string, identityApi: IdentityApi) {
const { token } = await identityApi.getCredentials();
if (!token) {
return;
@@ -155,6 +177,14 @@ async function setTokenCookie(url: string, identityApi: IdentityApi) {
ms > 0 ? ms : 10000,
);
}
+```
+
+```typescript
+// packages/app/src/App.tsx from a create-app deployment
+
+import { setTokenCookie } from './cookieAuth';
+
+// ...
const app = createApp({
// ...
diff --git a/cypress/src/integration/plugins/score-card.spec.ts b/cypress/src/integration/plugins/score-card.spec.ts
new file mode 100644
index 0000000000..5871a094e1
--- /dev/null
+++ b/cypress/src/integration/plugins/score-card.spec.ts
@@ -0,0 +1,83 @@
+/*
+ * 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 'os';
+
+describe('score-card', () => {
+ describe('Score board', () => {
+ it('displays the score board based on sample data', () => {
+ cy.loginAsGuest();
+
+ cy.visit('/score-board');
+ cy.screenshot({ capture: 'viewport' });
+
+ cy.contains('System scores overview').should('be.visible');
+ cy.checkForErrors();
+ cy.get('span:contains("1-2 of 2")').should('be.visible'); // beware, there is also a hidden element
+ cy.contains('audio-playback').should('be.visible');
+ cy.contains('team-c').should('be.visible');
+ cy.contains('non-valid-system').should('be.visible');
+ cy.contains('Name').should('be.visible');
+ cy.contains('Date').should('be.visible');
+ cy.contains('Code').should('be.visible');
+ cy.contains('Documentation').should('be.visible');
+ cy.contains('Operations').should('be.visible');
+ cy.contains('Quality').should('be.visible');
+ cy.contains('Security').should('be.visible');
+ cy.contains('Total').should('be.visible');
+ cy.contains('50 %').should('be.visible');
+ cy.contains('75 %').should('be.visible');
+ cy.log('navigating to score card detail for audio-playback');
+ cy.get('a[data-id="audio-playback"]').should('be.visible').click();
+ cy.screenshot({ capture: 'viewport' });
+
+ cy.url().should(
+ 'include',
+ '/catalog/default/System/audio-playback/score',
+ );
+ cy.contains('Scoring').should('be.visible');
+ cy.contains('Total score: 57 %').should('be.visible');
+ cy.contains('Code').should('be.visible');
+ cy.contains('90 %').should('be.visible');
+ cy.contains('Documentation').should('be.visible');
+ cy.contains('75 %').should('be.visible');
+ cy.contains('Operations').should('be.visible');
+ cy.contains('50 %').should('be.visible');
+ cy.contains('Quality').should('be.visible');
+ cy.contains('25 %').should('be.visible');
+ cy.contains('Security');
+ cy.contains('10 %').should('be.visible');
+ cy.checkForErrors();
+
+ cy.log(
+ 'Clicking on button [>] that is first child of the element (td) with value=Code',
+ );
+ cy.get('[value="Code"] > button:first-child').click();
+ cy.checkForErrors();
+ cy.screenshot({ capture: 'viewport' });
+
+ cy.log('Clicking on link for Code');
+ cy.contains('hints: Gitflow: 100%').should('be.visible');
+ cy.get('a[data-id="2157"]')
+ .should('be.visible')
+ .should(
+ 'have.attr',
+ 'href',
+ 'https://TBD/XXX/_wiki/wikis/XXX.wiki/2157',
+ );
+ });
+ });
+});
diff --git a/cypress/src/support/commands.ts b/cypress/src/support/commands.ts
index 02723ffc90..62e21a5bef 100644
--- a/cypress/src/support/commands.ts
+++ b/cypress/src/support/commands.ts
@@ -118,3 +118,8 @@ Cypress.Commands.add('waitSectionTwoPage', () => {
Cypress.Commands.add('waitHomePage', () => {
cy.wait(['@entityMetadata', '@syncEntity', '@techdocsMetadata', '@homeHTML']);
});
+
+Cypress.Commands.add('checkForErrors', () => {
+ // when an error occurs there is a
with an "alert" role attribute. This can change ofc => we shall add also some positive ("when error occurs") test
+ cy.get('div[role="alert"]').should('not.exist');
+});
diff --git a/cypress/src/types.d.ts b/cypress/src/types.d.ts
index 181b608a9b..dca22112e9 100644
--- a/cypress/src/types.d.ts
+++ b/cypress/src/types.d.ts
@@ -77,5 +77,10 @@ declare namespace Cypress {
* @example cy.isNotInViewport
*/
isNotInViewport(element: string): Chainable;
+ /**
+ * Check if we have not caused error by our last action
+ * @example cy.checkForErrors
+ */
+ checkForErrors(): Chainable;
}
}
diff --git a/docs/auth/auth0/provider.md b/docs/auth/auth0/provider.md
index 1bfa333191..6fb57a641b 100644
--- a/docs/auth/auth0/provider.md
+++ b/docs/auth/auth0/provider.md
@@ -35,6 +35,8 @@ auth:
clientSecret: ${AUTH_AUTH0_CLIENT_SECRET}
domain: ${AUTH_AUTH0_DOMAIN_ID}
audience: ${AUTH_AUTH0_AUDIENCE}
+ connection: ${AUTH_AUTH0_CONNECTION}
+ connectionScope: ${AUTH_AUTH0_CONNECTION_SCOPE}
```
The Auth0 provider is a structure with three configuration keys:
@@ -44,6 +46,12 @@ The Auth0 provider is a structure with three configuration keys:
page
- `domain`: The Application domain, found on the Auth0 Application page
+## Optional Configuration
+
+- `audience`: The intended recipients of the token
+- `connection`: Social identity provider name. To check the available social connections, please visit [Auth0 Social Connections](https://marketplace.auth0.com/features/social-connections).
+- `connectionScope`: Additional scopes in the interactive token request. It should always be used in combination with the `connection` parameter
+
## Adding the provider to the Backstage frontend
To add the provider to the frontend, add the `auth0AuthApi` reference and
diff --git a/docs/auth/oidc.md b/docs/auth/oidc.md
new file mode 100644
index 0000000000..f856a2a415
--- /dev/null
+++ b/docs/auth/oidc.md
@@ -0,0 +1,259 @@
+---
+id: oidc
+title: OIDC provider from scratch
+description: This section shows how to use an OIDC provider from scratch, same steps apply for custom providers.
+---
+
+This section shows how to use an OIDC provider from scratch, same steps apply for custom
+providers. Please note these steps are for using a provider, not how to implement one,
+and Backstage recommends creating custom providers specific to the IDP, so we'll use a
+`azureOIDC` provider throughout this example, feel free to change any of those refs
+to your provider name.
+
+## Summary
+
+To add providers not enabled by default like OIDC, we need to follow some steps, we
+assume you already have a sign in page to which we'll add the provider so users can
+sign in through the provider. In simple steps here's how you enable the provider:
+
+- Create an API reference to identify the provider.
+- Create the API factory that will handle the authentication.
+- Add or reuse an auth provider so you can authenticate.
+- Add or reuse a resolver to handle the result from the authentication.
+- Configure the provider to access your 3rd party auth solution.
+- Add the provider to sign in page so users can login with it.
+
+We'll explain each step more in detail next.
+
+### The API reference
+
+An API reference exist for the sake of **Dependency Injection**, check [Utility APIs][4]
+for extended explanation.
+
+In this OIDC example, we'll create the API reference directly in the
+`packages/app/src/apis.ts` file, it is not a requirement to put the reference in this
+file. Any location will do as long as it's available to be imported to where the API
+factory is, as well as easily accessible to the rest of the application so any package
+and plugin can inject the API instance when necessary.
+
+An example of such would be when you use an auth provider from a library installed with
+NPM, or any other library repository, you would import the API ref from the library.
+
+```ts
+export const azureOIDCAuthApiRef: ApiRef<
+ OpenIdConnectApi & ProfileInfoApi & BackstageIdentityApi & SessionApi
+> = createApiRef({
+ id: 'auth.my-custom-provider',
+});
+```
+
+Please note a few things, the ID can be anything you want as long as it doesn't conflict
+with other refs, backstage recommends to use a custom name that references your custom
+provider, for example we are using OIDC protocol with Azure, so we could use something
+like `auth.azure.oidc` as well.
+
+Also we're exporting this reference, as well as the `typings`, we need to
+be able to import this reference anywhere in the app, and the `typings` will tell typescript
+what instance we're getting from DI when injecting the API. In this case we are defining
+an API for authentication, so we tell TS that this instance complies with 4 API
+interfaces:
+
+- The OICD API that will handle authentication.
+- Profile API for requesting user profile info from the auth provider in question.
+- Backstage identity API to handle and associate the user profile with backstage identity.
+- Session API, to handle the session the user will have while logged in.
+
+### The API Factory
+
+A factory is a function that can take some parameters or dependencies and return an
+instance of something, in our case it will be a function that requests some backstage
+APIs and use them to create an instance of an OIDC API provider.
+
+Please note that this function only runs (creates the instance) when somewhere else in
+the app you request the DI to give you an instance of the OIDC provider using the API ref
+defined above, and the DI will only run this function the first time, from then on any
+other DI injection will just receive the same instance created the first time, basically
+the instance is cached by the DI library, a singleton.
+
+Let's add our OIDC API factory to the APIs array in the `packages/app/src/apis.ts` file:
+
+```diff
++ import { OAuth2 } from '@backstage/core-app-api';
+
+export const apis: AnyApiFactory[] = [
++ createApiFactory({
++ api: azureOIDCAuthApiRef,
++ deps: {
++ discoveryApi: discoveryApiRef,
++ oauthRequestApi: oauthRequestApiRef,
++ configApi: configApiRef,
++ },
++ factory: ({ discoveryApi, oauthRequestApi, configApi }) =>
++ OAuth2.create({
++ discoveryApi,
++ oauthRequestApi,
++ provider: {
++ id: 'my-auth-provider',
++ title: 'My custom auth provider',
++ icon: () => null,
++ },
++ environment: configApi.getOptionalString('auth.environment'),
++ defaultScopes: [
++ 'openid',
++ 'profile',
++ 'email',
++ ],
++ }),
++ }),
+
+```
+
+Please note we're importing the `OAuth2` class from `@backstage/core-app-api` effectively
+delegating the authentication to it. Also we're using the `my-auth-provider` ID to tell
+`OAuth2` to use the auth provider we'll define in the next section, and added the default
+scopes to request ID, profile, email and user read permissions.
+
+## The Auth Provider
+
+The Auth Provider is responsible for authenticating with the 3rd party service, and give
+us back the credentials, here's where you pick which protocol to use, be it Auth0, OAuth2,
+OIDC, SAML or any other that your 3rd party IDP provider supports.
+
+For this example we'll use OIDC, we pass a factory to the `providerFactories` object with
+the ID you picked to represent the Auth provider, this ID has to match with the provider's
+`id` inside the API factory, the yaml config provider key under `auth.providers`, and the
+callback URI provider segment (you'll have to configure your IDP to handle the callback
+URI properly).
+
+```diff
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ return await createRouter({
+ logger: env.logger,
+ config: env.config,
+ database: env.database,
+ discovery: env.discovery,
+ tokenManager: env.tokenManager,
+ providerFactories: {
+ ...defaultAuthProviderFactories,
++ 'my-auth-provider': providers.oidc.create({
++ }),
+ }
+```
+
+### The Resolver
+
+Resolvers exist to map user identity from the 3rd party (in this case an azure IDP
+provider) to the backstage user identity, for a detailed explanation check the
+[Identity Resolver][1] page, it explains how to write a custom resolver as well as
+linking the built in resolvers of backstage.
+
+The default OIDC provider does not support SignIn, we need to add such support by
+adding a resolver for a SignIn request.
+
+The OIDC provider doesn't provide any build-in resolvers, so we'll need to define our own:
+
+```diff
+import {
+ DEFAULT_NAMESPACE,
++ stringifyEntityRef,
+} from '@backstage/catalog-model';
+
+export default async function createPlugin(
+ env: PluginEnvironment,
+): Promise {
+ return await createRouter({
+ logger: env.logger,
+ config: env.config,
+ database: env.database,
+ discovery: env.discovery,
+ tokenManager: env.tokenManager,
+ providerFactories: {
+ ...defaultAuthProviderFactories,
+ 'my-auth-provider': providers.oidc.create({
++ signIn: {
++ resolver(info, ctx) {
++ const userRef = stringifyEntityRef({
++ kind: 'User',
++ name: info.result.userinfo.sub,
++ namespace: DEFAULT_NAMESPACE,
++ });
++ return ctx.issueToken({
++ claims: {
++ sub: userRef, // The user's own identity
++ ent: [userRef], // A list of identities that the user claims ownership through
++ },
++ });
++ },
++ },
+ }),
+ }
+```
+
+### The configuration
+
+Since we are using our custom OIDC Auth Provider, we need to add a configuration based
+on the provider used, in this case based on OIDC protocol (remember the 3rd party has to
+support the protocol).
+
+In this example we'll configure OIDC with `my-auth-provider`, to do so we need to
+[Create app registration][2] in the Azure console, the only difference is that the
+`http://localhost:7007/api/auth/microsoft/handler/frame` URL needs to change to
+`http://localhost:7007/api/auth/my-auth-provider/handler/frame`.
+
+Then we need to configure the env variables for the provider, based on the provider's code
+in `plugins/auth-backend/src/providers/oidc/provider.ts` we need the following variables
+in the `app-config.yaml`:
+
+```yaml
+auth:
+ environment: development
+ ### Providing an auth.session.secret will enable session support in the auth-backend
+ session:
+ secret: ${SESSION_SECRET}
+ providers:
+ my-auth-provider:
+ development:
+ metadataUrl: https://example.com/.well-known/openid-configuration
+ clientId: ${AUTH_MY_CLIENT_ID}
+ clientSecret: ${AUTH_MY_CLIENT_SECRET}
+```
+
+Anything enclosed in `${}` can be replaced directly in the yaml, or provided as
+environment variables, the way you obtain all these except `scope` and `prompt` is to
+check the App Registration you created:
+
+- `clientId`: Grab from the Overview page.
+- `clientSecret`: Can only be seen when creating the secret, if you lose it you'll need a
+ new secret.
+- `metadataUrl`: In Overview > Endpoints tab, grab OpenID Connect metadata document URL.
+- `authorizationUrl` and `tokenUrl`: Open the `metadataUrl` in a browser, that json will
+ hold these 2 urls somewhere in there.
+- `tokenSignedResponseAlg`: Don't define it, use the default unless you know what it does.
+- `scope`: Only used if we didn't specify `defaultScopes` in the provider's factory,
+ basically the same thing.
+- `prompt`: Recommended to use `auto` so the browser will request login to the IDP if the
+ user has no active session.
+
+Note that for the time being, any change in this yaml file requires a restart of the app,
+also you need to have the `session.secret` part to use OIDC (some other providers might
+need this as well) to support user sessions.
+
+### The Sign In provider
+
+The last step is to add the provider to the `SignInPage` so users can sign in with your
+new provider, please follow the [Sing In Configuration][3] docs, here's where you import
+and use the API ref we defined earlier.
+
+## Note
+
+These steps apply to most if not all the providers, including custom providers, the main
+difference between different providers will be the contents of the API factory, the code
+in the Auth Provider Factory, the resolver, and the different variables each provider
+needs in the YAML config or env variables.
+
+[1]: https://backstage.io/docs/auth/identity-resolver
+[2]: https://backstage.io/docs/auth/microsoft/provider#create-an-app-registration-on-azure
+[3]: https://backstage.io/docs/auth/#sign-in-configuration
+[4]: https://backstage.io/docs/api/utility-apis
diff --git a/docs/features/search/search-engines.md b/docs/features/search/search-engines.md
index 515c1268d7..35e17205ac 100644
--- a/docs/features/search/search-engines.md
+++ b/docs/features/search/search-engines.md
@@ -101,7 +101,7 @@ Similarly to Lunr above, ElasticSearch can be set up like this:
```typescript
// app/backend/src/plugins/search.ts
-const searchEngine = await ElasticSearchSearchEngine.initialize({
+const searchEngine = await ElasticSearchSearchEngine.fromConfig({
logger: env.logger,
config: env.config,
});
diff --git a/docs/features/software-templates/configuration.md b/docs/features/software-templates/configuration.md
index 87c17ca1a3..ff5191bed2 100644
--- a/docs/features/software-templates/configuration.md
+++ b/docs/features/software-templates/configuration.md
@@ -14,8 +14,7 @@ appropriate source code repository for your organization.
> Note: Integrations may already be set up as part of your `app-config.yaml`.
-The next step is to add
-[add templates](http://backstage.io/docs/features/software-templates/adding-templates)
+The next step is to [add templates](http://backstage.io/docs/features/software-templates/adding-templates)
to your Backstage app.
## Publishing defaults
diff --git a/docs/integrations/bitbucketCloud/discovery.md b/docs/integrations/bitbucketCloud/discovery.md
index 6609707868..c5a17bb2c9 100644
--- a/docs/integrations/bitbucketCloud/discovery.md
+++ b/docs/integrations/bitbucketCloud/discovery.md
@@ -37,6 +37,7 @@ And then add the entity provider to your catalog builder:
+ builder.addEntityProvider(
+ BitbucketCloudEntityProvider.fromConfig(env.config, {
+ logger: env.logger,
++ // optional: alternatively, configure via app-config.yaml
+ schedule: env.scheduler.createScheduledTaskRunner({
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
@@ -67,24 +68,38 @@ catalog:
filters: # optional
projectKey: '^apis-.*$' # optional; RegExp
repoSlug: '^service-.*$' # optional; RegExp
+ schedule: # optional; same options as in TaskScheduleDefinition
+ # supports cron, ISO duration, "human duration" as used in code
+ frequency: { minutes: 30 }
+ # supports ISO duration, "human duration" as used in code
+ timeout: { minutes: 3 }
workspace: workspace-name
```
> **Note:** It is possible but certainly not recommended to skip the provider ID level.
> If you do so, `default` will be used as provider ID.
-- **catalogPath** _(optional)_:
+- **`catalogPath`** _(optional)_:
Default: `/catalog-info.yaml`.
Path where to look for `catalog-info.yaml` files.
When started with `/`, it is an absolute path from the repo root.
It supports values as allowed by the `path` filter/modifier
[at Bitbucket Cloud's code search](https://confluence.atlassian.com/bitbucket/code-search-in-bitbucket-873876782.html#Search-Pathmodifier).
-- **filters** _(optional)_:
- - **projectKey** _(optional)_:
+- **`filters`** _(optional)_:
+ - **`projectKey`** _(optional)_:
Regular expression used to filter results based on the project key.
- - **repoSlug** _(optional)_:
+ - **`repoSlug`** _(optional)_:
Regular expression used to filter results based on the repo slug.
-- **workspace**:
+- **`schedule`** _(optional)_:
+ - **`frequency`**:
+ How often you want the task to run. The system does its best to avoid overlapping invocations.
+ - **`timeout`**:
+ The maximum amount of time that a single task invocation can take.
+ - **`initialDelay`** _(optional)_:
+ The amount of time that should pass before the first invocation happens.
+ - **`scope`** _(optional)_:
+ `'global'` or `'local'`. Sets the scope of concurrency control.
+- **`workspace`**:
Name of your organization account/workspace.
If you want to add multiple workspaces, you need to add one provider config each.
diff --git a/docs/integrations/github/discovery.md b/docs/integrations/github/discovery.md
index 6acb87ac37..9b60b41682 100644
--- a/docs/integrations/github/discovery.md
+++ b/docs/integrations/github/discovery.md
@@ -12,7 +12,7 @@ The GitHub integration has a discovery provider for discovering catalog
entities within a GitHub organization. The provider will crawl the GitHub
organization and register entities matching the configured path. This can be
useful as an alternative to static locations or manually adding things to the
-catalog. This is the prefered method for ingesting entities into the catalog.
+catalog. This is the preferred method for ingesting entities into the catalog.
## Installation
@@ -55,7 +55,7 @@ And then add the entity provider to your catalog builder:
To use the discovery provider, you'll need a GitHub integration
[set up](locations.md) with either a [Personal Access Token](../../getting-started/configuration.md#setting-up-a-github-integration) or [GitHub Apps](./github-apps.md).
-Then you can add a github config to the catalog providers configuration:
+Then you can add a `github` config to the catalog providers configuration:
```yaml
catalog:
@@ -121,10 +121,10 @@ This provider supports multiple organizations via unique provider IDs.
In the example above, a repository with the `backstage-include` topic would still be excluded
if it were also carrying the `experiments` topic.
- **include** _(optional)_:
- An array of strings used to filter in results based on their associated Github topics.
+ An array of strings used to filter in results based on their associated GitHub topics.
If configured, only repositories with one (or more) topic(s) present in the inclusion filter will be ingested
- **exclude** _(optional)_:
- An array of strings used to filter out results based on their associated Github topics.
+ An array of strings used to filter out results based on their associated GitHub topics.
If configured, all repositories _except_ those with one (or more) topics(s) present in the exclusion filter will be ingested.
- **organization**:
Name of your organization account/workspace.
diff --git a/docs/plugins/call-existing-api.md b/docs/plugins/call-existing-api.md
index 5dbf7988c9..e91506623b 100644
--- a/docs/plugins/call-existing-api.md
+++ b/docs/plugins/call-existing-api.md
@@ -132,7 +132,7 @@ router.use('/summary', async (req, res) => {
]).then(async ([frobs, flerps, thunk]) => {
return computeAggregate(await frobs.json(), await flerps.json(), thunk);
});
- res.status(200).send(agg);
+ res.status(200).json(agg);
});
```
diff --git a/docs/releases/v1.7.0-next.1-changelog.md b/docs/releases/v1.7.0-next.1-changelog.md
new file mode 100644
index 0000000000..f5480147fb
--- /dev/null
+++ b/docs/releases/v1.7.0-next.1-changelog.md
@@ -0,0 +1,2088 @@
+# Release v1.7.0-next.1
+
+## @backstage/plugin-auth-backend@0.17.0-next.1
+
+### Minor Changes
+
+- e2dc42e9f0: Google OAuth refresh tokens will now be revoked on logout by calling Google's API
+
+### Patch Changes
+
+- b5c126010c: Auth0 provider now supports optional `connection` and `connectionScope` parameters to configure social identity providers.
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-auth-node@0.2.6-next.1
+
+## @backstage/plugin-catalog@1.6.0-next.1
+
+### Minor Changes
+
+- d558f41d3a: Added new column `Label` to `CatalogTable.columns`, this new column allows you make use of labels from metadata.
+ For example: category and visibility are type of labels associated with API entity illustrated below.
+
+ YAML code snippet for API entity
+
+ ```yaml
+ apiVersion: backstage.io/v1alpha1
+ kind: API
+ metadata:
+ name: sample-api
+ description: API for sample
+ links:
+ - url: http://localhost:8080/swagger-ui.html
+ title: Swagger UI
+ tags:
+ - http
+ labels:
+ category: legacy
+ visibility: protected
+ ```
+
+ Consumers can customise columns to include label column and show in api-docs list
+
+ ```typescript
+ const columns = [
+ CatalogTable.columns.createNameColumn({ defaultKind: 'API' }),
+ CatalogTable.columns.createLabelColumn('category', { title: 'Category' }),
+ CatalogTable.columns.createLabelColumn('visibility', {
+ title: 'Visibility',
+ defaultValue: 'public',
+ }),
+ ];
+ ```
+
+### Patch Changes
+
+- 4efadb6968: Implemented the visual parts of `EntityKindPicker` so that it can be shown alongside the other filters on the left side of your catalog pages.
+- e89e1f614d: Added support for copy entity URL in entity page context menu
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/plugin-search-react@1.2.0-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+ - @backstage/plugin-catalog-common@1.0.7-next.1
+
+## @backstage/plugin-catalog-react@1.2.0-next.1
+
+### Minor Changes
+
+- 4efadb6968: Implemented the visual parts of `EntityKindPicker` so that it can be shown alongside the other filters on the left side of your catalog pages.
+
+### Patch Changes
+
+- 7939e743f5: Added two new `EntityRefLinks` props, the first being `getTitle` that allows for customization of the title used for each link. The second one is `fetchEntities`, which triggers a fetching of all entities so that the full entity definition is available in the `getTitle` callback.
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+ - @backstage/version-bridge@1.0.1
+ - @backstage/plugin-catalog-common@1.0.7-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-permission-react@0.4.6-next.1
+
+## @backstage/plugin-search-backend@1.1.0-next.1
+
+### Minor Changes
+
+- 16c853a6ed: Be less restrictive with unknown keys on query endpoint
+- a799972bb1: The query received by search engines now contains a property called `pageLimit`, it specifies how many results to return per page when sending a query request to the search backend.
+
+ Example:
+ _Returns up to 30 results per page_
+
+ GET /query?pageLimit=30
+
+ The search backend validates the page limit and this value must not exceed 100, but it doesn't set a default value for the page limit parameter, it leaves it up to each search engine to set this, so Lunr, Postgres and Elastic Search set 25 results per page as a default value.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.3-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-auth-node@0.2.6-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-permission-node@0.6.6-next.1
+
+## @backstage/plugin-search-common@1.1.0-next.1
+
+### Minor Changes
+
+- a799972bb1: There is a new property called `pageLimit` on the `SearchQuery` interface that specifies how many results should be returned per page.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.0
+ - @backstage/plugin-permission-common@0.6.5-next.1
+
+## @backstage/plugin-search-react@1.2.0-next.1
+
+### Minor Changes
+
+- 4ed1fa2480: The search query state now has an optional `pageLimit` property that determines how many results will be requested per page, it defaults to 25.
+
+ Examples:
+ _Basic_
+
+ ```jsx
+
+ {results => {
+ // Item rendering logic is omitted
+ }}
+
+ ```
+
+ _With context_
+
+ ```jsx
+
+
+ {results => {
+ // Item rendering logic is omitted
+ }}
+
+
+ ```
+
+- bed5a1dc6e: The `` component now accepts an optional property `disableRenderingWithNoResults` to disable rendering when no results are returned.
+ Possibility to provide a custom no results component if needed through the `noResultsComponent` property.
+
+ Examples:
+
+ _Rendering a custom no results component_
+
+ ```jsx
+ }
+ />
+ ```
+
+ _Disable rendering when there are no results_
+
+ ```jsx
+
+ ```
+
+- 6faaa05626: The `` component now accepts an optional property `disableRenderingWithNoResults` to disable rendering when no results are returned.
+ Possibility to provide a custom no results component if needed through the `noResultsComponent` property.
+
+ Examples:
+
+ _Rendering a custom no results component_
+
+ ```jsx
+ }
+ title="Documentation"
+ noResultsComponent={}
+ />
+ ```
+
+ _Disable rendering when there are no results_
+
+ ```jsx
+ }
+ title="Documentation"
+ disableRenderingWithNoResults
+ />
+ ```
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+ - @backstage/version-bridge@1.0.1
+
+## @backstage/app-defaults@1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-permission-react@0.4.6-next.1
+
+## @backstage/backend-app-api@0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/plugin-permission-node@0.6.6-next.1
+
+## @backstage/backend-common@0.15.2-next.1
+
+### Patch Changes
+
+- c31f7cdfbc: Fixed an issue where `getClient()` for a `pluginId` would return different clients and not share them
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+ - @backstage/config@1.0.3-next.1
+ - @backstage/config-loader@1.1.5-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/backend-defaults@0.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/backend-app-api@0.2.2-next.1
+
+## @backstage/backend-plugin-api@0.1.3-next.1
+
+### Patch Changes
+
+- a35a27df70: Added documentation for `createBackendModule`, with guidelines for choosing a module ID.
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+
+## @backstage/backend-tasks@0.3.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/backend-test-utils@0.1.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.20.0-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/backend-app-api@0.2.2-next.1
+ - @backstage/config@1.0.3-next.1
+
+## @backstage/catalog-client@1.1.1-next.1
+
+### Patch Changes
+
+- 4f2ac624b4: Renamed argument in `validateEntity` from `location` to `locationRef`
+- Updated dependencies
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+
+## @backstage/catalog-model@1.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/cli@0.20.0-next.1
+
+### Patch Changes
+
+- 78d5eb299e: Tweak the Jest Caching loader to only operate when in `watch` mode
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+ - @backstage/config@1.0.3-next.1
+ - @backstage/config-loader@1.1.5-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/release-manifests@0.0.6
+ - @backstage/types@1.0.0
+
+## @backstage/codemods@0.1.40-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+
+## @backstage/config@1.0.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.0
+
+## @backstage/config-loader@1.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/core-app-api@1.1.1-next.1
+
+### Patch Changes
+
+- 27e6404aba: Fixed a bug where gathered index routes would fail to bind routable extensions. This would typically show up when placing a routable extension in the entity page overview tab.
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/types@1.0.0
+ - @backstage/version-bridge@1.0.1
+
+## @backstage/core-components@0.11.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/version-bridge@1.0.1
+
+## @backstage/core-plugin-api@1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.3-next.1
+ - @backstage/types@1.0.0
+ - @backstage/version-bridge@1.0.1
+
+## @backstage/create-app@0.4.32-next.1
+
+### Patch Changes
+
+- 7c6306fc8a: Initializes a git repository when creating an app using @packages/create-app
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+
+## @backstage/dev-utils@1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/app-defaults@1.0.7-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/test-utils@1.2.1-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/errors@1.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.0
+
+## @backstage/integration@1.3.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+
+## @backstage/integration-react@1.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/theme@0.2.16
+
+## @techdocs/cli@1.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/cli-common@0.1.10
+ - @backstage/config@1.0.3-next.1
+ - @backstage/plugin-techdocs-node@1.4.1-next.1
+
+## @backstage/test-utils@1.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-permission-react@0.4.6-next.1
+
+## @backstage/plugin-adr@0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/plugin-search-react@1.2.0-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-adr-common@0.2.2-next.1
+
+## @backstage/plugin-adr-backend@0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/plugin-adr-common@0.2.2-next.1
+
+## @backstage/plugin-adr-common@0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+
+## @backstage/plugin-airbrake@0.3.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/dev-utils@1.0.7-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/test-utils@1.2.1-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-airbrake-backend@0.2.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+
+## @backstage/plugin-allure@0.1.26-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-analytics-module-ga@0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-apache-airflow@0.2.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+
+## @backstage/plugin-api-docs@0.8.10-next.1
+
+### Patch Changes
+
+- 50c6e14aee: Updated dependency `@asyncapi/react-component` to `1.0.0-next.43`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/plugin-catalog@1.6.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-apollo-explorer@0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-app-backend@0.3.37-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/config-loader@1.1.5-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-auth-node@0.2.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+
+## @backstage/plugin-azure-devops@0.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-azure-devops-common@0.3.0
+
+## @backstage/plugin-azure-devops-backend@0.3.16-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/plugin-azure-devops-common@0.3.0
+
+## @backstage/plugin-badges@0.2.34-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-badges-backend@0.1.31-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+
+## @backstage/plugin-bazaar@0.1.25-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/plugin-catalog@1.6.0-next.1
+ - @backstage/cli@0.20.0-next.1
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+
+## @backstage/plugin-bazaar-backend@0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-test-utils@0.1.29-next.1
+ - @backstage/config@1.0.3-next.1
+
+## @backstage/plugin-bitbucket-cloud-common@0.2.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.3.2-next.1
+
+## @backstage/plugin-bitrise@0.1.37-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-catalog-backend@1.4.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-catalog-common@1.0.7-next.1
+ - @backstage/plugin-catalog-node@1.1.1-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-permission-node@0.6.6-next.1
+ - @backstage/plugin-scaffolder-common@1.2.1-next.1
+
+## @backstage/plugin-catalog-backend-module-aws@0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
+## @backstage/plugin-catalog-backend-module-azure@0.1.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket@0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-bitbucket-cloud-common@0.2.0-next.1
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/plugin-bitbucket-cloud-common@0.2.0-next.1
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
+## @backstage/plugin-catalog-backend-module-github@0.1.8-next.1
+
+### Patch Changes
+
+- a35a27df70: Updated the `moduleId` of the experimental module export.
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+ - @backstage/plugin-catalog-node@1.1.1-next.1
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.1.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
+## @backstage/plugin-catalog-backend-module-ldap@0.5.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.4.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
+## @backstage/plugin-catalog-backend-module-openapi@0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+ - @backstage/plugin-catalog-node@1.1.1-next.1
+
+## @backstage/plugin-catalog-common@1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+
+## @backstage/plugin-catalog-graph@0.2.22-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-catalog-graphql@0.3.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-catalog-import@0.8.13-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/integration-react@1.1.5-next.1
+
+## @backstage/plugin-catalog-node@1.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-cicd-statistics@0.1.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+
+## @backstage/plugin-cicd-statistics-module-gitlab@0.1.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-cicd-statistics@0.1.12-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+
+## @backstage/plugin-circleci@0.3.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-cloudbuild@0.3.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-code-climate@0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-code-coverage@0.2.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-code-coverage-backend@0.2.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+
+## @backstage/plugin-codescene@0.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-config-schema@0.1.33-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-cost-insights@0.11.32-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-cost-insights-common@0.1.1
+
+## @backstage/plugin-dynatrace@1.0.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-explore@0.3.41-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-explore-react@0.0.22-next.1
+
+## @backstage/plugin-explore-react@0.0.22-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.7-next.1
+
+## @backstage/plugin-firehydrant@0.1.27-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-fossa@0.2.42-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-gcalendar@0.3.6-next.1
+
+### Patch Changes
+
+- 4c2ed7ecf1: Fixed loader showing when user not signed in
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-gcp-projects@0.3.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-git-release-manager@0.3.23-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-github-actions@0.5.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-github-deployments@0.1.41-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-github-issues@0.1.2-next.1
+
+### Patch Changes
+
+- 8c7bff2bb4: Updated the `luxon` dependency to 3.x
+- 719ccbb963: Properly filter on relations instead of the spec, when finding by owner
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-github-pull-requests-board@0.1.4-next.1
+
+### Patch Changes
+
+- 719ccbb963: Properly filter on relations instead of the spec, when finding by owner
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-gitops-profiles@0.3.28-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-gocd@0.1.16-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-graphiql@0.2.42-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-graphql-backend@0.1.27-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/plugin-catalog-graphql@0.3.14-next.1
+
+## @backstage/plugin-home@0.4.26-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/plugin-stack-overflow@0.1.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-ilert@0.1.36-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-jenkins@0.7.9-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-jenkins-common@0.1.9-next.1
+
+## @backstage/plugin-jenkins-backend@0.1.27-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/plugin-auth-node@0.2.6-next.1
+ - @backstage/plugin-jenkins-common@0.1.9-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+
+## @backstage/plugin-jenkins-common@0.1.9-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-common@1.0.7-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+
+## @backstage/plugin-kafka@0.3.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-kafka-backend@0.2.30-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+
+## @backstage/plugin-kubernetes@0.7.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-kubernetes-common@0.4.3-next.1
+
+## @backstage/plugin-kubernetes-backend@0.7.3-next.1
+
+### Patch Changes
+
+- d4a8c683be: kubernetes service locator now take request context parameters
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/plugin-auth-node@0.2.6-next.1
+ - @backstage/plugin-kubernetes-common@0.4.3-next.1
+
+## @backstage/plugin-kubernetes-common@0.4.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.1.2-next.1
+
+## @backstage/plugin-lighthouse@0.3.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-newrelic@0.3.28-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-newrelic-dashboard@0.2.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+
+## @backstage/plugin-org@0.5.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-pagerduty@0.5.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-periskop@0.1.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-periskop-backend@0.1.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+
+## @backstage/plugin-permission-backend@0.5.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/plugin-auth-node@0.2.6-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-permission-node@0.6.6-next.1
+
+## @backstage/plugin-permission-common@0.6.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+
+## @backstage/plugin-permission-node@0.6.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/plugin-auth-node@0.2.6-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+
+## @backstage/plugin-permission-react@0.4.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+
+## @backstage/plugin-playlist@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/plugin-search-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.7-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-permission-react@0.4.6-next.1
+ - @backstage/plugin-playlist-common@0.1.1-next.1
+
+## @backstage/plugin-playlist-backend@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-test-utils@0.1.29-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/plugin-auth-node@0.2.6-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-permission-node@0.6.6-next.1
+ - @backstage/plugin-playlist-common@0.1.1-next.1
+
+## @backstage/plugin-playlist-common@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.6.5-next.1
+
+## @backstage/plugin-proxy-backend@0.2.31-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+
+## @backstage/plugin-rollbar@0.4.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-rollbar-backend@0.1.34-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+
+## @backstage/plugin-scaffolder@1.7.0-next.1
+
+### Patch Changes
+
+- e4f0a96424: Making the description of the GitLab repoUrl owner field more clearer by focusing it refers to the GitLab namespace.
+- 8220f2fd83: Support custom layouts in dry run editor
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+ - @backstage/plugin-catalog-common@1.0.7-next.1
+ - @backstage/plugin-permission-react@0.4.6-next.1
+ - @backstage/plugin-scaffolder-common@1.2.1-next.1
+
+## @backstage/plugin-scaffolder-backend@1.7.0-next.1
+
+### Patch Changes
+
+- 489621f613: Switching off duplicated timestamp in case of logging via task logger in a custom action
+- a35a27df70: Updated the `moduleId` of the experimental module export.
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-auth-node@0.2.6-next.1
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+ - @backstage/plugin-catalog-node@1.1.1-next.1
+ - @backstage/plugin-scaffolder-common@1.2.1-next.1
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-scaffolder-backend@1.7.0-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.4.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-scaffolder-backend@1.7.0-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.7.0-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-scaffolder-common@1.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-search@1.0.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/plugin-search-react@1.2.0-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+ - @backstage/version-bridge@1.0.1
+
+## @backstage/plugin-search-backend-module-elasticsearch@1.0.3-next.1
+
+### Patch Changes
+
+- a799972bb1: The search engine has been updated to take advantage of the `pageLimit` property on search queries. If none is provided, the search engine will continue to use its default value of 25 results per page.
+- Updated dependencies
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.3-next.1
+ - @backstage/config@1.0.3-next.1
+
+## @backstage/plugin-search-backend-module-pg@0.4.1-next.1
+
+### Patch Changes
+
+- a799972bb1: The search engine has been updated to take advantage of the `pageLimit` property on search queries. If none is provided, the search engine will continue to use its default value of 25 results per page.
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.3-next.1
+ - @backstage/config@1.0.3-next.1
+
+## @backstage/plugin-search-backend-node@1.0.3-next.1
+
+### Patch Changes
+
+- a799972bb1: The search engine has been updated to take advantage of the `pageLimit` property on search queries. If none is provided, the search engine will continue to use its default value of 25 results per page.
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+
+## @backstage/plugin-sentry@0.4.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-shortcuts@0.3.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-sonarqube@0.4.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-sonarqube-backend@0.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+
+## @backstage/plugin-splunk-on-call@0.3.34-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-stack-overflow@0.1.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/plugin-home@0.4.26-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-stack-overflow-backend@0.1.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.20.0-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/config@1.0.3-next.1
+
+## @backstage/plugin-tech-insights@0.3.1-next.1
+
+### Patch Changes
+
+- a60a6807bd: making available the search for the last FACTS executed
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+ - @backstage/plugin-tech-insights-common@0.2.7-next.1
+
+## @backstage/plugin-tech-insights-backend@0.5.3-next.1
+
+### Patch Changes
+
+- f7cbfb97ed: Modify router endpoint to handle singular and collections of request parameters similarly.
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/plugin-tech-insights-common@0.2.7-next.1
+ - @backstage/plugin-tech-insights-node@0.3.5-next.1
+
+## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/plugin-tech-insights-common@0.2.7-next.1
+ - @backstage/plugin-tech-insights-node@0.3.5-next.1
+
+## @backstage/plugin-tech-insights-common@0.2.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-tech-insights-node@0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-tech-insights-common@0.2.7-next.1
+
+## @backstage/plugin-tech-radar@0.5.17-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-techdocs@1.3.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/plugin-search-react@1.2.0-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-techdocs-react@1.0.5-next.1
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.6.0-next.1
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/plugin-search-react@1.2.0-next.1
+ - @backstage/plugin-techdocs@1.3.3-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/test-utils@1.2.1-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-techdocs-react@1.0.5-next.1
+
+## @backstage/plugin-techdocs-backend@1.3.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/plugin-catalog-common@1.0.7-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-techdocs-node@1.4.1-next.1
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-techdocs-react@1.0.5-next.1
+
+## @backstage/plugin-techdocs-node@1.4.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+
+## @backstage/plugin-techdocs-react@1.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/version-bridge@1.0.1
+
+## @backstage/plugin-todo@0.2.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-todo-backend@0.1.34-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+
+## @backstage/plugin-user-settings@0.5.0-next.1
+
+### Patch Changes
+
+- 06d61d1266: Handle errors that may occur when the user logs out
+- 44c9a95dcf: Prevent `.set()` to execute a request to the StorageClient if the user is `guest`
+- 174f02a00a: Update installation instructions
+- Updated dependencies
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+
+## @backstage/plugin-user-settings-backend@0.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-auth-node@0.2.6-next.1
+
+## @backstage/plugin-vault@0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## @backstage/plugin-vault-backend@0.2.3-next.1
+
+### Patch Changes
+
+- dae0bbe522: VaultBuilder.tsx renamed to VaultBuilder in order for module to be correctly loaded.
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/backend-test-utils@0.1.29-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+
+## @backstage/plugin-xcmetrics@0.2.30-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
+## example-app@0.2.76-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-user-settings@0.5.0-next.1
+ - @backstage/plugin-scaffolder@1.7.0-next.1
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/cli@0.20.0-next.1
+ - @backstage/plugin-tech-insights@0.3.1-next.1
+ - @backstage/plugin-gcalendar@0.3.6-next.1
+ - @backstage/plugin-api-docs@0.8.10-next.1
+ - @backstage/plugin-search-react@1.2.0-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/plugin-airbrake@0.3.10-next.1
+ - @backstage/plugin-azure-devops@0.2.1-next.1
+ - @backstage/plugin-badges@0.2.34-next.1
+ - @internal/plugin-catalog-customized@0.0.3-next.1
+ - @backstage/plugin-catalog-graph@0.2.22-next.1
+ - @backstage/plugin-catalog-import@0.8.13-next.1
+ - @backstage/plugin-circleci@0.3.10-next.1
+ - @backstage/plugin-cloudbuild@0.3.10-next.1
+ - @backstage/plugin-code-coverage@0.2.3-next.1
+ - @backstage/plugin-dynatrace@1.0.0-next.1
+ - @backstage/plugin-explore@0.3.41-next.1
+ - @backstage/plugin-github-actions@0.5.10-next.1
+ - @backstage/plugin-gocd@0.1.16-next.1
+ - @backstage/plugin-home@0.4.26-next.1
+ - @backstage/plugin-jenkins@0.7.9-next.1
+ - @backstage/plugin-kafka@0.3.10-next.1
+ - @backstage/plugin-kubernetes@0.7.3-next.1
+ - @backstage/plugin-lighthouse@0.3.10-next.1
+ - @backstage/plugin-newrelic-dashboard@0.2.3-next.1
+ - @backstage/plugin-org@0.5.10-next.1
+ - @backstage/plugin-pagerduty@0.5.3-next.1
+ - @backstage/plugin-playlist@0.1.1-next.1
+ - @backstage/plugin-rollbar@0.4.10-next.1
+ - @backstage/plugin-search@1.0.3-next.1
+ - @backstage/plugin-sentry@0.4.3-next.1
+ - @backstage/plugin-techdocs@1.3.3-next.1
+ - @backstage/plugin-todo@0.2.12-next.1
+ - @backstage/app-defaults@1.0.7-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/plugin-apache-airflow@0.2.3-next.1
+ - @backstage/plugin-cost-insights@0.11.32-next.1
+ - @backstage/plugin-gcp-projects@0.3.29-next.1
+ - @backstage/plugin-graphiql@0.2.42-next.1
+ - @backstage/plugin-newrelic@0.3.28-next.1
+ - @backstage/plugin-shortcuts@0.3.2-next.1
+ - @backstage/plugin-stack-overflow@0.1.6-next.1
+ - @backstage/plugin-tech-radar@0.5.17-next.1
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.5-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.7-next.1
+ - @backstage/plugin-permission-react@0.4.6-next.1
+ - @backstage/plugin-techdocs-react@1.0.5-next.1
+
+## example-backend@0.2.76-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-backend@0.17.0-next.1
+ - @backstage/plugin-search-backend@1.1.0-next.1
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-scaffolder-backend@1.7.0-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.3-next.1
+ - @backstage/plugin-search-backend-module-pg@0.4.1-next.1
+ - @backstage/plugin-search-backend-module-elasticsearch@1.0.3-next.1
+ - @backstage/plugin-kubernetes-backend@0.7.3-next.1
+ - @backstage/plugin-tech-insights-backend@0.5.3-next.1
+ - example-app@0.2.76-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/plugin-app-backend@0.3.37-next.1
+ - @backstage/plugin-auth-node@0.2.6-next.1
+ - @backstage/plugin-azure-devops-backend@0.3.16-next.1
+ - @backstage/plugin-badges-backend@0.1.31-next.1
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+ - @backstage/plugin-code-coverage-backend@0.2.3-next.1
+ - @backstage/plugin-graphql-backend@0.1.27-next.1
+ - @backstage/plugin-jenkins-backend@0.1.27-next.1
+ - @backstage/plugin-kafka-backend@0.2.30-next.1
+ - @backstage/plugin-permission-backend@0.5.12-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-permission-node@0.6.6-next.1
+ - @backstage/plugin-playlist-backend@0.1.1-next.1
+ - @backstage/plugin-proxy-backend@0.2.31-next.1
+ - @backstage/plugin-rollbar-backend@0.1.34-next.1
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.5-next.1
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21-next.1
+ - @backstage/plugin-tech-insights-node@0.3.5-next.1
+ - @backstage/plugin-techdocs-backend@1.3.1-next.1
+ - @backstage/plugin-todo-backend@0.1.34-next.1
+
+## example-backend-next@0.0.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.7.0-next.1
+ - @backstage/backend-defaults@0.1.2-next.1
+ - @backstage/plugin-app-backend@0.3.37-next.1
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
+## techdocs-cli-embedded-app@0.2.75-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.6.0-next.1
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/cli@0.20.0-next.1
+ - @backstage/plugin-techdocs@1.3.3-next.1
+ - @backstage/app-defaults@1.0.7-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/test-utils@1.2.1-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-techdocs-react@1.0.5-next.1
+
+## @internal/plugin-catalog-customized@0.0.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/plugin-catalog@1.6.0-next.1
+
+## @internal/plugin-todo-list@1.0.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
+## @internal/plugin-todo-list-backend@1.0.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/plugin-auth-node@0.2.6-next.1
+
+## @internal/plugin-todo-list-common@1.0.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.6.5-next.1
diff --git a/microsite/data/on-demand/20220817-1.yaml b/microsite/data/on-demand/20220817-1.yaml
index c0973656b4..f67c8cf4cd 100644
--- a/microsite/data/on-demand/20220817-1.yaml
+++ b/microsite/data/on-demand/20220817-1.yaml
@@ -1,9 +1,7 @@
---
title: Adopters Community Sessions
date: August 17, 2022
-category: Upcoming
+category: Meetup
description: Adopters Community Session ✨. It's the monthly meetup where we all come together to listen to the latest maintainer updates, learn from each other about adopting, share exciting new demos or discuss any relevant topic like developer effectiveness, developer experience, developer portals, etc.
youtubeUrl: https://youtu.be/qYnvc8ge1kg
youtubeImgUrl: https://backstage.io/img/b-sessions.png
-rsvpUrl: https://calendar.google.com/calendar/embed?src=c_qup9gbhn9sqpuao6trttd8mk5s@group.calendar.google.com
-eventUrl: https://github.com/backstage/community/issues/54
diff --git a/microsite/data/on-demand/20220824-1.yaml b/microsite/data/on-demand/20220824-1.yaml
index 411b87c74f..a2387a8aad 100644
--- a/microsite/data/on-demand/20220824-1.yaml
+++ b/microsite/data/on-demand/20220824-1.yaml
@@ -1,9 +1,7 @@
---
title: Contributor Community Sessions
date: August 24, 2022
-category: Upcoming
+category: Meetup
description: Join the maintainers and contributors for the Contributor Community Sessions
-youtubeUrl: https://youtu.be/qYnvc8ge1kg
+youtubeUrl: https://youtu.be/8ydEFFiuHAc
youtubeImgUrl: https://backstage.io/img/b-sessions.png
-rsvpUrl: https://calendar.google.com/calendar/embed?src=c_qup9gbhn9sqpuao6trttd8mk5s@group.calendar.google.com
-eventUrl: https://github.com/backstage/community/issues/54
diff --git a/microsite/data/on-demand/20220921-1.yaml b/microsite/data/on-demand/20220921-1.yaml
new file mode 100644
index 0000000000..fe3dda08c0
--- /dev/null
+++ b/microsite/data/on-demand/20220921-1.yaml
@@ -0,0 +1,7 @@
+---
+title: Adopters Community Sessions
+date: September 21, 2022
+category: Meetup
+description: Adopters Community Session ✨. It's the monthly meetup where we all come together to listen to the latest maintainer updates, learn from each other about adopting, share exciting new demos or discuss any relevant topic like developer effectiveness, developer experience, developer portals, etc.
+youtubeUrl: https://youtu.be/K44RQAVWWnY
+youtubeImgUrl: https://backstage.io/img/b-sessions.png
diff --git a/microsite/data/on-demand/20220928-1.yaml b/microsite/data/on-demand/20220928-1.yaml
new file mode 100644
index 0000000000..31ae752e3a
--- /dev/null
+++ b/microsite/data/on-demand/20220928-1.yaml
@@ -0,0 +1,7 @@
+---
+title: Contributor Community Sessions
+date: September 28, 2022
+category: Meetup
+description: Join the maintainers and contributors for the Contributor Community Sessions
+youtubeUrl: https://youtu.be/jmNT5x3mKaQ
+youtubeImgUrl: https://backstage.io/img/b-sessions.png
diff --git a/microsite/data/plugins/score-card.yaml b/microsite/data/plugins/score-card.yaml
new file mode 100644
index 0000000000..040d94ed44
--- /dev/null
+++ b/microsite/data/plugins/score-card.yaml
@@ -0,0 +1,9 @@
+---
+title: System scoring
+author: Oriflame
+authorUrl: https://github.com/Oriflame
+category: Quality
+description: Visualization of maturity (and improving it) of services/systems thanks to a review process.
+documentation: https://github.com/Oriflame/backstage-plugins/tree/main/plugins/score-card
+iconUrl: img/score-card-plugin-logo.png
+npmPackageName: '@oriflame/backstage-plugin-score-card'
diff --git a/microsite/sidebars.json b/microsite/sidebars.json
index fbad2529e5..a93e148317 100644
--- a/microsite/sidebars.json
+++ b/microsite/sidebars.json
@@ -278,6 +278,7 @@
},
"auth/identity-resolver",
"auth/oauth",
+ "auth/oidc",
"auth/add-auth-provider",
"auth/service-to-service-auth",
"auth/troubleshooting",
diff --git a/microsite/static/img/score-card-plugin-logo.png b/microsite/static/img/score-card-plugin-logo.png
new file mode 100644
index 0000000000..d1bed73217
Binary files /dev/null and b/microsite/static/img/score-card-plugin-logo.png differ
diff --git a/mkdocs.yml b/mkdocs.yml
index 9612a68534..36ff1c6348 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -163,6 +163,7 @@ nav:
- Bitbucket: 'auth/bitbucket/provider.md'
- Sign in resolvers: 'auth/identity-resolver.md'
- OAuth and OpenID Connect: 'auth/oauth.md'
+ - OIDC provider from scratch: 'auth/oidc.md'
- Contributing New Providers: 'auth/add-auth-provider.md'
- Service to Service Auth: 'auth/service-to-service-auth.md'
- Troubleshooting Auth: 'auth/troubleshooting.md'
diff --git a/package.json b/package.json
index 394a6eca29..40e2056e8c 100644
--- a/package.json
+++ b/package.json
@@ -44,7 +44,7 @@
"@types/react": "^17",
"@types/react-dom": "^17"
},
- "version": "1.7.0-next.0",
+ "version": "1.7.0-next.1",
"dependencies": {
"@manypkg/get-packages": "^1.1.3",
"@microsoft/api-documenter": "^7.17.11",
diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md
index b4b1d861ac..c4082ad530 100644
--- a/packages/app-defaults/CHANGELOG.md
+++ b/packages/app-defaults/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/app-defaults
+## 1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-permission-react@0.4.6-next.1
+
## 1.0.7-next.0
### Patch Changes
diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json
index c1cb3ba39c..476509730a 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.0.7-next.0",
+ "version": "1.0.7-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index 47ee55e1af..d492b19a1a 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,67 @@
# example-app
+## 0.2.76-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-user-settings@0.5.0-next.1
+ - @backstage/plugin-scaffolder@1.7.0-next.1
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/cli@0.20.0-next.1
+ - @backstage/plugin-tech-insights@0.3.1-next.1
+ - @backstage/plugin-gcalendar@0.3.6-next.1
+ - @backstage/plugin-api-docs@0.8.10-next.1
+ - @backstage/plugin-search-react@1.2.0-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/plugin-airbrake@0.3.10-next.1
+ - @backstage/plugin-azure-devops@0.2.1-next.1
+ - @backstage/plugin-badges@0.2.34-next.1
+ - @internal/plugin-catalog-customized@0.0.3-next.1
+ - @backstage/plugin-catalog-graph@0.2.22-next.1
+ - @backstage/plugin-catalog-import@0.8.13-next.1
+ - @backstage/plugin-circleci@0.3.10-next.1
+ - @backstage/plugin-cloudbuild@0.3.10-next.1
+ - @backstage/plugin-code-coverage@0.2.3-next.1
+ - @backstage/plugin-dynatrace@1.0.0-next.1
+ - @backstage/plugin-explore@0.3.41-next.1
+ - @backstage/plugin-github-actions@0.5.10-next.1
+ - @backstage/plugin-gocd@0.1.16-next.1
+ - @backstage/plugin-home@0.4.26-next.1
+ - @backstage/plugin-jenkins@0.7.9-next.1
+ - @backstage/plugin-kafka@0.3.10-next.1
+ - @backstage/plugin-kubernetes@0.7.3-next.1
+ - @backstage/plugin-lighthouse@0.3.10-next.1
+ - @backstage/plugin-newrelic-dashboard@0.2.3-next.1
+ - @backstage/plugin-org@0.5.10-next.1
+ - @backstage/plugin-pagerduty@0.5.3-next.1
+ - @backstage/plugin-playlist@0.1.1-next.1
+ - @backstage/plugin-rollbar@0.4.10-next.1
+ - @backstage/plugin-search@1.0.3-next.1
+ - @backstage/plugin-sentry@0.4.3-next.1
+ - @backstage/plugin-techdocs@1.3.3-next.1
+ - @backstage/plugin-todo@0.2.12-next.1
+ - @backstage/app-defaults@1.0.7-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/plugin-apache-airflow@0.2.3-next.1
+ - @backstage/plugin-cost-insights@0.11.32-next.1
+ - @backstage/plugin-gcp-projects@0.3.29-next.1
+ - @backstage/plugin-graphiql@0.2.42-next.1
+ - @backstage/plugin-newrelic@0.3.28-next.1
+ - @backstage/plugin-shortcuts@0.3.2-next.1
+ - @backstage/plugin-stack-overflow@0.1.6-next.1
+ - @backstage/plugin-tech-radar@0.5.17-next.1
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.5-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-catalog-common@1.0.7-next.1
+ - @backstage/plugin-permission-react@0.4.6-next.1
+ - @backstage/plugin-techdocs-react@1.0.5-next.1
+
## 0.2.76-next.0
### Patch Changes
diff --git a/packages/app/package.json b/packages/app/package.json
index 88c6407ba3..7960bb115b 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,6 +1,6 @@
{
"name": "example-app",
- "version": "0.2.76-next.0",
+ "version": "0.2.76-next.1",
"private": true,
"backstage": {
"role": "frontend"
@@ -68,6 +68,7 @@
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
"@octokit/rest": "^19.0.3",
+ "@oriflame/backstage-plugin-score-card": "^0.5.1",
"@roadiehq/backstage-plugin-buildkite": "^2.0.8",
"@roadiehq/backstage-plugin-github-insights": "^2.0.5",
"@roadiehq/backstage-plugin-github-pull-requests": "^2.2.7",
diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx
index 0b8107a216..d6b66d57a7 100644
--- a/packages/app/src/App.tsx
+++ b/packages/app/src/App.tsx
@@ -106,6 +106,7 @@ import { RequirePermission } from '@backstage/plugin-permission-react';
import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
import { PlaylistIndexPage } from '@backstage/plugin-playlist';
import { TwoColumnLayout } from './components/scaffolder/customScaffolderLayouts';
+import { ScoreBoardPage } from '@oriflame/backstage-plugin-score-card';
const app = createApp({
apis,
@@ -273,6 +274,7 @@ const routes = (
} />
} />
} />
+ } />
);
diff --git a/packages/app/src/components/Root/Root.tsx b/packages/app/src/components/Root/Root.tsx
index 8b5f0932fb..0c142bafbd 100644
--- a/packages/app/src/components/Root/Root.tsx
+++ b/packages/app/src/components/Root/Root.tsx
@@ -51,6 +51,7 @@ import {
import { MyGroupsSidebarItem } from '@backstage/plugin-org';
import GroupIcon from '@material-ui/icons/People';
import { SearchModal } from '../search/SearchModal';
+import Score from '@material-ui/icons/Score';
const useSidebarLogoStyles = makeStyles({
root: {
@@ -120,6 +121,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => (
text="Cost Insights"
/>
+
diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx
index c2f297a2d7..f7592eb0b9 100644
--- a/packages/app/src/components/catalog/EntityPage.tsx
+++ b/packages/app/src/components/catalog/EntityPage.tsx
@@ -144,6 +144,7 @@ import {
EntityNewRelicDashboardCard,
} from '@backstage/plugin-newrelic-dashboard';
import { EntityGoCdContent, isGoCdAvailable } from '@backstage/plugin-gocd';
+import { EntityScoreCardContent } from '@oriflame/backstage-plugin-score-card';
import React, { ReactNode, useMemo, useState } from 'react';
@@ -704,6 +705,13 @@ const systemPage = (
+
+
+
+
+
+
+ {
},
},
};
- const manager = DatabaseManager.fromConfig(new ConfigReader(config));
+ let manager: DatabaseManager;
+
+ beforeEach(() => {
+ manager = DatabaseManager.fromConfig(new ConfigReader(config));
+ });
it('connects to a plugin database using default config', async () => {
const pluginId = 'pluginwithoutconfig';
@@ -340,6 +344,16 @@ describe('DatabaseManager', () => {
);
});
+ it('returns the same client for the same pluginId', async () => {
+ const [client1, client2] = await Promise.all([
+ manager.forPlugin('plugin1').getClient(),
+ manager.forPlugin('plugin1').getClient(),
+ ]);
+ expect(mocked(createDatabaseClient)).toHaveBeenCalledTimes(1);
+
+ expect(client1).toBe(client2);
+ });
+
it('uses plugin connection as base if default client is different from plugin client', async () => {
const pluginId = 'differentclient';
await manager.forPlugin(pluginId).getClient();
diff --git a/packages/backend-common/src/database/DatabaseManager.ts b/packages/backend-common/src/database/DatabaseManager.ts
index 363bcac30b..5adb862e38 100644
--- a/packages/backend-common/src/database/DatabaseManager.ts
+++ b/packages/backend-common/src/database/DatabaseManager.ts
@@ -84,6 +84,7 @@ export class DatabaseManager {
private readonly config: Config,
private readonly prefix: string = 'backstage_plugin_',
private readonly options?: DatabaseManagerOptions,
+ private readonly databaseCache: Map> = new Map(),
) {}
/**
@@ -307,45 +308,57 @@ export class DatabaseManager {
* plugin
*/
private async getDatabase(pluginId: string): Promise {
- const pluginConfig = new ConfigReader(
- this.getConfigForPlugin(pluginId) as JsonObject,
- );
-
- const databaseName = this.getDatabaseName(pluginId);
- if (databaseName && this.getEnsureExistsConfig(pluginId)) {
- try {
- await ensureDatabaseExists(pluginConfig, databaseName);
- } catch (error) {
- throw new Error(
- `Failed to connect to the database to make sure that '${databaseName}' exists, ${error}`,
- );
- }
+ if (this.databaseCache.has(pluginId)) {
+ return this.databaseCache.get(pluginId)!;
}
- let schemaOverrides;
- if (this.getPluginDivisionModeConfig() === 'schema') {
- schemaOverrides = this.getSchemaOverrides(pluginId);
- if (this.getEnsureExistsConfig(pluginId)) {
+ const clientPromise = Promise.resolve().then(async () => {
+ const pluginConfig = new ConfigReader(
+ this.getConfigForPlugin(pluginId) as JsonObject,
+ );
+
+ const databaseName = this.getDatabaseName(pluginId);
+ if (databaseName && this.getEnsureExistsConfig(pluginId)) {
try {
- await ensureSchemaExists(pluginConfig, pluginId);
+ await ensureDatabaseExists(pluginConfig, databaseName);
} catch (error) {
throw new Error(
- `Failed to connect to the database to make sure that schema for plugin '${pluginId}' exists, ${error}`,
+ `Failed to connect to the database to make sure that '${databaseName}' exists, ${error}`,
);
}
}
- }
- const databaseClientOverrides = mergeDatabaseConfig(
- {},
- this.getDatabaseOverrides(pluginId),
- schemaOverrides,
- );
+ let schemaOverrides;
+ if (this.getPluginDivisionModeConfig() === 'schema') {
+ schemaOverrides = this.getSchemaOverrides(pluginId);
+ if (this.getEnsureExistsConfig(pluginId)) {
+ try {
+ await ensureSchemaExists(pluginConfig, pluginId);
+ } catch (error) {
+ throw new Error(
+ `Failed to connect to the database to make sure that schema for plugin '${pluginId}' exists, ${error}`,
+ );
+ }
+ }
+ }
- const client = createDatabaseClient(pluginConfig, databaseClientOverrides);
- this.startKeepaliveLoop(pluginId, client);
+ const databaseClientOverrides = mergeDatabaseConfig(
+ {},
+ this.getDatabaseOverrides(pluginId),
+ schemaOverrides,
+ );
- return client;
+ const client = createDatabaseClient(
+ pluginConfig,
+ databaseClientOverrides,
+ );
+ this.startKeepaliveLoop(pluginId, client);
+ return client;
+ });
+
+ this.databaseCache.set(pluginId, clientPromise);
+
+ return clientPromise;
}
private startKeepaliveLoop(pluginId: string, client: Knex): void {
diff --git a/packages/backend-common/src/middleware/notFoundHandler.test.ts b/packages/backend-common/src/middleware/notFoundHandler.test.ts
index b0dea8ef62..b49e275a69 100644
--- a/packages/backend-common/src/middleware/notFoundHandler.test.ts
+++ b/packages/backend-common/src/middleware/notFoundHandler.test.ts
@@ -21,7 +21,7 @@ import { notFoundHandler } from './notFoundHandler';
describe('notFoundHandler', () => {
it('handles only missing routes', async () => {
const app = express();
- app.use('/exists', (_, res) => res.status(200).send());
+ app.use('/exists', (_, res) => res.status(200).end());
app.use(notFoundHandler());
const existsResponse = await request(app).get('/exists');
diff --git a/packages/backend-common/src/middleware/notFoundHandler.ts b/packages/backend-common/src/middleware/notFoundHandler.ts
index 53a548c0ad..2d8b0ef3d0 100644
--- a/packages/backend-common/src/middleware/notFoundHandler.ts
+++ b/packages/backend-common/src/middleware/notFoundHandler.ts
@@ -28,6 +28,6 @@ import { NextFunction, Request, RequestHandler, Response } from 'express';
export function notFoundHandler(): RequestHandler {
/* eslint-disable @typescript-eslint/no-unused-vars */
return (_request: Request, response: Response, _next: NextFunction) => {
- response.status(404).send();
+ response.status(404).end();
};
}
diff --git a/packages/backend-common/src/middleware/requestLoggingHandler.test.ts b/packages/backend-common/src/middleware/requestLoggingHandler.test.ts
index c95e59f80b..ed24f2050b 100644
--- a/packages/backend-common/src/middleware/requestLoggingHandler.test.ts
+++ b/packages/backend-common/src/middleware/requestLoggingHandler.test.ts
@@ -26,8 +26,8 @@ describe('requestLoggingHandler', () => {
const app = express();
app.use(requestLoggingHandler(logger));
- app.use('/exists1', (_, res) => res.status(200).send());
- app.use('/exists2', (_, res) => res.status(201).send());
+ app.use('/exists1', (_, res) => res.status(200).end());
+ app.use('/exists2', (_, res) => res.status(201).end());
const r = request(app);
await r.get('/exists1');
diff --git a/packages/backend-common/src/middleware/statusCheckHandler.ts b/packages/backend-common/src/middleware/statusCheckHandler.ts
index 4655d610fe..4bd1a701c3 100644
--- a/packages/backend-common/src/middleware/statusCheckHandler.ts
+++ b/packages/backend-common/src/middleware/statusCheckHandler.ts
@@ -55,7 +55,7 @@ export async function statusCheckHandler(
return async (_request: Request, response: Response, next: NextFunction) => {
try {
const status = await statusCheck();
- response.status(200).header('').send(status);
+ response.status(200).json(status);
} catch (err) {
next(err);
}
diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md
index 4f56cd17f7..8d980fe1bc 100644
--- a/packages/backend-defaults/CHANGELOG.md
+++ b/packages/backend-defaults/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/backend-defaults
+## 0.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/backend-app-api@0.2.2-next.1
+
## 0.1.2-next.0
### Patch Changes
diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json
index e518c0737a..1d0a3f09f6 100644
--- a/packages/backend-defaults/package.json
+++ b/packages/backend-defaults/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-defaults",
"description": "Backend defaults used by Backstage backend apps",
- "version": "0.1.2-next.0",
+ "version": "0.1.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md
index 2247f7b7a5..e8d6cefa1b 100644
--- a/packages/backend-next/CHANGELOG.md
+++ b/packages/backend-next/CHANGELOG.md
@@ -1,5 +1,15 @@
# example-backend-next
+## 0.0.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.7.0-next.1
+ - @backstage/backend-defaults@0.1.2-next.1
+ - @backstage/plugin-app-backend@0.3.37-next.1
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+
## 0.0.4-next.0
### Patch Changes
diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json
index 1c3de17651..7db8ef9775 100644
--- a/packages/backend-next/package.json
+++ b/packages/backend-next/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend-next",
- "version": "0.0.4-next.0",
+ "version": "0.0.4-next.1",
"main": "dist/index.cjs.js",
"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 3ee241792a..21897d0a97 100644
--- a/packages/backend-plugin-api/CHANGELOG.md
+++ b/packages/backend-plugin-api/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/backend-plugin-api
+## 0.1.3-next.1
+
+### Patch Changes
+
+- a35a27df70: Added documentation for `createBackendModule`, with guidelines for choosing a module ID.
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+
## 0.1.3-next.0
### Patch Changes
diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md
index 2d4e431502..70ab168053 100644
--- a/packages/backend-plugin-api/api-report.md
+++ b/packages/backend-plugin-api/api-report.md
@@ -71,7 +71,7 @@ export const cacheServiceRef: ServiceRef;
// @public (undocumented)
export const configServiceRef: ServiceRef;
-// @public (undocumented)
+// @public
export function createBackendModule<
TOptions extends object | undefined = undefined,
>(
diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json
index 72ac712f29..80e3a8adfa 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.1.3-next.0",
+ "version": "0.1.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend-plugin-api/src/wiring/factories.ts b/packages/backend-plugin-api/src/wiring/factories.ts
index 35f1ad1b7c..831e40f9f8 100644
--- a/packages/backend-plugin-api/src/wiring/factories.ts
+++ b/packages/backend-plugin-api/src/wiring/factories.ts
@@ -69,7 +69,18 @@ export interface BackendModuleConfig {
): void;
}
-/** @public */
+/**
+ * @public
+ *
+ * Creates a new backend module for a given plugin.
+ *
+ * The `moduleId` should be equal to the module-specific prefix of the exported name, such
+ * that the full name is `moduleId + PluginId + "Module"`. For example, a GitHub entity
+ * provider module for the `catalog` plugin might have the module ID `'githubEntityProvider'`,
+ * and the full exported name would be `githubEntityProviderCatalogModule`.
+ *
+ * The `pluginId` should exactly match the `id` of the plugin that the module extends.
+ */
export function createBackendModule<
TOptions extends object | undefined = undefined,
>(
diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md
index 10d7d74bb1..97468f3856 100644
--- a/packages/backend-tasks/CHANGELOG.md
+++ b/packages/backend-tasks/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/backend-tasks
+## 0.3.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+
## 0.3.6-next.0
### Patch Changes
diff --git a/packages/backend-tasks/api-report.md b/packages/backend-tasks/api-report.md
index c0802fa46c..a60f6dba37 100644
--- a/packages/backend-tasks/api-report.md
+++ b/packages/backend-tasks/api-report.md
@@ -30,6 +30,11 @@ export interface PluginTaskScheduler {
triggerTask(id: string): Promise;
}
+// @public
+export function readTaskScheduleDefinitionFromConfig(
+ config: Config,
+): TaskScheduleDefinition;
+
// @public
export type TaskFunction =
| ((abortSignal: AbortSignal_2) => void | Promise)
@@ -60,6 +65,19 @@ export interface TaskScheduleDefinition {
timeout: Duration | HumanDuration;
}
+// @public
+export interface TaskScheduleDefinitionConfig {
+ frequency:
+ | {
+ cron: string;
+ }
+ | string
+ | HumanDuration;
+ initialDelay?: string | HumanDuration;
+ scope?: 'global' | 'local';
+ timeout: string | HumanDuration;
+}
+
// @public
export class TaskScheduler {
constructor(databaseManager: DatabaseManager, logger: Logger);
diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json
index 5f62b9f2f0..9fc7d6cbae 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.3.6-next.0",
+ "version": "0.3.6-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend-tasks/src/tasks/index.ts b/packages/backend-tasks/src/tasks/index.ts
index 990d6332fc..8f30e5c8dd 100644
--- a/packages/backend-tasks/src/tasks/index.ts
+++ b/packages/backend-tasks/src/tasks/index.ts
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+export { readTaskScheduleDefinitionFromConfig } from './readTaskScheduleDefinitionFromConfig';
export { TaskScheduler } from './TaskScheduler';
export type {
PluginTaskScheduler,
@@ -21,5 +22,6 @@ export type {
TaskInvocationDefinition,
TaskRunner,
TaskScheduleDefinition,
+ TaskScheduleDefinitionConfig,
HumanDuration,
} from './types';
diff --git a/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.test.ts b/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.test.ts
new file mode 100644
index 0000000000..115ef89168
--- /dev/null
+++ b/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.test.ts
@@ -0,0 +1,119 @@
+/*
+ * 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 { ConfigReader } from '@backstage/config';
+import { Duration } from 'luxon';
+import { readTaskScheduleDefinitionFromConfig } from './readTaskScheduleDefinitionFromConfig';
+import { HumanDuration } from './types';
+
+describe('readTaskScheduleDefinitionFromConfig', () => {
+ it('all valid values', () => {
+ const config = new ConfigReader({
+ frequency: {
+ cron: '0 30 * * * *',
+ },
+ timeout: 'PT3M',
+ initialDelay: {
+ minutes: 20,
+ },
+ scope: 'global',
+ });
+
+ const result = readTaskScheduleDefinitionFromConfig(config);
+
+ expect((result.frequency as { cron: string }).cron).toBe('0 30 * * * *');
+ expect(result.timeout).toEqual(Duration.fromISO('PT3M'));
+ expect((result.initialDelay as HumanDuration).minutes).toEqual(20);
+ expect(result.scope).toBe('global');
+ });
+
+ it('all valid required values', () => {
+ const config = new ConfigReader({
+ frequency: {
+ cron: '0 30 * * * *',
+ },
+ timeout: 'PT3M',
+ });
+
+ const result = readTaskScheduleDefinitionFromConfig(config);
+
+ expect((result.frequency as { cron: string }).cron).toBe('0 30 * * * *');
+ expect(result.timeout).toEqual(Duration.fromISO('PT3M'));
+ expect(result.initialDelay).toBeUndefined();
+ expect(result.scope).toBeUndefined();
+ });
+
+ it('fail without required frequency', () => {
+ const config = new ConfigReader({
+ timeout: 'PT3M',
+ });
+
+ expect(() => readTaskScheduleDefinitionFromConfig(config)).toThrow(
+ "Missing required config value at 'frequency'",
+ );
+ });
+
+ it('fail without required timeout', () => {
+ const config = new ConfigReader({
+ frequency: 'PT30M',
+ });
+
+ expect(() => readTaskScheduleDefinitionFromConfig(config)).toThrow(
+ "Missing required config value at 'timeout'",
+ );
+ });
+
+ it('invalid frequency value', () => {
+ const config = new ConfigReader({
+ frequency: {
+ invalid: 'value',
+ },
+ timeout: 'PT3M',
+ });
+
+ expect(() => readTaskScheduleDefinitionFromConfig(config)).toThrow(
+ 'HumanDuration needs at least one of',
+ );
+ });
+
+ it('frequency value with additional invalid prop', () => {
+ const config = new ConfigReader({
+ frequency: {
+ minutes: 20,
+ invalid: 'value',
+ },
+ timeout: 'PT3M',
+ });
+
+ expect(() => readTaskScheduleDefinitionFromConfig(config)).toThrow(
+ 'HumanDuration does not contain properties: invalid',
+ );
+ });
+
+ it('invalid scope value', () => {
+ const config = new ConfigReader({
+ frequency: {
+ years: 2,
+ },
+ timeout: 'PT3M',
+ scope: 'invalid',
+ });
+
+ expect(() => readTaskScheduleDefinitionFromConfig(config)).toThrow(
+ 'Only "global" or "local" are allowed for TaskScheduleDefinition.scope, but got: invalid',
+ );
+ });
+});
diff --git a/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts b/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts
new file mode 100644
index 0000000000..3267d8ef14
--- /dev/null
+++ b/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts
@@ -0,0 +1,102 @@
+/*
+ * 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 { Config } from '@backstage/config';
+import { JsonObject } from '@backstage/types';
+import { HumanDuration, TaskScheduleDefinition } from './types';
+import { Duration } from 'luxon';
+
+const propsOfHumanDuration = [
+ 'years',
+ 'months',
+ 'weeks',
+ 'days',
+ 'hours',
+ 'minutes',
+ 'seconds',
+ 'milliseconds',
+];
+
+function convertToHumanDuration(config: Config, key: string): HumanDuration {
+ const props = config.getConfig(key).keys();
+ if (!props.find(prop => propsOfHumanDuration.includes(prop))) {
+ throw new Error(
+ `HumanDuration needs at least one of: ${propsOfHumanDuration}`,
+ );
+ }
+
+ const invalidProps = props.filter(
+ prop => !propsOfHumanDuration.includes(prop),
+ );
+ if (invalidProps.length > 0) {
+ throw new Error(
+ `HumanDuration does not contain properties: ${invalidProps}`,
+ );
+ }
+
+ return config.get(key) as HumanDuration;
+}
+
+function readDuration(config: Config, key: string): Duration | HumanDuration {
+ return typeof config.get(key) === 'string'
+ ? Duration.fromISO(config.getString(key))
+ : convertToHumanDuration(config, key);
+}
+
+function readCronOrDuration(
+ config: Config,
+ key: string,
+): { cron: string } | Duration | HumanDuration {
+ const value = config.get(key);
+ if (typeof value === 'object' && (value as { cron?: string }).cron) {
+ return value as { cron: string };
+ }
+
+ return readDuration(config, key);
+}
+
+/**
+ * Reads a TaskScheduleDefinition from a Config.
+ * Expects the config not to be the root config,
+ * but the config for the definition.
+ *
+ * @param config - config for a TaskScheduleDefinition.
+ * @public
+ */
+export function readTaskScheduleDefinitionFromConfig(
+ config: Config,
+): TaskScheduleDefinition {
+ const frequency = readCronOrDuration(config, 'frequency');
+ const timeout = readDuration(config, 'timeout');
+
+ const initialDelay = config.has('initialDelay')
+ ? readDuration(config, 'initialDelay')
+ : undefined;
+
+ const scope = config.getOptionalString('scope');
+ if (scope && !['global', 'local'].includes(scope)) {
+ throw new Error(
+ `Only "global" or "local" are allowed for TaskScheduleDefinition.scope, but got: ${scope}`,
+ );
+ }
+
+ return {
+ frequency,
+ timeout,
+ initialDelay,
+ scope: scope as 'global' | 'local' | undefined,
+ };
+}
diff --git a/packages/backend-tasks/src/tasks/types.ts b/packages/backend-tasks/src/tasks/types.ts
index 86c0c5c462..92ec045605 100644
--- a/packages/backend-tasks/src/tasks/types.ts
+++ b/packages/backend-tasks/src/tasks/types.ts
@@ -58,7 +58,7 @@ export interface TaskScheduleDefinition {
*
* @remarks
*
- * This is a best effort value; under some circumstances there can be
+ * This is the best effort value; under some circumstances there can be
* deviations. For example, if the task runtime is longer than the frequency
* and the timeout has not been given or not been exceeded yet, the next
* invocation of this task will be delayed until after the previous one
@@ -112,7 +112,7 @@ export interface TaskScheduleDefinition {
* collaborating on a task that has its `scope` field set to `'global'`, then
* you may still see the task being processed by other long-lived workers,
* while any given single worker is in its initial sleep delay time e.g. after
- * a deployment. Therefore this parameter is not useful for "globally" pausing
+ * a deployment. Therefore, this parameter is not useful for "globally" pausing
* work; its main intended use is for individual machines to get a chance to
* reach some equilibrium at startup before triggering heavy batch workloads.
*/
@@ -128,7 +128,104 @@ export interface TaskScheduleDefinition {
* attempt to ensure that only one worker machine runs the task at a time,
* according to the given cadence. This means that as the number of worker
* hosts increases, the invocation frequency of this task will not go up.
- * Instead the load is spread randomly across hosts. This setting is useful
+ * Instead, the load is spread randomly across hosts. This setting is useful
+ * for tasks that access shared resources, for example catalog ingestion tasks
+ * where you do not want many machines to repeatedly import the same data and
+ * trample over each other.
+ *
+ * When the scope is set to `'local'`, there is no concurrency control across
+ * hosts. Each host runs the task according to the given cadence similarly to
+ * `setInterval`, but the runtime ensures that there are no overlapping runs.
+ *
+ * @defaultValue 'global'
+ */
+ scope?: 'global' | 'local';
+}
+
+/**
+ * Config options for {@link TaskScheduleDefinition}
+ * that control the scheduling of a task.
+ *
+ * @public
+ */
+export interface TaskScheduleDefinitionConfig {
+ /**
+ * How often you want the task to run. The system does its best to avoid
+ * overlapping invocations.
+ *
+ * @remarks
+ *
+ * This is the best effort value; under some circumstances there can be
+ * deviations. For example, if the task runtime is longer than the frequency
+ * and the timeout has not been given or not been exceeded yet, the next
+ * invocation of this task will be delayed until after the previous one
+ * finishes.
+ *
+ * This is a required field.
+ */
+ frequency:
+ | {
+ /**
+ * A crontab style string.
+ *
+ * @remarks
+ *
+ * Overview:
+ *
+ * ```
+ * ┌────────────── second (optional)
+ * │ ┌──────────── minute
+ * │ │ ┌────────── hour
+ * │ │ │ ┌──────── day of month
+ * │ │ │ │ ┌────── month
+ * │ │ │ │ │ ┌──── day of week
+ * │ │ │ │ │ │
+ * │ │ │ │ │ │
+ * * * * * * *
+ * ```
+ */
+ cron: string;
+ }
+ | string
+ | HumanDuration;
+
+ /**
+ * The maximum amount of time that a single task invocation can take, before
+ * it's considered timed out and gets "released" such that a new invocation
+ * is permitted to take place (possibly, then, on a different worker).
+ */
+ timeout: string | HumanDuration;
+
+ /**
+ * The amount of time that should pass before the first invocation happens.
+ *
+ * @remarks
+ *
+ * This can be useful in cold start scenarios to stagger or delay some heavy
+ * compute jobs. If no value is given for this field then the first invocation
+ * will happen as soon as possible according to the cadence.
+ *
+ * NOTE: This is a per-worker delay. If you have a cluster of workers all
+ * collaborating on a task that has its `scope` field set to `'global'`, then
+ * you may still see the task being processed by other long-lived workers,
+ * while any given single worker is in its initial sleep delay time e.g. after
+ * a deployment. Therefore, this parameter is not useful for "globally" pausing
+ * work; its main intended use is for individual machines to get a chance to
+ * reach some equilibrium at startup before triggering heavy batch workloads.
+ */
+ initialDelay?: string | HumanDuration;
+
+ /**
+ * Sets the scope of concurrency control / locking to apply for invocations of
+ * this task.
+ *
+ * @remarks
+ *
+ * When the scope is set to the default value `'global'`, the scheduler will
+ * attempt to ensure that only one worker machine runs the task at a time,
+ * according to the given cadence. This means that as the number of worker
+ * hosts increases, the invocation frequency of this task will not go up.
+ * Instead, the load is spread randomly across hosts. This setting is useful
* for tasks that access shared resources, for example catalog ingestion tasks
* where you do not want many machines to repeatedly import the same data and
* trample over each other.
diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md
index 4595ae773c..753ad24289 100644
--- a/packages/backend-test-utils/CHANGELOG.md
+++ b/packages/backend-test-utils/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/backend-test-utils
+## 0.1.29-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.20.0-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/backend-app-api@0.2.2-next.1
+ - @backstage/config@1.0.3-next.1
+
## 0.1.29-next.0
### Patch Changes
diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json
index 03f04c4cad..5249196860 100644
--- a/packages/backend-test-utils/package.json
+++ b/packages/backend-test-utils/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-test-utils",
"description": "Test helpers library for Backstage backends",
- "version": "0.1.29-next.0",
+ "version": "0.1.29-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index b9ce0dfcc2..c5dc2f71bd 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,47 @@
# example-backend
+## 0.2.76-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-backend@0.17.0-next.1
+ - @backstage/plugin-search-backend@1.1.0-next.1
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-scaffolder-backend@1.7.0-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/plugin-search-backend-node@1.0.3-next.1
+ - @backstage/plugin-search-backend-module-pg@0.4.1-next.1
+ - @backstage/plugin-search-backend-module-elasticsearch@1.0.3-next.1
+ - @backstage/plugin-kubernetes-backend@0.7.3-next.1
+ - @backstage/plugin-tech-insights-backend@0.5.3-next.1
+ - example-app@0.2.76-next.1
+ - @backstage/backend-tasks@0.3.6-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/plugin-app-backend@0.3.37-next.1
+ - @backstage/plugin-auth-node@0.2.6-next.1
+ - @backstage/plugin-azure-devops-backend@0.3.16-next.1
+ - @backstage/plugin-badges-backend@0.1.31-next.1
+ - @backstage/plugin-catalog-backend@1.4.1-next.1
+ - @backstage/plugin-code-coverage-backend@0.2.3-next.1
+ - @backstage/plugin-graphql-backend@0.1.27-next.1
+ - @backstage/plugin-jenkins-backend@0.1.27-next.1
+ - @backstage/plugin-kafka-backend@0.2.30-next.1
+ - @backstage/plugin-permission-backend@0.5.12-next.1
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-permission-node@0.6.6-next.1
+ - @backstage/plugin-playlist-backend@0.1.1-next.1
+ - @backstage/plugin-proxy-backend@0.2.31-next.1
+ - @backstage/plugin-rollbar-backend@0.1.34-next.1
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.5-next.1
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21-next.1
+ - @backstage/plugin-tech-insights-node@0.3.5-next.1
+ - @backstage/plugin-techdocs-backend@1.3.1-next.1
+ - @backstage/plugin-todo-backend@0.1.34-next.1
+
## 0.2.76-next.0
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 3a5dc6fbe7..f89fcbf0e5 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend",
- "version": "0.2.76-next.0",
+ "version": "0.2.76-next.1",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md
index 878fb489c6..0e5a847703 100644
--- a/packages/catalog-client/CHANGELOG.md
+++ b/packages/catalog-client/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/catalog-client
+## 1.1.1-next.1
+
+### Patch Changes
+
+- 4f2ac624b4: Renamed argument in `validateEntity` from `location` to `locationRef`
+- Updated dependencies
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+
## 1.1.1-next.0
### Patch Changes
diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json
index 52e763d55b..31b8654556 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.1.1-next.0",
+ "version": "1.1.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md
index 21da581831..6352f13760 100644
--- a/packages/catalog-model/CHANGELOG.md
+++ b/packages/catalog-model/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/catalog-model
+## 1.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+
## 1.1.2-next.0
### Patch Changes
diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json
index f11dbe67c1..b1a83fbeb0 100644
--- a/packages/catalog-model/package.json
+++ b/packages/catalog-model/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/catalog-model",
"description": "Types and validators that help describe the model of a Backstage Catalog",
- "version": "1.1.2-next.0",
+ "version": "1.1.2-next.1",
"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 79ace4911a..90caca8f18 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/cli
+## 0.20.0-next.1
+
+### Patch Changes
+
+- 78d5eb299e: Tweak the Jest Caching loader to only operate when in `watch` mode
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+ - @backstage/config@1.0.3-next.1
+ - @backstage/config-loader@1.1.5-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/release-manifests@0.0.6
+ - @backstage/types@1.0.0
+
## 0.20.0-next.0
### Minor Changes
diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js
index 8b6c37bda4..18f563a3a3 100644
--- a/packages/cli/config/jest.js
+++ b/packages/cli/config/jest.js
@@ -25,6 +25,11 @@ const envOptions = {
enableSourceMaps: Boolean(process.env.ENABLE_SOURCE_MAPS),
};
+if (envOptions.nextTests) {
+ // Needed so that, at import-time, it can hook into Jest's internals.
+ require('./jestCachingModuleLoader');
+}
+
const transformIgnorePattern = [
'@material-ui',
'ajv',
diff --git a/packages/cli/config/jestCachingModuleLoader.js b/packages/cli/config/jestCachingModuleLoader.js
index 9ef29d7485..7858a7cfb7 100644
--- a/packages/cli/config/jestCachingModuleLoader.js
+++ b/packages/cli/config/jestCachingModuleLoader.js
@@ -21,6 +21,7 @@ const fileTransformCache = new Map();
const scriptTransformCache = new Map();
let runtimeGeneration = 0;
+let isWatchMode;
module.exports = class CachingJestRuntime extends JestRuntime {
// Each Jest run creates a new runtime, including when rerunning tests in
@@ -28,6 +29,10 @@ module.exports = class CachingJestRuntime extends JestRuntime {
__runtimeGeneration = runtimeGeneration++;
transformFile(filename, options) {
+ if (!isWatchMode) {
+ return super.transformFile(filename, options);
+ }
+
const entry = fileTransformCache.get(filename);
if (entry) {
// Only check modification time if it's from a different runtime generation
@@ -79,3 +84,11 @@ module.exports = class CachingJestRuntime extends JestRuntime {
return script;
}
};
+
+// Inject hook into createHasteMap, as it's the only way that we can
+// determine (from our scope here) if we're in "watch mode" or not.
+const originalCreateHasteMap = JestRuntime.createHasteMap;
+JestRuntime.createHasteMap = (config, options = undefined) => {
+ isWatchMode = options && options.watch;
+ return originalCreateHasteMap(config, options);
+};
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 9e54e01966..66f69772d5 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.20.0-next.0",
+ "version": "0.20.0-next.1",
"publishConfig": {
"access": "public"
},
diff --git a/packages/cli/templates/default-backend-plugin/src/service/router.ts b/packages/cli/templates/default-backend-plugin/src/service/router.ts
index 9ceaa47627..5912a87584 100644
--- a/packages/cli/templates/default-backend-plugin/src/service/router.ts
+++ b/packages/cli/templates/default-backend-plugin/src/service/router.ts
@@ -33,7 +33,7 @@ export async function createRouter(
router.get('/health', (_, response) => {
logger.info('PONG!');
- response.send({ status: 'ok' });
+ response.json({ status: 'ok' });
});
router.use(errorHandler());
return router;
diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md
index 233d550f88..673054c186 100644
--- a/packages/codemods/CHANGELOG.md
+++ b/packages/codemods/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/codemods
+## 0.1.40-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+
## 0.1.40-next.0
### Patch Changes
diff --git a/packages/codemods/package.json b/packages/codemods/package.json
index d25c933514..4996887eed 100644
--- a/packages/codemods/package.json
+++ b/packages/codemods/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/codemods",
"description": "A collection of codemods for Backstage projects",
- "version": "0.1.40-next.0",
+ "version": "0.1.40-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.cjs.js"
diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md
index 34d0c3bd50..0c1afa75c1 100644
--- a/packages/config-loader/CHANGELOG.md
+++ b/packages/config-loader/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/config-loader
+## 1.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+
## 1.1.5-next.0
### Patch Changes
diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json
index ef899dd332..3fb1da9e1f 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.1.5-next.0",
+ "version": "1.1.5-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.cjs.js",
diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md
index 9993c4654f..151201bfa7 100644
--- a/packages/config/CHANGELOG.md
+++ b/packages/config/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/config
+## 1.0.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.0
+
## 1.0.3-next.0
### Patch Changes
diff --git a/packages/config/package.json b/packages/config/package.json
index 14ae285fdf..2305784051 100644
--- a/packages/config/package.json
+++ b/packages/config/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/config",
"description": "Config API used by Backstage core, backend, and CLI",
- "version": "1.0.3-next.0",
+ "version": "1.0.3-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.cjs.js",
diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md
index 8c29b473c4..8914390d89 100644
--- a/packages/core-app-api/CHANGELOG.md
+++ b/packages/core-app-api/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/core-app-api
+## 1.1.1-next.1
+
+### Patch Changes
+
+- 27e6404aba: Fixed a bug where gathered index routes would fail to bind routable extensions. This would typically show up when placing a routable extension in the entity page overview tab.
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/types@1.0.0
+ - @backstage/version-bridge@1.0.1
+
## 1.1.1-next.0
### Patch Changes
diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json
index f2cc7037f6..219244eacc 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.1.1-next.0",
+ "version": "1.1.1-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/core-app-api/src/routing/collectors.stable.test.tsx b/packages/core-app-api/src/routing/collectors.stable.test.tsx
index f8f71a1a9a..de6f350cc9 100644
--- a/packages/core-app-api/src/routing/collectors.stable.test.tsx
+++ b/packages/core-app-api/src/routing/collectors.stable.test.tsx
@@ -301,7 +301,7 @@ describe('discovery', () => {
HELLO
}>
-
+
@@ -322,8 +322,8 @@ describe('discovery', () => {
[ref1, 'foo'],
[ref2, 'foo'],
[ref3, 'bar'],
- [ref4, 'baz'],
- [ref5, 'baz'],
+ [ref4, ''],
+ [ref5, ''],
]);
expect(sortedEntries(routing.parents)).toEqual([
[ref1, undefined],
@@ -337,7 +337,7 @@ describe('discovery', () => {
routeObj(
'bar',
[ref3],
- [routeObj('baz', [ref4, ref5], [], 'gathered')],
+ [routeObj('', [ref4, ref5], [], 'gathered')],
undefined,
plugin,
),
diff --git a/packages/core-app-api/src/routing/collectors.tsx b/packages/core-app-api/src/routing/collectors.tsx
index 815ae534f1..0bf5e676a4 100644
--- a/packages/core-app-api/src/routing/collectors.tsx
+++ b/packages/core-app-api/src/routing/collectors.tsx
@@ -178,7 +178,7 @@ export const routingV2Collector = createCollector(
}
if (mountPoint) {
- if (!ctx?.gatherPath) {
+ if (ctx?.gatherPath === undefined) {
throw new Error(
`Routable extension "${stringifyNode(
node,
diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md
index 05e1ddc6cb..a27be20b9f 100644
--- a/packages/core-components/CHANGELOG.md
+++ b/packages/core-components/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/core-components
+## 0.11.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/version-bridge@1.0.1
+
## 0.11.2-next.0
### Patch Changes
diff --git a/packages/core-components/package.json b/packages/core-components/package.json
index a59c9f9de2..a32d8c9af8 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.11.2-next.0",
+ "version": "0.11.2-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md
index c7d13de30e..26e18ea244 100644
--- a/packages/core-plugin-api/CHANGELOG.md
+++ b/packages/core-plugin-api/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/core-plugin-api
+## 1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.3-next.1
+ - @backstage/types@1.0.0
+ - @backstage/version-bridge@1.0.1
+
## 1.0.7-next.0
### Patch Changes
diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json
index 46e655c654..48b78a1daf 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.0.7-next.0",
+ "version": "1.0.7-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md
index 5d11588079..0e1d1a98af 100644
--- a/packages/create-app/CHANGELOG.md
+++ b/packages/create-app/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/create-app
+## 0.4.32-next.1
+
+### Patch Changes
+
+- 7c6306fc8a: Initializes a git repository when creating an app using @packages/create-app
+- Updated dependencies
+ - @backstage/cli-common@0.1.10
+
## 0.4.32-next.0
### Patch Changes
diff --git a/packages/create-app/package.json b/packages/create-app/package.json
index 48305e266c..9633c890fa 100644
--- a/packages/create-app/package.json
+++ b/packages/create-app/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "A CLI that helps you create your own Backstage app",
- "version": "0.4.32-next.0",
+ "version": "0.4.32-next.1",
"publishConfig": {
"access": "public"
},
diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md
index 27ee9913f3..01c97a4c74 100644
--- a/packages/dev-utils/CHANGELOG.md
+++ b/packages/dev-utils/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/dev-utils
+## 1.0.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/app-defaults@1.0.7-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/test-utils@1.2.1-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+
## 1.0.7-next.0
### Patch Changes
diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json
index 9420fa01db..60c877f736 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.7-next.0",
+ "version": "1.0.7-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md
index d1ea777ad2..26f45611fc 100644
--- a/packages/errors/CHANGELOG.md
+++ b/packages/errors/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/errors
+## 1.1.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.0.0
+
## 1.1.2-next.0
### Patch Changes
diff --git a/packages/errors/package.json b/packages/errors/package.json
index d337704fbd..ad10bb7ed5 100644
--- a/packages/errors/package.json
+++ b/packages/errors/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/errors",
"description": "Common utilities for error handling within Backstage",
- "version": "1.1.2-next.0",
+ "version": "1.1.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md
index d5dddcf7de..00439a9771 100644
--- a/packages/integration-react/CHANGELOG.md
+++ b/packages/integration-react/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/integration-react
+## 1.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/theme@0.2.16
+
## 1.1.5-next.0
### Patch Changes
diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json
index 48a8498595..cab328f88d 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.5-next.0",
+ "version": "1.1.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md
index 8152527cfd..134dc34c11 100644
--- a/packages/integration/CHANGELOG.md
+++ b/packages/integration/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/integration
+## 1.3.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+
## 1.3.2-next.0
### Patch Changes
diff --git a/packages/integration/package.json b/packages/integration/package.json
index 73f30509cc..169bf56353 100644
--- a/packages/integration/package.json
+++ b/packages/integration/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/integration",
"description": "Helpers for managing integrations towards external systems",
- "version": "1.3.2-next.0",
+ "version": "1.3.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md
index 099cc0a57b..49b59771c3 100644
--- a/packages/techdocs-cli-embedded-app/CHANGELOG.md
+++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md
@@ -1,5 +1,24 @@
# techdocs-cli-embedded-app
+## 0.2.75-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.6.0-next.1
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/cli@0.20.0-next.1
+ - @backstage/plugin-techdocs@1.3.3-next.1
+ - @backstage/app-defaults@1.0.7-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/test-utils@1.2.1-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-techdocs-react@1.0.5-next.1
+
## 0.2.75-next.0
### Patch Changes
diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json
index 3e75b535f2..25eb9f2b27 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.75-next.0",
+ "version": "0.2.75-next.1",
"private": true,
"backstage": {
"role": "frontend"
diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md
index e6f8519a97..c04b3b8681 100644
--- a/packages/techdocs-cli/CHANGELOG.md
+++ b/packages/techdocs-cli/CHANGELOG.md
@@ -1,5 +1,16 @@
# @techdocs/cli
+## 1.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/cli-common@0.1.10
+ - @backstage/config@1.0.3-next.1
+ - @backstage/plugin-techdocs-node@1.4.1-next.1
+
## 1.2.2-next.0
### Patch Changes
diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json
index 77e37765b2..3f00391865 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.2.2-next.0",
+ "version": "1.2.2-next.1",
"publishConfig": {
"access": "public"
},
diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md
index 4778423725..28a4a92294 100644
--- a/packages/test-utils/CHANGELOG.md
+++ b/packages/test-utils/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/test-utils
+## 1.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.1.1-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/types@1.0.0
+ - @backstage/plugin-permission-common@0.6.5-next.1
+ - @backstage/plugin-permission-react@0.4.6-next.1
+
## 1.2.1-next.0
### Patch Changes
diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json
index 8021137fb4..a7bcbab826 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.2.1-next.0",
+ "version": "1.2.1-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md
index 66c7e6a9ab..a13f16e340 100644
--- a/plugins/adr-backend/CHANGELOG.md
+++ b/plugins/adr-backend/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-adr-backend
+## 0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+ - @backstage/plugin-adr-common@0.2.2-next.1
+
## 0.2.2-next.0
### Patch Changes
diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json
index 833bd057db..ff232e6b69 100644
--- a/plugins/adr-backend/package.json
+++ b/plugins/adr-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr-backend",
- "version": "0.2.2-next.0",
+ "version": "0.2.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md
index 7f9e88e4e6..d1738d9920 100644
--- a/plugins/adr-common/CHANGELOG.md
+++ b/plugins/adr-common/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-adr-common
+## 0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/integration@1.3.2-next.1
+
## 0.2.2-next.0
### Patch Changes
diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json
index ecf901869f..8358349631 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.2-next.0",
+ "version": "0.2.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md
index e3be268d9d..7ac3655e03 100644
--- a/plugins/adr/CHANGELOG.md
+++ b/plugins/adr/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-adr
+## 0.2.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/plugin-search-react@1.2.0-next.1
+ - @backstage/plugin-search-common@1.1.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/integration-react@1.1.5-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-adr-common@0.2.2-next.1
+
## 0.2.2-next.0
### Patch Changes
diff --git a/plugins/adr/package.json b/plugins/adr/package.json
index fa7543f803..4eb9cf7b03 100644
--- a/plugins/adr/package.json
+++ b/plugins/adr/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr",
- "version": "0.2.2-next.0",
+ "version": "0.2.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md
index dde95dfb46..b61f76db54 100644
--- a/plugins/airbrake-backend/CHANGELOG.md
+++ b/plugins/airbrake-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-airbrake-backend
+## 0.2.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+
## 0.2.10-next.0
### Patch Changes
diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json
index 2237277f40..2817861740 100644
--- a/plugins/airbrake-backend/package.json
+++ b/plugins/airbrake-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake-backend",
- "version": "0.2.10-next.0",
+ "version": "0.2.10-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/airbrake-backend/src/service/router.ts b/plugins/airbrake-backend/src/service/router.ts
index b870eb5c13..5dc0b44a9b 100644
--- a/plugins/airbrake-backend/src/service/router.ts
+++ b/plugins/airbrake-backend/src/service/router.ts
@@ -79,7 +79,7 @@ export async function createRouter(
router.get('/health', (_, response) => {
logger.info('PONG!');
- response.send({ status: 'ok' });
+ response.json({ status: 'ok' });
});
router.use(
diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md
index 94adddd369..c466c6cb3a 100644
--- a/plugins/airbrake/CHANGELOG.md
+++ b/plugins/airbrake/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-airbrake
+## 0.3.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/dev-utils@1.0.7-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/test-utils@1.2.1-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
## 0.3.10-next.0
### Patch Changes
diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json
index 0c2d903c48..28677b7948 100644
--- a/plugins/airbrake/package.json
+++ b/plugins/airbrake/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake",
- "version": "0.3.10-next.0",
+ "version": "0.3.10-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md
index c9a0064652..ae170e29c7 100644
--- a/plugins/allure/CHANGELOG.md
+++ b/plugins/allure/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-allure
+## 0.1.26-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.26-next.0
### Patch Changes
diff --git a/plugins/allure/package.json b/plugins/allure/package.json
index 9cd6980a86..1691a77ecf 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.26-next.0",
+ "version": "0.1.26-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md
index 53112fc359..13c445f246 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.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.21-next.0
### Patch Changes
diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json
index e0759a1838..87d6d4f0fc 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.21-next.0",
+ "version": "0.1.21-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md
index 6971c8865b..5cd28f0827 100644
--- a/plugins/apache-airflow/CHANGELOG.md
+++ b/plugins/apache-airflow/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-apache-airflow
+## 0.2.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+
## 0.2.3-next.0
### Patch Changes
diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json
index 3393caabc3..5f9c1b4f9d 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.3-next.0",
+ "version": "0.2.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md
index b6109ff8ad..432ff12f76 100644
--- a/plugins/api-docs/CHANGELOG.md
+++ b/plugins/api-docs/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-api-docs
+## 0.8.10-next.1
+
+### Patch Changes
+
+- 50c6e14aee: Updated dependency `@asyncapi/react-component` to `1.0.0-next.43`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/plugin-catalog@1.6.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
## 0.8.10-next.0
### Patch Changes
diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json
index bfbb63c7f0..bd38fa9c65 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.8.10-next.0",
+ "version": "0.8.10-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md
index a2b184b1e3..a1c6c6c8df 100644
--- a/plugins/apollo-explorer/CHANGELOG.md
+++ b/plugins/apollo-explorer/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-apollo-explorer
+## 0.1.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/theme@0.2.16
+
## 0.1.3-next.0
### Patch Changes
diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json
index 70639fb3ab..a5e598ede1 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.3-next.0",
+ "version": "0.1.3-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md
index 5a78c4e920..b1b112a030 100644
--- a/plugins/app-backend/CHANGELOG.md
+++ b/plugins/app-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-app-backend
+## 0.3.37-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-plugin-api@0.1.3-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/config-loader@1.1.5-next.1
+ - @backstage/types@1.0.0
+
## 0.3.37-next.0
### Patch Changes
diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json
index 74d8443452..db100ea12b 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.37-next.0",
+ "version": "0.3.37-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md
index bdb0a481b7..afa2d700fd 100644
--- a/plugins/auth-backend/CHANGELOG.md
+++ b/plugins/auth-backend/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/plugin-auth-backend
+## 0.17.0-next.1
+
+### Minor Changes
+
+- e2dc42e9f0: Google OAuth refresh tokens will now be revoked on logout by calling Google's API
+
+### Patch Changes
+
+- b5c126010c: Auth0 provider now supports optional `connection` and `connectionScope` parameters to configure social identity providers.
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/types@1.0.0
+ - @backstage/plugin-auth-node@0.2.6-next.1
+
## 0.17.0-next.0
### Minor Changes
diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md
index ea5b923baa..cc6962cdbe 100644
--- a/plugins/auth-backend/api-report.md
+++ b/plugins/auth-backend/api-report.md
@@ -314,7 +314,7 @@ export interface OAuthHandlers {
response: OAuthResponse;
refreshToken?: string;
}>;
- logout?(): Promise;
+ logout?(req: OAuthLogoutRequest): Promise;
refresh?(req: OAuthRefreshRequest): Promise<{
response: OAuthResponse;
refreshToken?: string;
@@ -322,6 +322,11 @@ export interface OAuthHandlers {
start(req: OAuthStartRequest): Promise;
}
+// @public (undocumented)
+export type OAuthLogoutRequest = express.Request<{}> & {
+ refreshToken: string;
+};
+
// @public (undocumented)
export type OAuthProviderInfo = {
accessToken: string;
diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json
index 3601907054..be02a90a71 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.17.0-next.0",
+ "version": "0.17.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
index 526b05d0ab..e0d4f0e051 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.test.ts
@@ -17,7 +17,7 @@
import express from 'express';
import { THOUSAND_DAYS_MS, TEN_MINUTES_MS, OAuthAdapter } from './OAuthAdapter';
import { encodeState } from './helpers';
-import { OAuthHandlers, OAuthState } from './types';
+import { OAuthHandlers, OAuthLogoutRequest, OAuthState } from './types';
import { CookieConfigurer } from '../../providers/types';
const mockResponseData = {
@@ -60,6 +60,7 @@ describe('OAuthAdapter', () => {
refreshToken: 'token',
};
}
+ async logout(_: OAuthLogoutRequest) {}
}
const providerInstance = new MyAuthProvider();
const mockCookieConfig: ReturnType = {
@@ -262,13 +263,17 @@ describe('OAuthAdapter', () => {
);
});
- it('removes refresh cookie when logging out', async () => {
+ it('removes refresh cookie and calls logout handler when logging out', async () => {
+ const logoutSpy = jest.spyOn(providerInstance, 'logout');
const oauthProvider = new OAuthAdapter(providerInstance, {
...oAuthProviderOptions,
isOriginAllowed: () => false,
});
const mockRequest = {
+ cookies: {
+ 'test-provider-refresh-token': 'token',
+ },
header: () => 'XMLHttpRequest',
get: jest.fn(),
} as unknown as express.Request;
@@ -281,6 +286,7 @@ describe('OAuthAdapter', () => {
await oauthProvider.logout(mockRequest, mockResponse);
expect(mockRequest.get).toHaveBeenCalledTimes(1);
+ expect(logoutSpy).toHaveBeenCalledTimes(1);
expect(mockResponse.cookie).toHaveBeenCalledTimes(1);
expect(mockResponse.cookie).toHaveBeenCalledWith(
expect.stringContaining('test-provider-refresh-token'),
diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
index 8f08cfbbd0..85104e9608 100644
--- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
+++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts
@@ -39,6 +39,7 @@ import {
OAuthStartRequest,
OAuthRefreshRequest,
OAuthState,
+ OAuthLogoutRequest,
} from './types';
import { prepareBackstageIdentityResponse } from '../../providers/prepareBackstageIdentityResponse';
@@ -190,6 +191,14 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
throw new AuthenticationError('Invalid X-Requested-With header');
}
+ if (this.handlers.logout) {
+ const refreshToken = this.getRefreshTokenFromCookie(req);
+ const revokeRequest: OAuthLogoutRequest = Object.assign(req, {
+ refreshToken,
+ });
+ await this.handlers.logout(revokeRequest);
+ }
+
// remove refresh token cookie if it is set
const origin = req.get('origin');
const cookieConfig = this.getCookieConfig(origin);
@@ -210,8 +219,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
}
try {
- const refreshToken =
- req.cookies[`${this.options.providerId}-refresh-token`];
+ const refreshToken = this.getRefreshTokenFromCookie(req);
// throw error if refresh token is missing in the request
if (!refreshToken) {
@@ -286,6 +294,10 @@ export class OAuthAdapter implements AuthProviderRouteHandlers {
});
};
+ private getRefreshTokenFromCookie = (req: express.Request) => {
+ return req.cookies[`${this.options.providerId}-refresh-token`];
+ };
+
private getGrantedScopeFromCookie = (req: express.Request) => {
return req.cookies[`${this.options.providerId}-granted-scope`];
};
diff --git a/plugins/auth-backend/src/lib/oauth/index.ts b/plugins/auth-backend/src/lib/oauth/index.ts
index 671e8e48e9..3643898bed 100644
--- a/plugins/auth-backend/src/lib/oauth/index.ts
+++ b/plugins/auth-backend/src/lib/oauth/index.ts
@@ -26,5 +26,6 @@ export type {
OAuthState,
OAuthStartRequest,
OAuthRefreshRequest,
+ OAuthLogoutRequest,
OAuthResult,
} from './types';
diff --git a/plugins/auth-backend/src/lib/oauth/types.ts b/plugins/auth-backend/src/lib/oauth/types.ts
index e8b5282aad..3902c3f026 100644
--- a/plugins/auth-backend/src/lib/oauth/types.ts
+++ b/plugins/auth-backend/src/lib/oauth/types.ts
@@ -104,6 +104,11 @@ export type OAuthRefreshRequest = express.Request<{}> & {
refreshToken: string;
};
+/** @public */
+export type OAuthLogoutRequest = express.Request<{}> & {
+ refreshToken: string;
+};
+
/**
* Any OAuth provider needs to implement this interface which has provider specific
* handlers for different methods to perform authentication, get access tokens,
@@ -136,5 +141,5 @@ export interface OAuthHandlers {
/**
* (Optional) Sign out of the auth provider.
*/
- logout?(): Promise;
+ logout?(req: OAuthLogoutRequest): Promise;
}
diff --git a/plugins/auth-backend/src/providers/auth0/provider.ts b/plugins/auth-backend/src/providers/auth0/provider.ts
index 309fb0fc7b..95e83d2cce 100644
--- a/plugins/auth-backend/src/providers/auth0/provider.ts
+++ b/plugins/auth-backend/src/providers/auth0/provider.ts
@@ -55,6 +55,8 @@ export type Auth0AuthProviderOptions = OAuthProviderOptions & {
authHandler: AuthHandler;
resolverContext: AuthResolverContext;
audience?: string;
+ connection?: string;
+ connectionScope?: string;
};
export class Auth0AuthProvider implements OAuthHandlers {
@@ -63,6 +65,8 @@ export class Auth0AuthProvider implements OAuthHandlers {
private readonly authHandler: AuthHandler;
private readonly resolverContext: AuthResolverContext;
private readonly audience?: string;
+ private readonly connection?: string;
+ private readonly connectionScope?: string;
/**
* Due to passport-auth0 forcing options.state = true,
@@ -86,6 +90,8 @@ export class Auth0AuthProvider implements OAuthHandlers {
this.authHandler = options.authHandler;
this.resolverContext = options.resolverContext;
this.audience = options.audience;
+ this.connection = options.connection;
+ this.connectionScope = options.connectionScope;
this._strategy = new Auth0Strategy(
{
clientID: options.clientId,
@@ -127,6 +133,10 @@ export class Auth0AuthProvider implements OAuthHandlers {
scope: req.scope,
state: encodeState(req.state),
...(this.audience ? { audience: this.audience } : {}),
+ ...(this.connection ? { connection: this.connection } : {}),
+ ...(this.connectionScope
+ ? { connection_scope: this.connectionScope }
+ : {}),
});
}
@@ -136,6 +146,10 @@ export class Auth0AuthProvider implements OAuthHandlers {
PrivateInfo
>(req, this._strategy, {
...(this.audience ? { audience: this.audience } : {}),
+ ...(this.connection ? { connection: this.connection } : {}),
+ ...(this.connectionScope
+ ? { connection_scope: this.connectionScope }
+ : {}),
});
return {
@@ -224,6 +238,8 @@ export const auth0 = createAuthProviderIntegration({
const domain = envConfig.getString('domain');
const customCallbackUrl = envConfig.getOptionalString('callbackUrl');
const audience = envConfig.getOptionalString('audience');
+ const connection = envConfig.getOptionalString('connection');
+ const connectionScope = envConfig.getOptionalString('connectionScope');
const callbackUrl =
customCallbackUrl ||
`${globalConfig.baseUrl}/${providerId}/handler/frame`;
@@ -245,6 +261,8 @@ export const auth0 = createAuthProviderIntegration({
signInResolver,
resolverContext,
audience,
+ connection,
+ connectionScope,
});
return OAuthAdapter.fromConfig(globalConfig, provider, {
diff --git a/plugins/auth-backend/src/providers/google/provider.ts b/plugins/auth-backend/src/providers/google/provider.ts
index 7689cd1a3a..afe5c27f6b 100644
--- a/plugins/auth-backend/src/providers/google/provider.ts
+++ b/plugins/auth-backend/src/providers/google/provider.ts
@@ -16,6 +16,7 @@
import express from 'express';
import passport from 'passport';
+import { OAuth2Client } from 'google-auth-library';
import { Strategy as GoogleStrategy } from 'passport-google-oauth20';
import {
encodeState,
@@ -27,6 +28,7 @@ import {
OAuthResponse,
OAuthResult,
OAuthStartRequest,
+ OAuthLogoutRequest,
} from '../../lib/oauth';
import {
executeFetchUserProfileStrategy,
@@ -119,6 +121,11 @@ export class GoogleAuthProvider implements OAuthHandlers {
};
}
+ async logout(req: OAuthLogoutRequest) {
+ const oauthClient = new OAuth2Client();
+ await oauthClient.revokeToken(req.refreshToken);
+ }
+
async refresh(req: OAuthRefreshRequest) {
const { accessToken, refreshToken, params } =
await executeRefreshTokenStrategy(
diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md
index e6c3171649..147861383f 100644
--- a/plugins/auth-node/CHANGELOG.md
+++ b/plugins/auth-node/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-auth-node
+## 0.2.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+
## 0.2.6-next.0
### Patch Changes
diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json
index b42ebcb9cd..7c0c3b51e2 100644
--- a/plugins/auth-node/package.json
+++ b/plugins/auth-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-node",
- "version": "0.2.6-next.0",
+ "version": "0.2.6-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md
index fb55855019..00cc426c0e 100644
--- a/plugins/azure-devops-backend/CHANGELOG.md
+++ b/plugins/azure-devops-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-azure-devops-backend
+## 0.3.16-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/plugin-azure-devops-common@0.3.0
+
## 0.3.16-next.0
### Patch Changes
diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json
index c5173bd79a..27be6291ed 100644
--- a/plugins/azure-devops-backend/package.json
+++ b/plugins/azure-devops-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops-backend",
- "version": "0.3.16-next.0",
+ "version": "0.3.16-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md
index 66ab55c4e6..4919b1226d 100644
--- a/plugins/azure-devops/CHANGELOG.md
+++ b/plugins/azure-devops/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-azure-devops
+## 0.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+ - @backstage/plugin-azure-devops-common@0.3.0
+
## 0.2.1-next.0
### Patch Changes
diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json
index a4917190dd..14f2c29310 100644
--- a/plugins/azure-devops/package.json
+++ b/plugins/azure-devops/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-azure-devops",
- "version": "0.2.1-next.0",
+ "version": "0.2.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md
index d590c516df..770491ec15 100644
--- a/plugins/badges-backend/CHANGELOG.md
+++ b/plugins/badges-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-badges-backend
+## 0.1.31-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/config@1.0.3-next.1
+ - @backstage/errors@1.1.2-next.1
+
## 0.1.31-next.0
### Patch Changes
diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json
index ad71549841..678dc8d56e 100644
--- a/plugins/badges-backend/package.json
+++ b/plugins/badges-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-badges-backend",
"description": "A Backstage backend plugin that generates README badges for your entities",
- "version": "0.1.31-next.0",
+ "version": "0.1.31-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/badges-backend/src/service/router.test.ts b/plugins/badges-backend/src/service/router.test.ts
index 5fc809906f..9dc60ea1b5 100644
--- a/plugins/badges-backend/src/service/router.test.ts
+++ b/plugins/badges-backend/src/service/router.test.ts
@@ -114,7 +114,7 @@ describe('createRouter', () => {
);
expect(response.status).toEqual(200);
- expect(response.text).toEqual(JSON.stringify([badge], null, 2));
+ expect(response.body).toEqual([badge]);
expect(catalog.getEntityByRef).toHaveBeenCalledTimes(1);
expect(catalog.getEntityByRef).toHaveBeenCalledWith(
diff --git a/plugins/badges-backend/src/service/router.ts b/plugins/badges-backend/src/service/router.ts
index 2006b45dc4..e5caa5cd2a 100644
--- a/plugins/badges-backend/src/service/router.ts
+++ b/plugins/badges-backend/src/service/router.ts
@@ -78,8 +78,7 @@ export async function createRouter(
specs.push(badge);
}
- res.setHeader('Content-Type', 'application/json');
- res.status(200).send(JSON.stringify(specs, null, 2));
+ res.status(200).json(specs);
});
router.get(
diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md
index d5d68973f6..5adc7d112b 100644
--- a/plugins/badges/CHANGELOG.md
+++ b/plugins/badges/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-badges
+## 0.2.34-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+ - @backstage/errors@1.1.2-next.1
+ - @backstage/theme@0.2.16
+
## 0.2.34-next.0
### Patch Changes
diff --git a/plugins/badges/package.json b/plugins/badges/package.json
index 7eade1381d..0f05f6fa25 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.34-next.0",
+ "version": "0.2.34-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md
index 6a9d48270c..bb39eff121 100644
--- a/plugins/bazaar-backend/CHANGELOG.md
+++ b/plugins/bazaar-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-bazaar-backend
+## 0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.15.2-next.1
+ - @backstage/backend-test-utils@0.1.29-next.1
+ - @backstage/config@1.0.3-next.1
+
## 0.1.21-next.0
### Patch Changes
diff --git a/plugins/bazaar-backend/README.md b/plugins/bazaar-backend/README.md
index b7a08a2fb8..266841b26b 100644
--- a/plugins/bazaar-backend/README.md
+++ b/plugins/bazaar-backend/README.md
@@ -15,7 +15,7 @@ yarn add --cwd packages/backend @backstage/plugin-bazaar-backend
You'll need to add the plugin to the router in your `backend` package. You can do this by creating a file called `packages/backend/src/plugins/bazaar.ts`
-```tsx
+```typescript
import { PluginEnvironment } from '../types';
import { createRouter } from '@backstage/plugin-bazaar-backend';
import { Router } from 'express';
@@ -27,6 +27,7 @@ export default async function createPlugin(
logger: env.logger,
config: env.config,
database: env.database,
+ identity: env.identity,
});
}
```
diff --git a/plugins/bazaar-backend/api-report.md b/plugins/bazaar-backend/api-report.md
index d62453d156..1ee889c04a 100644
--- a/plugins/bazaar-backend/api-report.md
+++ b/plugins/bazaar-backend/api-report.md
@@ -5,6 +5,7 @@
```ts
import { Config } from '@backstage/config';
import express from 'express';
+import { IdentityApi } from '@backstage/plugin-auth-node';
import { Logger } from 'winston';
import { PluginDatabaseManager } from '@backstage/backend-common';
@@ -18,6 +19,8 @@ export interface RouterOptions {
// (undocumented)
database: PluginDatabaseManager;
// (undocumented)
+ identity: IdentityApi;
+ // (undocumented)
logger: Logger;
}
diff --git a/plugins/bazaar-backend/migrations/20220817150443_add_member_entity_ref.js b/plugins/bazaar-backend/migrations/20220817150443_add_member_entity_ref.js
new file mode 100644
index 0000000000..79b80ef20c
--- /dev/null
+++ b/plugins/bazaar-backend/migrations/20220817150443_add_member_entity_ref.js
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+exports.up = async function up(knex) {
+ await knex.schema.alterTable('members', table => {
+ table.string('user_ref').nullable();
+ });
+};
+
+exports.down = async function down(knex) {
+ return knex.schema.table('members', table => {
+ table.dropColumn('user_ref');
+ });
+};
diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json
index 4aaaa73a2b..131959cbd6 100644
--- a/plugins/bazaar-backend/package.json
+++ b/plugins/bazaar-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar-backend",
- "version": "0.1.21-next.0",
+ "version": "0.1.21-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -25,6 +25,7 @@
"@backstage/backend-common": "workspace:^",
"@backstage/backend-test-utils": "workspace:^",
"@backstage/config": "workspace:^",
+ "@backstage/plugin-auth-node": "workspace:^",
"@types/express": "^4.17.6",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
diff --git a/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts b/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts
index e1a722016b..371d20ff13 100644
--- a/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts
+++ b/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts
@@ -75,6 +75,13 @@ describe('DatabaseHandler', () => {
responsible: bazaarProject.responsible,
});
+ // Add a member to the project
+ await knex('members').insert({
+ item_id: 1,
+ user_ref: 'user:default/thehulk',
+ user_id: 'Bruce Banner',
+ });
+
const res = await dbHandler.getMetadataByRef('ref1');
expect(res).toHaveLength(1);
@@ -85,6 +92,9 @@ describe('DatabaseHandler', () => {
expect(res[0].end_date).toEqual(null);
expect(res[0].size).toEqual('small');
expect(res[0].responsible).toEqual('r');
+ expect(
+ res[0].members_count === '1' || res[0].members_count === 1,
+ ).toBeTruthy();
},
60_000,
);
diff --git a/plugins/bazaar-backend/src/service/DatabaseHandler.ts b/plugins/bazaar-backend/src/service/DatabaseHandler.ts
index d8d975b7ed..352866b4b5 100644
--- a/plugins/bazaar-backend/src/service/DatabaseHandler.ts
+++ b/plugins/bazaar-backend/src/service/DatabaseHandler.ts
@@ -67,11 +67,17 @@ export class DatabaseHandler {
return await this.client.select('*').from('members').where({ item_id: id });
}
- async addMember(id: number, userId: string, picture?: string) {
+ async addMember(
+ id: number,
+ userId: string,
+ userRef?: string,
+ picture?: string,
+ ) {
await this.client
.insert({
item_id: id,
user_id: userId,
+ user_ref: userRef,
picture: picture,
})
.into('members');
diff --git a/plugins/bazaar-backend/src/service/router.ts b/plugins/bazaar-backend/src/service/router.ts
index a5248c2949..359945f298 100644
--- a/plugins/bazaar-backend/src/service/router.ts
+++ b/plugins/bazaar-backend/src/service/router.ts
@@ -19,6 +19,7 @@ import express from 'express';
import Router from 'express-promise-router';
import { Logger } from 'winston';
import { Config } from '@backstage/config';
+import { IdentityApi } from '@backstage/plugin-auth-node';
import { DatabaseHandler } from './DatabaseHandler';
/** @public */
@@ -26,13 +27,14 @@ export interface RouterOptions {
logger: Logger;
database: PluginDatabaseManager;
config: Config;
+ identity: IdentityApi;
}
/** @public */
export async function createRouter(
options: RouterOptions,
): Promise {
- const { logger, database } = options;
+ const { logger, database, identity } = options;
const dbHandler = await DatabaseHandler.create({ database });
@@ -53,7 +55,14 @@ export async function createRouter(
router.put('/projects/:id/member/:userId', async (request, response) => {
const { id, userId } = request.params;
- await dbHandler.addMember(parseInt(id, 10), userId, request.body?.picture);
+ const user = await identity.getIdentity({ request: request });
+
+ await dbHandler.addMember(
+ parseInt(id, 10),
+ userId,
+ user?.identity.userEntityRef,
+ request.body?.picture,
+ );
response.json({ status: 'ok' });
});
diff --git a/plugins/bazaar-backend/src/service/standaloneServer.ts b/plugins/bazaar-backend/src/service/standaloneServer.ts
index e8a49fbf5d..a50e350f39 100644
--- a/plugins/bazaar-backend/src/service/standaloneServer.ts
+++ b/plugins/bazaar-backend/src/service/standaloneServer.ts
@@ -19,6 +19,7 @@ import {
loadBackendConfig,
useHotMemoize,
} from '@backstage/backend-common';
+import { IdentityApi } from '@backstage/plugin-auth-node';
import { Server } from 'http';
import { Logger } from 'winston';
import { createRouter } from './router';
@@ -54,6 +55,7 @@ export async function startStandaloneServer(
logger,
database: { getClient: async () => db },
config: config,
+ identity: {} as IdentityApi,
});
let service = createServiceBuilder(module)
diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md
index 72f92b559c..b2d0e8a8d4 100644
--- a/plugins/bazaar/CHANGELOG.md
+++ b/plugins/bazaar/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/plugin-bazaar
+## 0.1.25-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.2.0-next.1
+ - @backstage/plugin-catalog@1.6.0-next.1
+ - @backstage/cli@0.20.0-next.1
+ - @backstage/catalog-client@1.1.1-next.1
+ - @backstage/core-components@0.11.2-next.1
+ - @backstage/core-plugin-api@1.0.7-next.1
+ - @backstage/catalog-model@1.1.2-next.1
+
## 0.1.25-next.0
### Patch Changes
diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json
index 2a5c8ef28a..c88357ef4a 100644
--- a/plugins/bazaar/package.json
+++ b/plugins/bazaar/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bazaar",
- "version": "0.1.25-next.0",
+ "version": "0.1.25-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/bazaar/src/components/CardContentFields/CardContentFields.tsx b/plugins/bazaar/src/components/CardContentFields/CardContentFields.tsx
index 6c6ce1bb3e..641ae97f95 100644
--- a/plugins/bazaar/src/components/CardContentFields/CardContentFields.tsx
+++ b/plugins/bazaar/src/components/CardContentFields/CardContentFields.tsx
@@ -23,8 +23,11 @@ import {
Typography,
GridSize,
} from '@material-ui/core';
+import { parseEntityRef } from '@backstage/catalog-model';
import { Avatar, Link } from '@backstage/core-components';
+import { useRouteRef } from '@backstage/core-plugin-api';
import { AboutField } from '@backstage/plugin-catalog';
+import { entityRouteRef } from '@backstage/plugin-catalog-react';
import { StatusTag } from '../StatusTag';
import { Member, BazaarProject } from '../../types';
@@ -49,6 +52,7 @@ export const CardContentFields = ({
membersSize,
}: Props) => {
const classes = useStyles();
+ const catalogEntityRoute = useRouteRef(entityRouteRef);
return (