diff --git a/.changeset/afraid-horses-argue.md b/.changeset/afraid-horses-argue.md
new file mode 100644
index 0000000000..fa4b46df5d
--- /dev/null
+++ b/.changeset/afraid-horses-argue.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-kubernetes-backend': patch
+---
+
+Updated kubernetes config schema to match available options
diff --git a/.changeset/bright-hats-compare.md b/.changeset/bright-hats-compare.md
new file mode 100644
index 0000000000..148eaa29ce
--- /dev/null
+++ b/.changeset/bright-hats-compare.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli-node': minor
+---
+
+Introduced the new `@backstage/cli-node` package, which provides utilities for use across Backstage CLIs.
diff --git a/.changeset/calm-geese-obey.md b/.changeset/calm-geese-obey.md
new file mode 100644
index 0000000000..b45295f8ff
--- /dev/null
+++ b/.changeset/calm-geese-obey.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-kubernetes': minor
+---
+
+refactor kubernetes error detection to make way for proposed solutions
+
+**BREAKING**: `DetectedError` now appears once per Kubernetes resource per error instead of for all resources which have that error, `namespace` and `name` fields are now in `sourceRef` object `message` is now a `string` instead of a `string[]`. `ErrorDetectableKind` has been removed.
diff --git a/.changeset/cold-seahorses-greet.md b/.changeset/cold-seahorses-greet.md
new file mode 100644
index 0000000000..71bc5db2cc
--- /dev/null
+++ b/.changeset/cold-seahorses-greet.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Updates and moves OpenAPI spec to `src/schema/openapi.yaml` and uses `ApiRouter` type from `@backstage/backend-openapi-utils` to handle automatic types from the OpenAPI spec file.
diff --git a/.changeset/create-app-1681222813.md b/.changeset/create-app-1681222813.md
new file mode 100644
index 0000000000..b50d431d4b
--- /dev/null
+++ b/.changeset/create-app-1681222813.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Bumped create-app version.
diff --git a/.changeset/dependabot-ff5881d.md b/.changeset/dependabot-ff5881d.md
new file mode 100644
index 0000000000..d08ceea0e4
--- /dev/null
+++ b/.changeset/dependabot-ff5881d.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-code-coverage-backend': patch
+---
+
+Bump `xml2js` from 0.4.23 to 0.5.0
diff --git a/.changeset/famous-olives-try.md b/.changeset/famous-olives-try.md
new file mode 100644
index 0000000000..3150197203
--- /dev/null
+++ b/.changeset/famous-olives-try.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder': patch
+---
+
+Fix some hard-coded white font colors in scaffolder
diff --git a/.changeset/forty-adults-divide.md b/.changeset/forty-adults-divide.md
new file mode 100644
index 0000000000..55d1e3f5d8
--- /dev/null
+++ b/.changeset/forty-adults-divide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Internal refactor to move many internal utilities to the new `@backstage/cli-node` package.
diff --git a/.changeset/fresh-lions-compete.md b/.changeset/fresh-lions-compete.md
new file mode 100644
index 0000000000..87f15f538d
--- /dev/null
+++ b/.changeset/fresh-lions-compete.md
@@ -0,0 +1,5 @@
+---
+'@backstage/repo-tools': minor
+---
+
+Adding two new commands to support OpenAPI spec writing, `schema:openapi:generate` to generate the Typescript file that `@backstage/backend-openapi-utils` needs for typing and `schema:openapi:verify` to verify that this file exists and matches your `src/schema/openapi.yaml` file.
diff --git a/.changeset/itchy-kiwis-unite.md b/.changeset/itchy-kiwis-unite.md
new file mode 100644
index 0000000000..0e3bcae282
--- /dev/null
+++ b/.changeset/itchy-kiwis-unite.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-explore': patch
+---
+
+Extracted generic `CatalogKindExploreContent` component so that it is easy to show any component kinds in their own tab in the explore page.
diff --git a/.changeset/late-waves-march.md b/.changeset/late-waves-march.md
new file mode 100644
index 0000000000..0691abd0fd
--- /dev/null
+++ b/.changeset/late-waves-march.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-lighthouse-backend': minor
+---
+
+Lighthouse backend plugin can now use an authenticated catalog backend API.
+
+- Breaking \* You must now pass the `tokenManager` to the lighthouse `createScheduler`.
diff --git a/.changeset/mean-rice-beg.md b/.changeset/mean-rice-beg.md
new file mode 100644
index 0000000000..19cef51292
--- /dev/null
+++ b/.changeset/mean-rice-beg.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-vault': patch
+---
+
+Use `fetchApi` instead of raw `fetch` in order to pass auth header if necessary.
diff --git a/.changeset/mighty-tips-flow.md b/.changeset/mighty-tips-flow.md
new file mode 100644
index 0000000000..514d514588
--- /dev/null
+++ b/.changeset/mighty-tips-flow.md
@@ -0,0 +1,16 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+The `microsoft` (i.e. Azure) auth provider now supports negotiating tokens for
+Azure resources besides Microsoft Graph (e.g. AKS, Virtual Machines, Machine
+Learning Services, etc.). When the `/frame/handler` endpoint is called with an
+authorization code for a non-Microsoft Graph scope, the user profile will not be
+fetched. Similarly no user profile or photo data will be fetched by the backend
+if the `/refresh` endpoint is called with the `scope` query parameter strictly
+containing scopes for resources besides Microsoft Graph.
+
+Furthermore, the `offline_access` scope will be requested by default, even when
+it is not mentioned in the argument to `getAccessToken`. This means that any
+Azure access token can be automatically refreshed, even if the user has not
+signed in via Azure.
diff --git a/.changeset/odd-plums-bake.md b/.changeset/odd-plums-bake.md
new file mode 100644
index 0000000000..427ab776b5
--- /dev/null
+++ b/.changeset/odd-plums-bake.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-adr-common': patch
+'@backstage/plugin-adr': patch
+---
+
+use path attribute to fetch files instead of name and update the UI to navigate over subdirectories
diff --git a/.changeset/plenty-eels-listen.md b/.changeset/plenty-eels-listen.md
new file mode 100644
index 0000000000..6b4776f808
--- /dev/null
+++ b/.changeset/plenty-eels-listen.md
@@ -0,0 +1,19 @@
+---
+'@backstage/plugin-catalog-react': minor
+---
+
+Attempt to load entity owner names in the EntityOwnerPicker through the `by-refs` endpoint. If `spec.profile.displayName` or `metadata.title` are populated, we now attempt to show those before showing the `humanizeEntityRef`'d version.
+
+**BREAKING**: `EntityOwnerFilter` now uses the full entity ref instead of the `humanizeEntityRef`. If you rely on `EntityOwnerFilter.values` or the `queryParameters.owners` of `useEntityList`, you will need to adjust your code like the following.
+
+```tsx
+const { queryParameters: { owners } } = useEntityList();
+// or
+const { filter: { owners } } = useEntityList();
+
+// Instead of,
+if (owners.some(ref => ref === humanizeEntityRef(myEntity))) ...
+
+// You'll need to use,
+if (owners.some(ref => ref === stringifyEntityRef(myEntity))) ...
+```
diff --git a/.changeset/poor-horses-approve.md b/.changeset/poor-horses-approve.md
new file mode 100644
index 0000000000..ecd60e2c6c
--- /dev/null
+++ b/.changeset/poor-horses-approve.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-react': patch
+---
+
+Add an indication that the validators are running when clicking `next` on each step of the form.
diff --git a/.changeset/pre.json b/.changeset/pre.json
index bf70830cad..74f1480f09 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -216,34 +216,45 @@
"@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.0.0",
"@backstage/plugin-search-backend-module-catalog": "0.0.0",
"@backstage/plugin-search-backend-module-explore": "0.0.0",
- "@backstage/plugin-search-backend-module-techdocs": "0.0.0"
+ "@backstage/plugin-search-backend-module-techdocs": "0.0.0",
+ "@backstage/backend-openapi-utils": "0.0.0",
+ "@backstage/cli-node": "0.0.0"
},
"changesets": [
+ "afraid-horses-argue",
"all-my-auth-wanna-ride-today",
"blue-walls-drop",
+ "bright-hats-compare",
"bright-pumpkins-bake",
+ "calm-geese-obey",
"calm-otters-destroy",
"chatty-coats-thank",
"clean-dolls-search",
"clean-items-draw",
"clean-teachers-thank",
"clever-lizards-whisper",
+ "cold-seahorses-greet",
"create-app-1679405836",
+ "create-app-1681222813",
"curly-boats-trade",
"curly-jobs-kneel",
"curly-steaks-mate",
"curvy-rocks-guess",
+ "dependabot-ff5881d",
"eight-trainers-smoke",
"eleven-bats-tease",
"eleven-coats-refuse",
"fair-roses-stare",
"famous-beds-break",
"famous-beds-repair",
+ "famous-olives-try",
"fast-gorillas-approve",
"fast-snakes-buy",
"flat-ways-compete",
+ "forty-adults-divide",
"forty-days-tell",
"forty-gorillas-help",
+ "fresh-lions-compete",
"fresh-schools-fly",
"funny-pots-hide",
"funny-rivers-grin",
@@ -255,56 +266,79 @@
"hungry-lies-cry",
"hungry-monkeys-reply",
"itchy-ads-sit",
+ "itchy-kiwis-unite",
"khaki-cars-drum",
"khaki-doors-compare",
"khaki-guests-turn",
+ "late-waves-march",
"lazy-apples-destroy",
"lazy-monkeys-worry",
"long-gorillas-remain",
"many-eggs-press",
+ "mean-rice-beg",
"mighty-lamps-cross",
+ "mighty-tips-flow",
"modern-snakes-check",
"nasty-nails-appear",
"neat-donkeys-work",
"neat-pears-argue",
"new-pigs-jam",
"odd-grapes-double",
+ "odd-plums-bake",
"old-cougars-sit",
"olive-cycles-join",
"olive-months-talk",
"orange-rabbits-jam",
"perfect-deers-add",
+ "plenty-eels-listen",
"poor-cars-fold",
+ "poor-horses-approve",
"popular-parents-crash",
"popular-radios-visit",
"pretty-carpets-cross",
"rare-seals-decide",
"renovate-179fa0e",
+ "renovate-3e8a992",
+ "renovate-8010f99",
"renovate-a9116b7",
"renovate-c574b04",
"rotten-carrots-cheer",
+ "serious-items-walk",
"seven-gifts-fetch",
+ "shaggy-crews-carry",
"short-panthers-float",
+ "silent-nails-bake",
"silly-adults-accept",
"six-jobs-hear",
+ "sixty-insects-visit",
+ "slimy-scissors-play",
+ "slow-ravens-destroy",
+ "smart-crabs-dream",
"soft-roses-cover",
"sour-buttons-collect",
"sour-dragons-cheat",
+ "sour-laws-walk",
+ "spicy-carrots-argue",
"stale-cobras-beg",
+ "stale-files-sniff",
"stale-paws-sparkle",
"strong-crews-repeat",
"stupid-laws-play",
+ "sweet-eels-hunt",
"swift-meals-live",
"tall-chairs-explain",
+ "tall-meals-dress",
"tall-oranges-own",
"ten-hounds-bathe",
"ten-mayflies-beam",
"tender-parrots-fry",
+ "tender-terms-return",
"thick-forks-prove",
"thin-spoons-prove",
"thirty-crabs-tell",
"tiny-apes-scream",
"tough-cameras-beam",
+ "tricky-beans-knock",
"twelve-parrots-camp",
"twelve-vans-sell",
"unlucky-snakes-smile",
@@ -314,6 +348,7 @@
"wet-lamps-happen",
"wise-garlics-camp",
"witty-berries-love",
- "witty-points-visit"
+ "witty-points-visit",
+ "yellow-candles-kiss"
]
}
diff --git a/.changeset/renovate-3e8a992.md b/.changeset/renovate-3e8a992.md
new file mode 100644
index 0000000000..2c76f0e050
--- /dev/null
+++ b/.changeset/renovate-3e8a992.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-react': patch
+---
+
+Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.5.2`.
diff --git a/.changeset/renovate-8010f99.md b/.changeset/renovate-8010f99.md
new file mode 100644
index 0000000000..64817f07be
--- /dev/null
+++ b/.changeset/renovate-8010f99.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Updated dependency `@swc/helpers` to `^0.5.0`.
diff --git a/.changeset/serious-items-walk.md b/.changeset/serious-items-walk.md
new file mode 100644
index 0000000000..c4cdfe34c4
--- /dev/null
+++ b/.changeset/serious-items-walk.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+Stripped entity types and namespace before passing to GitHub API
diff --git a/.changeset/shaggy-crews-carry.md b/.changeset/shaggy-crews-carry.md
new file mode 100644
index 0000000000..db9aa5225b
--- /dev/null
+++ b/.changeset/shaggy-crews-carry.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-search-backend-module-elasticsearch': patch
+---
+
+fix ElasticSearch throwing error when index is missing
diff --git a/.changeset/silent-nails-bake.md b/.changeset/silent-nails-bake.md
new file mode 100644
index 0000000000..1161686b34
--- /dev/null
+++ b/.changeset/silent-nails-bake.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Add common identify resolvers for `oidc` auth provider.
diff --git a/.changeset/sixty-insects-visit.md b/.changeset/sixty-insects-visit.md
new file mode 100644
index 0000000000..adbe27e0ac
--- /dev/null
+++ b/.changeset/sixty-insects-visit.md
@@ -0,0 +1,9 @@
+---
+'@backstage/core-app-api': minor
+---
+
+The `AuthConnector` interface now supports specifying a set of scopes when
+refreshing a session. The `DefaultAuthConnector` implementation passes the
+`scope` query parameter to the auth-backend plugin appropriately. The
+`RefreshingAuthSessionManager` passes any scopes in its `GetSessionRequest`
+appropriately.
diff --git a/.changeset/slimy-scissors-play.md b/.changeset/slimy-scissors-play.md
new file mode 100644
index 0000000000..4a65bc8dce
--- /dev/null
+++ b/.changeset/slimy-scissors-play.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-kubernetes': patch
+---
+
+fixes a bug where an empty authorization header was provided to the proxy endpoint when a cluster had a server-side auth provider
diff --git a/.changeset/slow-ravens-destroy.md b/.changeset/slow-ravens-destroy.md
new file mode 100644
index 0000000000..a75793f86f
--- /dev/null
+++ b/.changeset/slow-ravens-destroy.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': minor
+---
+
+Allow for a commit message to differ from the PR title when publishing a GitHub pull request.
diff --git a/.changeset/smart-crabs-dream.md b/.changeset/smart-crabs-dream.md
new file mode 100644
index 0000000000..3699021482
--- /dev/null
+++ b/.changeset/smart-crabs-dream.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-react': patch
+---
+
+Reverted the check if the selected options list is different than the query parameters list before invoking `setSelectedOptions` method. This was preventing updating list items when a query string was already present in the URL when loading the page.
diff --git a/.changeset/sour-laws-walk.md b/.changeset/sour-laws-walk.md
new file mode 100644
index 0000000000..073e3dc6a8
--- /dev/null
+++ b/.changeset/sour-laws-walk.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Export Azure Easy Auth provider so it can actually be used.
diff --git a/.changeset/spicy-carrots-argue.md b/.changeset/spicy-carrots-argue.md
new file mode 100644
index 0000000000..b6475b1f7d
--- /dev/null
+++ b/.changeset/spicy-carrots-argue.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': minor
+---
+
+Add monorepo support to CodeOwnersProccesor.
diff --git a/.changeset/stale-files-sniff.md b/.changeset/stale-files-sniff.md
new file mode 100644
index 0000000000..b6f35645c4
--- /dev/null
+++ b/.changeset/stale-files-sniff.md
@@ -0,0 +1,5 @@
+---
+'@backstage/catalog-model': minor
+---
+
+Modified the regex for DNS label validation to support IDN domains
diff --git a/.changeset/sweet-eels-hunt.md b/.changeset/sweet-eels-hunt.md
new file mode 100644
index 0000000000..39f124a860
--- /dev/null
+++ b/.changeset/sweet-eels-hunt.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-kubernetes': patch
+---
+
+`KubernetesBackendClient` now requires a `kubernetesAuthProvidersApi` value to be provided. `KubernetesApi` interface now has a proxy method requirement.
diff --git a/.changeset/tall-meals-dress.md b/.changeset/tall-meals-dress.md
new file mode 100644
index 0000000000..3d39c369fe
--- /dev/null
+++ b/.changeset/tall-meals-dress.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-events-backend': patch
+---
+
+Export `DefaultEventBroker` to allow decoupling of the catalog and events backends in the `example-backend`.
+
+Please look at `plugins/events-backend/README.md` for the currently advised way to set up the event backend and catalog providers.
diff --git a/.changeset/tender-terms-return.md b/.changeset/tender-terms-return.md
new file mode 100644
index 0000000000..9e8ab6beb7
--- /dev/null
+++ b/.changeset/tender-terms-return.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-techdocs': patch
+---
+
+Fix a bug in sub-path navigation due to double addition of a sub-path if one was set up in `app.baseUrl`.
diff --git a/.changeset/tricky-beans-knock.md b/.changeset/tricky-beans-knock.md
new file mode 100644
index 0000000000..1bdd95a365
--- /dev/null
+++ b/.changeset/tricky-beans-knock.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-openapi-utils': patch
+---
+
+New plugin! Primary focus is to support types on `Router`s in backend packages. Developers can use the `ApiRouter` from this package in their packages to support a typed experience based on their OpenAPI specs. The `ApiRouter` supports request bodies, response bodies, query parameters and path parameters, as well as full path-based context of the above. This means no more guessing on an endpoint like `req.post('/not-my-route', (req, res)=>{res.send(req.body.badparam)})`. Typescript would catch `/not-my-route`, `req.body.badparam`, `res.send(req.body.badparam)`.
diff --git a/.changeset/yellow-candles-kiss.md b/.changeset/yellow-candles-kiss.md
new file mode 100644
index 0000000000..e365be2a0a
--- /dev/null
+++ b/.changeset/yellow-candles-kiss.md
@@ -0,0 +1,21 @@
+---
+'@backstage/core-components': minor
+---
+
+**BREAKING:** Removing `Tabs` component from `core-components` as it is neither used in the core Backstage app nor in the monorepo plugins. If you are using this component in your instance please consider replacing it with the [Material UI `Tabs`](https://v4.mui.com/components/tabs/#tabs) component like the following:
+
+```diff
+- ,
+- content:
Label
,
+- }]}
+- />
+
++
++ }
++ />
++
+```
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index b4be92e4ec..19e8559e87 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -26,13 +26,13 @@ yarn.lock @backstage/maintainers @back
/plugins/azure-devops-common @backstage/maintainers @marleypowell @awanlin
/plugins/bitbucket-cloud-common @backstage/maintainers @pjungermann
/plugins/bitrise @backstage/maintainers @backstage/sda-se-reviewers
-/plugins/catalog @backstage/maintainers @backstage/catalog-core
-/plugins/catalog-* @backstage/maintainers @backstage/catalog-core
-/plugins/catalog-backend-module-aws @backstage/maintainers @backstage/catalog-core @pjungermann
-/plugins/catalog-backend-module-bitbucket-cloud @backstage/maintainers @backstage/catalog-core @pjungermann
-/plugins/catalog-backend-module-msgraph @backstage/maintainers @backstage/catalog-core @pjungermann
-/plugins/catalog-backend-module-puppetdb @backstage/maintainers @backstage/catalog-core @tdabasinskas
-/plugins/catalog-graph @backstage/maintainers @backstage/catalog-core @backstage/sda-se-reviewers
+/plugins/catalog @backstage/maintainers @backstage/catalog-maintainers
+/plugins/catalog-* @backstage/maintainers @backstage/catalog-maintainers
+/plugins/catalog-backend-module-aws @backstage/maintainers @backstage/catalog-maintainers @pjungermann
+/plugins/catalog-backend-module-bitbucket-cloud @backstage/maintainers @backstage/catalog-maintainers @pjungermann
+/plugins/catalog-backend-module-msgraph @backstage/maintainers @backstage/catalog-maintainers @pjungermann
+/plugins/catalog-backend-module-puppetdb @backstage/maintainers @backstage/catalog-maintainers @tdabasinskas
+/plugins/catalog-graph @backstage/maintainers @backstage/catalog-maintainers @backstage/sda-se-reviewers
/plugins/circleci @backstage/maintainers @adamdmharvey
/plugins/cloudbuild @backstage/maintainers @trivago/ebarrios
/plugins/code-coverage @backstage/maintainers @alde @nissayeva
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index cd67d2742a..fb03709cce 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -92,6 +92,9 @@ jobs:
- name: verify api reference
run: node scripts/verify-api-reference.js
+ - name: verify openapi yaml file matches generated ts file
+ run: yarn backstage-repo-tools schema:openapi:verify
+
- name: verify doc links
run: node scripts/verify-links.js
diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml
index 6390671bbd..bb496dbe3d 100644
--- a/.github/workflows/uffizzi-preview.yaml
+++ b/.github/workflows/uffizzi-preview.yaml
@@ -14,6 +14,7 @@ jobs:
if: ${{ github.event.workflow_run.conclusion == 'success' }}
outputs:
compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }}
+ git-ref: ${{ env.GIT_REF }}
pr-number: ${{ env.PR_NUMBER }}
steps:
- name: 'Download artifacts'
@@ -67,10 +68,15 @@ jobs:
id: pr
run: echo "PR_NUMBER=${{ fromJSON(env.EVENT_JSON).number }}" >> $GITHUB_ENV
+ - name: Read Git Ref From Event Object
+ id: ref
+ run: echo "GIT_REF=${{ fromJSON(env.EVENT_JSON).head.sha }}" >> $GITHUB_ENV
+
- name: DEBUG - Print Job Outputs
if: ${{ runner.debug }}
run: |
echo "PR number: ${{ env.PR_NUMBER }}"
+ echo "Git Ref: ${{ env.GIT_REF }}"
echo "Compose file hash: ${{ env.COMPOSE_FILE_HASH }}"
cat event.json
@@ -85,8 +91,9 @@ jobs:
# and this reusable workflow will delete the preview deployment.
compose-file-cache-key: ${{ needs.cache-compose-file.outputs.compose-file-cache-key }}
compose-file-cache-path: docker-compose.rendered.yml
- server: https://app.uffizzi.com
+ git-ref: ${{ needs.cache-compose-file.outputs.git-ref }}
pr-number: ${{ needs.cache-compose-file.outputs.pr-number }}
+ server: https://app.uffizzi.com
permissions:
contents: read
pull-requests: write
diff --git a/ADOPTERS.md b/ADOPTERS.md
index 306ae24280..fdc64b72b6 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -237,3 +237,6 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/
| [Comcast](https://comcast.github.io/) | [Ryan Emerle](https://github.com/remerle) | Developer portal enabling discovery of products, services, and documentation throughout the enterprise to ultimately reduce friction and improve time-to-market. |
| [Syntasso](https://www.syntasso.io/) | [@syntassodev](https://github.com/syntassodev) | Backstage is used as a optional UI for the [Kratix project](https://kratix.io), a framework for building platforms.
| [Bankdata](https://www.bankdata.dk) | [Thomas Grønbæk](https://www.linkedin.com/in/thomas-grønbæk/) | We are assessing Backstage as our internal developer portal @Bankdata. Goal is to reduce cognitive load and friction for developers and thereby improving developer experience, onboarding and productivity. Expect use of Software Catalog for discoverability and ownership, Tech Docs and Software Templates to integrate tooling and best practices.
+| [B3](https://www.b3.com.br/) | [Marcos Rodrigues](https://www.linkedin.com/in/marcos-rodrigues-cloud/) | B3 (Brazilian Stock Exchange) will implement a self-service platform focused on software development based on Backstage. The tool will primarily focus on product development and software engineering teams, as well as professionals from other areas who are also involved in software delivery. The new platform will function as a portal where teams can access tools, codes, and templates that have already been tested and are available, serving as building blocks for the development of new solutions. |
+| [Porto](https://www.portoseguro.com.br/) | [Camilo Alessandro](https://www.linkedin.com/in/camilo-alessandro/) | Porto (Brazilian insurance company) Centralized developer portal with software catalog, application templates, maturity radar, component taxonomy standardization, and automation in the integration with DevSecOps processes. |
+| [Einride](https://github.com/einride) | [@odsod](https://github.com/odsod/) | We use Backstage to create a great developer experience across Einride's entire software stack - from autonomous and electric vehicles to cloud systems - and we've developed a [Backstage Go SDK](https://github.com/einride/backstage-go) for interfacing with Backstage from our Go tooling.
diff --git a/OWNERS.md b/OWNERS.md
index 2124863f8d..a362a95e43 100644
--- a/OWNERS.md
+++ b/OWNERS.md
@@ -20,9 +20,14 @@ These are the separate project areas of Backstage, each with their own project a
Team: @backstage/catalog-maintainers
-| Name | Organization | Team | GitHub | Discord |
-| ---- | ------------ | --------- | ---------------------------- | ------- |
-| TBD | Spotify | Chipmunks | [TBD](http://github.com/TBD) | - |
+Scope: The catalog plugin and catalog model
+
+| Name | Organization | Team | GitHub | Discord |
+| -------------- | ------------ | --------- | ---------------------------------------- | ---------------- |
+| Rickard Dybeck | Spotify | Chipmunks | [alde](http://github.com/alde) | rdybeck#8083 |
+| Mike Blockley | Spotify | Chipmunks | [mikeyhc](http://github.com/mikeyhc) | mikey-spot#5363 |
+| Elon Jefferson | Spotify | Chipmunks | [Edje-C](http://github.com/Edje-C) | elon-spotty#6086 |
+| Nurit Izrailov | Spotify | Chipmunks | [nuritizra](http://github.com/nuritizra) | - |
### Discoverability
diff --git a/docs/auth/microsoft/azure-easyauth.md b/docs/auth/microsoft/azure-easyauth.md
index 4daf0851f0..8ea626288c 100644
--- a/docs/auth/microsoft/azure-easyauth.md
+++ b/docs/auth/microsoft/azure-easyauth.md
@@ -1,10 +1,12 @@
---
-id: azure-easy-auth
+id: easy-auth
title: Azure EasyAuth Provider
-sidebar_label: Azure EasyAuth
+sidebar_label: Azure Easy Auth
description: Adding Azure's EasyAuth Proxy as an authentication provider in Backstage
---
+The Backstage `core-plugin-api` package comes with a Microsoft authentication provider that can authenticate users using Azure Active Directory for PaaS service hosted in Azure that support Easy Auth, such as Azure App Services.
+
## Backstage Changes
Add the following into your `app-config.yaml` or `app-config.production.yaml` file
diff --git a/docs/features/kubernetes/proxy.md b/docs/features/kubernetes/proxy.md
index 7b6837dd7d..5811ff8ec4 100644
--- a/docs/features/kubernetes/proxy.md
+++ b/docs/features/kubernetes/proxy.md
@@ -14,42 +14,16 @@ Kubernetes backend plugin's proxy endpoint to allow them to make arbitrary
requests to the [REST
API](https://kubernetes.io/docs/reference/using-api/api-concepts/).
-Here is a snippet fetching namespaces from a cluster configured with the
-`google` [auth provider](https://backstage.io/docs/features/kubernetes/configuration#clustersauthprovider):
+Here is a snippet fetching namespaces using the `KubernetesBackendClient` library
```typescript
-import {
- discoveryApiRef,
- googleAuthApiRef,
- useApi,
- identityApiRef,
-} from '@backstage/core-plugin-api';
+import { useApi } from '@backstage/core-plugin-api';
+import { kubernetesApiRef } from '@backstage/plugin-kubernetes';
const CLUSTER_NAME = ''; // use a known cluster name
-// get a bearer token from Google
-const googleAuthApi = useApi(googleAuthApiRef);
-const token = await googleAuthApi.getAccessToken(
- 'https://www.googleapis.com/auth/cloud-platform',
-);
-
-// get a backstage ID token
-const identityApi = useApi(identityApiRef);
-const { token: userToken } = await identityApi.getCredentials();
-
-const discoveryApi = useApi(discoveryApiRef);
-const kubernetesBaseUrl = await discoveryApi.getBaseUrl('kubernetes');
-const kubernetesProxyEndpoint = `${kubernetesBaseUrl}/proxy`;
-
-// fetch namespaces
-await fetch(`${kubernetesProxyEndpoint}/api/v1/namespaces`, {
- method: 'GET',
- headers: {
- 'Backstage-Kubernetes-Cluster': CLUSTER_NAME,
- 'Backstage-Kubernetes-Authorization': `Bearer ${token}`,
- Authorization: `Bearer ${userToken}`,
- },
-});
+const kubernetesApi = useApi(kubernetesApiRef);
+await kubernetesApi.proxy(CLUSTER_NAME, '/api/v1/namespaces');
```
## How it works
diff --git a/docs/integrations/bitbucketCloud/discovery.md b/docs/integrations/bitbucketCloud/discovery.md
index c5a7eee4a0..6e1533dea0 100644
--- a/docs/integrations/bitbucketCloud/discovery.md
+++ b/docs/integrations/bitbucketCloud/discovery.md
@@ -76,36 +76,37 @@ Additionally, you need to decide how you want to receive events from external so
Set up your provider
-```ts title="packages/backend/src/plugins/catalogEventBasedProviders.ts"
+```ts title="packages/backend/src/plugins/catalog.ts"
+import { CatalogBuilder } from '@backstage/plugin-catalog-backend';
/* highlight-add-start */
-import { CatalogClient } from '@backstage/catalog-client';
import { BitbucketCloudEntityProvider } from '@backstage/plugin-catalog-backend-module-bitbucket-cloud';
/* highlight-add-end */
-import { EntityProvider } from '@backstage/plugin-catalog-node';
-import { EventSubscriber } from '@backstage/plugin-events-node';
+
+import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend';
+import { Router } from 'express';
import { PluginEnvironment } from '../types';
-export default async function createCatalogEventBasedProviders(
- /* highlight-remove-next-line */
- _: PluginEnvironment,
- /* highlight-add-next-line */
+export default async function createPlugin(
env: PluginEnvironment,
-): Promise> {
- const providers: Array<
- (EntityProvider & EventSubscriber) | Array
- > = [];
- // add your event-based entity providers here
+): Promise {
+ const builder = await CatalogBuilder.create(env);
+ builder.addProcessor(new ScaffolderEntitiesProcessor());
/* highlight-add-start */
- providers.push(
- BitbucketCloudEntityProvider.fromConfig(env.config, {
+ const bitbucketCloudProvider = BitbucketCloudEntityProvider.fromConfig(
+ env.config,
+ {
catalogApi: new CatalogClient({ discoveryApi: env.discovery }),
logger: env.logger,
scheduler: env.scheduler,
tokenManager: env.tokenManager,
- }),
+ },
);
+ env.eventBroker.subscribe(bitbucketCloudProvider);
+ builder.addEntityProvider(bitbucketCloudProvider);
/* highlight-add-end */
- return providers.flat();
+ const { processingEngine, router } = await builder.build();
+ await processingEngine.start();
+ return router;
}
```
diff --git a/docs/integrations/github/discovery.md b/docs/integrations/github/discovery.md
index fb65173b28..7d7744cb09 100644
--- a/docs/integrations/github/discovery.md
+++ b/docs/integrations/github/discovery.md
@@ -69,37 +69,36 @@ Additionally, you need to decide how you want to receive events from external so
Set up your provider
-```ts title="packages/backend/src/plugins/catalogEventBasedProviders.ts"
+```ts title="packages/backend/src/plugins/catalog.ts"
+import { CatalogBuilder } from '@backstage/plugin-catalog-backend';
/* highlight-add-next-line */
import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github';
-import { EntityProvider } from '@backstage/plugin-catalog-node';
-import { EventSubscriber } from '@backstage/plugin-events-node';
+import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend';
+import { Router } from 'express';
import { PluginEnvironment } from '../types';
-export default async function createCatalogEventBasedProviders(
- /* highlight-remove-next-line */
- _: PluginEnvironment,
- /* highlight-add-next-line */
+
+export default async function createPlugin(
env: PluginEnvironment,
-): Promise> {
- const providers: Array<
- (EntityProvider & EventSubscriber) | Array
- > = [];
- // add your event-based entity providers here
+): Promise {
+ const builder = await CatalogBuilder.create(env);
+ builder.addProcessor(new ScaffolderEntitiesProcessor());
/* highlight-add-start */
- providers.push(
- GithubEntityProvider.fromConfig(env.config, {
- logger: env.logger,
- // optional: alternatively, use scheduler with schedule defined in app-config.yaml
- schedule: env.scheduler.createScheduledTaskRunner({
- frequency: { minutes: 30 },
- timeout: { minutes: 3 },
- }),
- // optional: alternatively, use schedule
- scheduler: env.scheduler,
+ const githubProvider = GithubEntityProvider.fromConfig(env.config, {
+ logger: env.logger,
+ // optional: alternatively, use scheduler with schedule defined in app-config.yaml
+ schedule: env.scheduler.createScheduledTaskRunner({
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
}),
- );
+ // optional: alternatively, use schedule
+ scheduler: env.scheduler,
+ });
+ env.eventBroker.subscribe(githubProvider);
+ builder.addEntityProvider(demoProvider);
/* highlight-add-end */
- return providers.flat();
+ const { processingEngine, router } = await builder.build();
+ await processingEngine.start();
+ return router;
}
```
diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md
index 8f67e2a43f..ccffe60bd1 100644
--- a/docs/integrations/github/org.md
+++ b/docs/integrations/github/org.md
@@ -79,25 +79,21 @@ Additionally, you need to decide how you want to receive events from external so
Set up your provider
-```ts title="packages/backend/src/plugins/catalogEventBasedProviders.ts"
+```ts title="packages/backend/src/plugins/catalog.ts"
+import { CatalogBuilder } from '@backstage/plugin-catalog-backend';
/* highlight-add-next-line */
import { GithubOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github';
-import { EntityProvider } from '@backstage/plugin-catalog-node';
-import { EventSubscriber } from '@backstage/plugin-events-node';
+import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend';
+import { Router } from 'express';
import { PluginEnvironment } from '../types';
-export default async function createCatalogEventBasedProviders(
- /* highlight-remove-next-line */
- _: PluginEnvironment,
- /* highlight-add-next-line */
+
+export default async function createPlugin(
env: PluginEnvironment,
-): Promise> {
- const providers: Array<
- (EntityProvider & EventSubscriber) | Array
- > = [];
- // add your event-based entity providers here
+): Promise {
+ const builder = await CatalogBuilder.create(env);
+ builder.addProcessor(new ScaffolderEntitiesProcessor());
/* highlight-add-start */
- providers.push(
- GithubOrgEntityProvider.fromConfig(env.config, {
+ const githubOrgProvider = GithubOrgEntityProvider.fromConfig(env.config, {
id: 'production',
orgUrl: 'https://github.com/backstage',
logger: env.logger,
@@ -105,10 +101,12 @@ export default async function createCatalogEventBasedProviders(
frequency: { minutes: 60 },
timeout: { minutes: 15 },
}),
- }),
- );
+ env.eventBroker.subscribe(githubOrgProvider);
+ builder.addEntityProvider(githubOrgProvider);
/* highlight-add-end */
- return providers.flat();
+ const { processingEngine, router } = await builder.build();
+ await processingEngine.start();
+ return router;
}
```
diff --git a/docs/plugins/backend-plugin.md b/docs/plugins/backend-plugin.md
index 9ce835f5f5..73b8f9027a 100644
--- a/docs/plugins/backend-plugin.md
+++ b/docs/plugins/backend-plugin.md
@@ -184,9 +184,10 @@ export async function createRouter(
options: RouterOptions,
): Promise {
const router = Router();
+ const { identity } = options;
router.post('/example', async (req, res) => {
- const identity = await identity.getIdentity({ request: req });
+ const userIdentity = await identity.getIdentity({ request: req });
...
});
```
diff --git a/docs/releases/v1.13.0-next.3-changelog.md b/docs/releases/v1.13.0-next.3-changelog.md
new file mode 100644
index 0000000000..80da2aaa77
--- /dev/null
+++ b/docs/releases/v1.13.0-next.3-changelog.md
@@ -0,0 +1,2087 @@
+# Release v1.13.0-next.3
+
+## @backstage/catalog-model@1.3.0-next.0
+
+### Minor Changes
+
+- be9c4228073: Modified the regex for DNS label validation to support IDN domains
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/types@1.0.2
+
+## @backstage/cli-node@0.1.0-next.0
+
+### Minor Changes
+
+- 3156b0d85dc: Introduced the new `@backstage/cli-node` package, which provides utilities for use across Backstage CLIs.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli-common@0.1.12
+ - @backstage/errors@1.1.5
+ - @backstage/types@1.0.2
+
+## @backstage/core-app-api@1.7.0-next.3
+
+### Minor Changes
+
+- c15e0cedbe1: The `AuthConnector` interface now supports specifying a set of scopes when
+ refreshing a session. The `DefaultAuthConnector` implementation passes the
+ `scope` query parameter to the auth-backend plugin appropriately. The
+ `RefreshingAuthSessionManager` passes any scopes in its `GetSessionRequest`
+ appropriately.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/types@1.0.2
+ - @backstage/version-bridge@1.0.4-next.0
+
+## @backstage/core-components@0.13.0-next.3
+
+### Minor Changes
+
+- 01cd4e25754: **BREAKING:** Removing `Tabs` component from `core-components` as it is neither used in the core Backstage app nor in the monorepo plugins. If you are using this component in your instance please consider replacing it with the [Material UI `Tabs`](https://v4.mui.com/components/tabs/#tabs) component like the following:
+
+ ```diff
+ - ,
+ - content: Label
,
+ - }]}
+ - />
+
+ +
+ + }
+ + />
+ +
+ ```
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/version-bridge@1.0.4-next.0
+
+## @backstage/repo-tools@0.2.0-next.2
+
+### Minor Changes
+
+- a876e69b20e: Adding two new commands to support OpenAPI spec writing, `schema:openapi:generate` to generate the Typescript file that `@backstage/backend-openapi-utils` needs for typing and `schema:openapi:verify` to verify that this file exists and matches your `src/schema/openapi.yaml` file.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli-common@0.1.12
+ - @backstage/errors@1.1.5
+
+## @backstage/plugin-catalog-backend@1.9.0-next.3
+
+### Minor Changes
+
+- 92a4590fc3a: Add monorepo support to CodeOwnersProccesor.
+
+### Patch Changes
+
+- be5aca50114: Updates and moves OpenAPI spec to `src/schema/openapi.yaml` and uses `ApiRouter` type from `@backstage/backend-openapi-utils` to handle automatic types from the OpenAPI spec file.
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-permission-node@0.7.7-next.2
+ - @backstage/plugin-scaffolder-common@1.2.7-next.2
+ - @backstage/plugin-search-backend-module-catalog@0.1.0-next.2
+ - @backstage/plugin-search-common@1.2.3-next.0
+
+## @backstage/plugin-catalog-react@1.5.0-next.3
+
+### Minor Changes
+
+- a49fb39df5a: Attempt to load entity owner names in the EntityOwnerPicker through the `by-refs` endpoint. If `spec.profile.displayName` or `metadata.title` are populated, we now attempt to show those before showing the `humanizeEntityRef`'d version.
+
+ **BREAKING**: `EntityOwnerFilter` now uses the full entity ref instead of the `humanizeEntityRef`. If you rely on `EntityOwnerFilter.values` or the `queryParameters.owners` of `useEntityList`, you will need to adjust your code like the following.
+
+ ```tsx
+ const { queryParameters: { owners } } = useEntityList();
+ // or
+ const { filter: { owners } } = useEntityList();
+
+ // Instead of,
+ if (owners.some(ref => ref === humanizeEntityRef(myEntity))) ...
+
+ // You'll need to use,
+ if (owners.some(ref => ref === stringifyEntityRef(myEntity))) ...
+ ```
+
+### Patch Changes
+
+- d1f5324dff7: Reverted the check if the selected options list is different than the query parameters list before invoking `setSelectedOptions` method. This was preventing updating list items when a query string was already present in the URL when loading the page.
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+ - @backstage/version-bridge@1.0.4-next.0
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-permission-react@0.4.12-next.1
+
+## @backstage/plugin-kubernetes@0.8.0-next.3
+
+### Minor Changes
+
+- 754be7c5106: refactor kubernetes error detection to make way for proposed solutions
+
+ **BREAKING**: `DetectedError` now appears once per Kubernetes resource per error instead of for all resources which have that error, `namespace` and `name` fields are now in `sourceRef` object `message` is now a `string` instead of a `string[]`. `ErrorDetectableKind` has been removed.
+
+### Patch Changes
+
+- e7fb0117485: fixes a bug where an empty authorization header was provided to the proxy endpoint when a cluster had a server-side auth provider
+- c159ab64a60: `KubernetesBackendClient` now requires a `kubernetesAuthProvidersApi` value to be provided. `KubernetesApi` interface now has a proxy method requirement.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-kubernetes-common@0.6.2-next.2
+
+## @backstage/plugin-lighthouse-backend@0.2.0-next.3
+
+### Minor Changes
+
+- 7a89555e73d: Lighthouse backend plugin can now use an authenticated catalog backend API.
+
+ - Breaking \* You must now pass the `tokenManager` to the lighthouse `createScheduler`.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/types@1.0.2
+ - @backstage/plugin-lighthouse-common@0.1.1
+
+## @backstage/plugin-scaffolder-backend@1.13.0-next.3
+
+### Minor Changes
+
+- d7c8c222e25: Allow for a commit message to differ from the PR title when publishing a GitHub pull request.
+
+### Patch Changes
+
+- f37a95adcd8: Stripped entity types and namespace before passing to GitHub API
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.9.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-auth-node@0.2.13-next.2
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-permission-node@0.7.7-next.2
+ - @backstage/plugin-scaffolder-common@1.2.7-next.2
+ - @backstage/plugin-scaffolder-node@0.1.2-next.3
+
+## @backstage/app-defaults@1.3.0-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.7.0-next.3
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-permission-react@0.4.12-next.1
+
+## @backstage/backend-openapi-utils@0.0.1-next.0
+
+### Patch Changes
+
+- 62fe726fdc5: New plugin! Primary focus is to support types on `Router`s in backend packages. Developers can use the `ApiRouter` from this package in their packages to support a typed experience based on their OpenAPI specs. The `ApiRouter` supports request bodies, response bodies, query parameters and path parameters, as well as full path-based context of the above. This means no more guessing on an endpoint like `req.post('/not-my-route', (req, res)=>{res.send(req.body.badparam)})`. Typescript would catch `/not-my-route`, `req.body.badparam`, `res.send(req.body.badparam)`.
+
+## @backstage/catalog-client@1.4.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/errors@1.1.5
+
+## @backstage/cli@0.22.6-next.3
+
+### Patch Changes
+
+- 3156b0d85dc: Internal refactor to move many internal utilities to the new `@backstage/cli-node` package.
+- 9bbb00d5b49: Updated dependency `@swc/helpers` to `^0.5.0`.
+- Updated dependencies
+ - @backstage/cli-node@0.1.0-next.0
+ - @backstage/cli-common@0.1.12
+ - @backstage/config@1.0.7
+ - @backstage/config-loader@1.1.9
+ - @backstage/errors@1.1.5
+ - @backstage/eslint-plugin@0.1.3-next.0
+ - @backstage/release-manifests@0.0.9
+ - @backstage/types@1.0.2
+
+## @backstage/create-app@0.4.39-next.3
+
+### Patch Changes
+
+- Bumped create-app version.
+- Updated dependencies
+ - @backstage/cli-common@0.1.12
+
+## @backstage/dev-utils@1.0.14-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/core-app-api@1.7.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/app-defaults@1.3.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/test-utils@1.3.0-next.3
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/integration-react@1.1.12-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/theme@0.2.19-next.0
+
+## @techdocs/cli@1.4.1-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/cli-common@0.1.12
+ - @backstage/config@1.0.7
+ - @backstage/plugin-techdocs-node@1.6.1-next.3
+
+## @backstage/test-utils@1.3.0-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.7.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-permission-react@0.4.12-next.1
+
+## @backstage/plugin-adr@0.4.2-next.3
+
+### Patch Changes
+
+- 77aa3a4d47e: use path attribute to fetch files instead of name and update the UI to navigate over subdirectories
+- Updated dependencies
+ - @backstage/plugin-adr-common@0.2.8-next.1
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-search-react@1.5.2-next.3
+
+## @backstage/plugin-adr-backend@0.3.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-adr-common@0.2.8-next.1
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/plugin-search-common@1.2.3-next.0
+
+## @backstage/plugin-adr-common@0.2.8-next.1
+
+### Patch Changes
+
+- 77aa3a4d47e: use path attribute to fetch files instead of name and update the UI to navigate over subdirectories
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/plugin-search-common@1.2.3-next.0
+
+## @backstage/plugin-airbrake@0.3.17-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/dev-utils@1.0.14-next.3
+ - @backstage/test-utils@1.3.0-next.3
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-allure@0.1.33-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-analytics-module-ga@0.1.28-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-apache-airflow@0.2.10-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+
+## @backstage/plugin-api-docs@0.9.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-catalog@1.10.0-next.3
+
+## @backstage/plugin-apollo-explorer@0.1.10-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-auth-backend@0.18.2-next.3
+
+### Patch Changes
+
+- 475abd1dc3f: The `microsoft` (i.e. Azure) auth provider now supports negotiating tokens for
+ Azure resources besides Microsoft Graph (e.g. AKS, Virtual Machines, Machine
+ Learning Services, etc.). When the `/frame/handler` endpoint is called with an
+ authorization code for a non-Microsoft Graph scope, the user profile will not be
+ fetched. Similarly no user profile or photo data will be fetched by the backend
+ if the `/refresh` endpoint is called with the `scope` query parameter strictly
+ containing scopes for resources besides Microsoft Graph.
+
+ Furthermore, the `offline_access` scope will be requested by default, even when
+ it is not mentioned in the argument to `getAccessToken`. This means that any
+ Azure access token can be automatically refreshed, even if the user has not
+ signed in via Azure.
+
+- 6a900951336: Add common identify resolvers for `oidc` auth provider.
+
+- a0ef1ec7349: Export Azure Easy Auth provider so it can actually be used.
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/types@1.0.2
+ - @backstage/plugin-auth-node@0.2.13-next.2
+
+## @backstage/plugin-azure-devops@0.2.8-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-azure-devops-common@0.3.0
+
+## @backstage/plugin-azure-sites@0.1.6-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-azure-sites-common@0.1.0
+
+## @backstage/plugin-badges@0.2.41-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-badges-backend@0.1.38-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+
+## @backstage/plugin-bazaar@0.2.7-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.22.6-next.3
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-catalog@1.10.0-next.3
+
+## @backstage/plugin-bitrise@0.1.44-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-catalog@1.10.0-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-search-react@1.5.2-next.3
+
+## @backstage/plugin-catalog-backend-module-aws@0.1.18-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+ - @backstage/plugin-kubernetes-common@0.6.2-next.2
+
+## @backstage/plugin-catalog-backend-module-azure@0.1.15-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+
+## @backstage/plugin-catalog-backend-module-bitbucket@0.2.11-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.11-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/plugin-bitbucket-cloud-common@0.2.5-next.0
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+ - @backstage/plugin-events-node@0.2.5-next.2
+
+## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.9-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.1.12-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+
+## @backstage/plugin-catalog-backend-module-github@0.2.7-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.9.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+ - @backstage/plugin-events-node@0.2.5-next.2
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.2.0-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+
+## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.3.1-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.9.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+ - @backstage/plugin-events-node@0.2.5-next.2
+ - @backstage/plugin-permission-common@0.7.5-next.0
+
+## @backstage/plugin-catalog-backend-module-ldap@0.5.11-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.5.3-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+
+## @backstage/plugin-catalog-backend-module-openapi@0.1.10-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.9.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/config@1.0.7
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+
+## @backstage/plugin-catalog-backend-module-puppetdb@0.1.1-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+
+## @backstage/plugin-catalog-common@1.0.13-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-search-common@1.2.3-next.0
+
+## @backstage/plugin-catalog-graph@0.2.29-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-catalog-graphql@0.3.20-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/config@1.0.7
+ - @backstage/types@1.0.2
+
+## @backstage/plugin-catalog-import@0.9.7-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+
+## @backstage/plugin-catalog-node@1.3.5-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+
+## @backstage/plugin-cicd-statistics@0.1.19-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-plugin-api@1.5.1-next.1
+
+## @backstage/plugin-cicd-statistics-module-gitlab@0.1.13-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/plugin-cicd-statistics@0.1.19-next.3
+
+## @backstage/plugin-circleci@0.3.17-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-cloudbuild@0.3.17-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-code-climate@0.1.17-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-code-coverage@0.2.10-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-code-coverage-backend@0.2.10-next.3
+
+### Patch Changes
+
+- d3645a62b74: Bump `xml2js` from 0.4.23 to 0.5.0
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+
+## @backstage/plugin-codescene@0.1.12-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-config-schema@0.1.40-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+
+## @backstage/plugin-cost-insights@0.12.6-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-cost-insights-common@0.1.1
+
+## @backstage/plugin-dynatrace@4.0.0-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-entity-feedback@0.2.0-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-entity-feedback-common@0.1.1-next.0
+
+## @backstage/plugin-entity-feedback-backend@0.1.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/plugin-auth-node@0.2.13-next.2
+ - @backstage/plugin-entity-feedback-common@0.1.1-next.0
+
+## @backstage/plugin-entity-validation@0.1.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+
+## @backstage/plugin-events-backend@0.2.5-next.3
+
+### Patch Changes
+
+- 3538d9ad2c4: Export `DefaultEventBroker` to allow decoupling of the catalog and events backends in the `example-backend`.
+
+ Please look at `plugins/events-backend/README.md` for the currently advised way to set up the event backend and catalog providers.
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/plugin-events-node@0.2.5-next.2
+
+## @backstage/plugin-explore@0.4.2-next.3
+
+### Patch Changes
+
+- f9ea944422e: Extracted generic `CatalogKindExploreContent` component so that it is easy to show any component kinds in their own tab in the explore page.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-explore-common@0.0.1
+ - @backstage/plugin-explore-react@0.0.28-next.1
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-search-react@1.5.2-next.3
+
+## @backstage/plugin-firehydrant@0.2.1-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-fossa@0.2.49-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-gcalendar@0.3.13-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-gcp-projects@0.3.36-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-git-release-manager@0.3.30-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-github-actions@0.5.17-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-github-deployments@0.1.48-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-github-issues@0.2.6-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-github-pull-requests-board@0.1.11-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-gitops-profiles@0.3.35-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-gocd@0.1.23-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-graphiql@0.2.49-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-graphql-backend@0.1.34-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/config@1.0.7
+ - @backstage/plugin-catalog-graphql@0.3.20-next.2
+
+## @backstage/plugin-graphql-voyager@0.1.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-home@0.4.33-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-ilert@0.2.6-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-jenkins@0.7.16-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-jenkins-common@0.1.15-next.1
+
+## @backstage/plugin-jenkins-backend@0.1.34-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/plugin-auth-node@0.2.13-next.2
+ - @backstage/plugin-jenkins-common@0.1.15-next.1
+ - @backstage/plugin-permission-common@0.7.5-next.0
+
+## @backstage/plugin-jenkins-common@0.1.15-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-permission-common@0.7.5-next.0
+
+## @backstage/plugin-kafka@0.3.17-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-kafka-backend@0.2.37-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+
+## @backstage/plugin-kubernetes-backend@0.10.0-next.3
+
+### Patch Changes
+
+- 56a28b559e5: Updated kubernetes config schema to match available options
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/plugin-auth-node@0.2.13-next.2
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+ - @backstage/plugin-kubernetes-common@0.6.2-next.2
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-permission-node@0.7.7-next.2
+
+## @backstage/plugin-kubernetes-common@0.6.2-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/plugin-permission-common@0.7.5-next.0
+
+## @backstage/plugin-lighthouse@0.4.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-lighthouse-common@0.1.1
+
+## @backstage/plugin-linguist@0.1.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-linguist-common@0.1.0
+
+## @backstage/plugin-linguist-backend@0.2.1-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/types@1.0.2
+ - @backstage/plugin-auth-node@0.2.13-next.2
+ - @backstage/plugin-linguist-common@0.1.0
+
+## @backstage/plugin-microsoft-calendar@0.1.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-newrelic@0.3.35-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-newrelic-dashboard@0.2.10-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+
+## @backstage/plugin-octopus-deploy@0.1.1-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-org@0.6.7-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-org-react@0.1.6-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-pagerduty@0.5.10-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-periskop@0.1.15-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-playlist@0.1.8-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-permission-react@0.4.12-next.1
+ - @backstage/plugin-playlist-common@0.1.6-next.0
+ - @backstage/plugin-search-react@1.5.2-next.3
+
+## @backstage/plugin-playlist-backend@0.2.7-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/plugin-auth-node@0.2.13-next.2
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-permission-node@0.7.7-next.2
+ - @backstage/plugin-playlist-common@0.1.6-next.0
+
+## @backstage/plugin-rollbar@0.4.17-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-scaffolder@1.13.0-next.3
+
+### Patch Changes
+
+- 7917cfccfc7: Fix some hard-coded white font colors in scaffolder
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/plugin-scaffolder-react@1.3.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-permission-react@0.4.12-next.1
+ - @backstage/plugin-scaffolder-common@1.2.7-next.2
+
+## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.13.0-next.3
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-scaffolder-node@0.1.2-next.3
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.19-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.13.0-next.3
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-scaffolder-node@0.1.2-next.3
+
+## @backstage/plugin-scaffolder-backend-module-gitlab@0.1.0-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/plugin-scaffolder-node@0.1.2-next.3
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend@1.13.0-next.3
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-scaffolder-node@0.1.2-next.3
+
+## @backstage/plugin-scaffolder-backend-module-sentry@0.1.4-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/plugin-scaffolder-node@0.1.2-next.3
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.17-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.0.7
+ - @backstage/types@1.0.2
+ - @backstage/plugin-scaffolder-node@0.1.2-next.3
+
+## @backstage/plugin-scaffolder-common@1.2.7-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-permission-common@0.7.5-next.0
+
+## @backstage/plugin-scaffolder-node@0.1.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/types@1.0.2
+ - @backstage/plugin-scaffolder-common@1.2.7-next.2
+
+## @backstage/plugin-scaffolder-react@1.3.0-next.3
+
+### Patch Changes
+
+- d2488f5e54c: Add indication that the validators are running
+- 8c40997df44: Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.5.2`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+ - @backstage/version-bridge@1.0.4-next.0
+ - @backstage/plugin-scaffolder-common@1.2.7-next.2
+
+## @backstage/plugin-search@1.2.0-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+ - @backstage/version-bridge@1.0.4-next.0
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-search-react@1.5.2-next.3
+
+## @backstage/plugin-search-backend-module-catalog@0.1.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-search-backend-node@1.2.0-next.2
+ - @backstage/plugin-search-common@1.2.3-next.0
+
+## @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.3
+
+### Patch Changes
+
+- 104b6b19487: fix ElasticSearch throwing error when index is missing
+- Updated dependencies
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/config@1.0.7
+ - @backstage/plugin-search-backend-node@1.2.0-next.2
+ - @backstage/plugin-search-common@1.2.3-next.0
+
+## @backstage/plugin-search-backend-module-techdocs@0.1.0-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-search-backend-node@1.2.0-next.2
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-techdocs-node@1.6.1-next.3
+
+## @backstage/plugin-search-react@1.5.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+ - @backstage/version-bridge@1.0.4-next.0
+ - @backstage/plugin-search-common@1.2.3-next.0
+
+## @backstage/plugin-sentry@0.5.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-shortcuts@0.3.9-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+
+## @backstage/plugin-sonarqube@0.6.6-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-sonarqube-react@0.1.5-next.2
+
+## @backstage/plugin-sonarqube-react@0.1.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-plugin-api@1.5.1-next.1
+
+## @backstage/plugin-splunk-on-call@0.4.6-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-stack-overflow@0.1.13-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-home@0.4.33-next.3
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-search-react@1.5.2-next.3
+
+## @backstage/plugin-stackstorm@0.1.1-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-tech-insights@0.3.9-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+ - @backstage/plugin-tech-insights-common@0.2.10
+
+## @backstage/plugin-tech-insights-backend@0.5.10-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/types@1.0.2
+ - @backstage/plugin-tech-insights-common@0.2.10
+ - @backstage/plugin-tech-insights-node@0.4.2-next.2
+
+## @backstage/plugin-tech-radar@0.6.3-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-techdocs@1.6.1-next.3
+
+### Patch Changes
+
+- 2e493480626: Fix a bug in sub-path navigation due to double addition of a sub-path if one was set up in `app.baseUrl`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-search-react@1.5.2-next.3
+ - @backstage/plugin-techdocs-react@1.1.5-next.3
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.12-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.7.0-next.3
+ - @backstage/plugin-techdocs@1.6.1-next.3
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/test-utils@1.3.0-next.3
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-catalog@1.10.0-next.3
+ - @backstage/plugin-search-react@1.5.2-next.3
+ - @backstage/plugin-techdocs-react@1.1.5-next.3
+
+## @backstage/plugin-techdocs-backend@1.6.1-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.2
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-techdocs-node@1.6.1-next.3
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-techdocs-react@1.1.5-next.3
+
+## @backstage/plugin-techdocs-node@1.6.1-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/integration-aws-node@0.1.2
+ - @backstage/plugin-search-common@1.2.3-next.0
+
+## @backstage/plugin-techdocs-react@1.1.5-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/version-bridge@1.0.4-next.0
+
+## @backstage/plugin-todo@0.2.19-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-todo-backend@0.1.41-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/errors@1.1.5
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+
+## @backstage/plugin-user-settings@0.7.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/core-app-api@1.7.0-next.3
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/types@1.0.2
+
+## @backstage/plugin-user-settings-backend@0.1.8-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-plugin-api@0.5.1-next.2
+ - @backstage/errors@1.1.5
+ - @backstage/types@1.0.2
+ - @backstage/plugin-auth-node@0.2.13-next.2
+
+## @backstage/plugin-vault@0.1.11-next.3
+
+### Patch Changes
+
+- 7c7f8d38a51: Use `fetchApi` instead of raw `fetch` in order to pass auth header if necessary.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## @backstage/plugin-xcmetrics@0.2.37-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/errors@1.1.5
+ - @backstage/theme@0.2.19-next.0
+
+## example-app@0.2.82-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-kubernetes@0.8.0-next.3
+ - @backstage/plugin-scaffolder@1.13.0-next.3
+ - @backstage/cli@0.22.6-next.3
+ - @backstage/plugin-explore@0.4.2-next.3
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/plugin-scaffolder-react@1.3.0-next.3
+ - @backstage/core-app-api@1.7.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/plugin-techdocs@1.6.1-next.3
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/app-defaults@1.3.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-airbrake@0.3.17-next.3
+ - @backstage/plugin-apache-airflow@0.2.10-next.3
+ - @backstage/plugin-api-docs@0.9.2-next.3
+ - @backstage/plugin-azure-devops@0.2.8-next.3
+ - @backstage/plugin-azure-sites@0.1.6-next.3
+ - @backstage/plugin-badges@0.2.41-next.3
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-graph@0.2.29-next.3
+ - @backstage/plugin-catalog-import@0.9.7-next.3
+ - @backstage/plugin-circleci@0.3.17-next.3
+ - @backstage/plugin-cloudbuild@0.3.17-next.3
+ - @backstage/plugin-code-coverage@0.2.10-next.3
+ - @backstage/plugin-cost-insights@0.12.6-next.3
+ - @backstage/plugin-dynatrace@4.0.0-next.3
+ - @backstage/plugin-entity-feedback@0.2.0-next.3
+ - @backstage/plugin-gcalendar@0.3.13-next.3
+ - @backstage/plugin-gcp-projects@0.3.36-next.3
+ - @backstage/plugin-github-actions@0.5.17-next.3
+ - @backstage/plugin-gocd@0.1.23-next.3
+ - @backstage/plugin-graphiql@0.2.49-next.3
+ - @backstage/plugin-home@0.4.33-next.3
+ - @backstage/plugin-jenkins@0.7.16-next.3
+ - @backstage/plugin-kafka@0.3.17-next.3
+ - @backstage/plugin-lighthouse@0.4.2-next.3
+ - @backstage/plugin-linguist@0.1.2-next.3
+ - @backstage/plugin-linguist-common@0.1.0
+ - @backstage/plugin-microsoft-calendar@0.1.2-next.3
+ - @backstage/plugin-newrelic@0.3.35-next.3
+ - @backstage/plugin-newrelic-dashboard@0.2.10-next.3
+ - @backstage/plugin-org@0.6.7-next.3
+ - @backstage/plugin-pagerduty@0.5.10-next.3
+ - @backstage/plugin-permission-react@0.4.12-next.1
+ - @backstage/plugin-playlist@0.1.8-next.3
+ - @backstage/plugin-rollbar@0.4.17-next.3
+ - @backstage/plugin-search@1.2.0-next.3
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-search-react@1.5.2-next.3
+ - @backstage/plugin-sentry@0.5.2-next.3
+ - @backstage/plugin-shortcuts@0.3.9-next.3
+ - @backstage/plugin-stack-overflow@0.1.13-next.3
+ - @backstage/plugin-stackstorm@0.1.1-next.3
+ - @backstage/plugin-tech-insights@0.3.9-next.3
+ - @backstage/plugin-tech-radar@0.6.3-next.3
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.3
+ - @backstage/plugin-techdocs-react@1.1.5-next.3
+ - @backstage/plugin-todo@0.2.19-next.3
+ - @backstage/plugin-user-settings@0.7.2-next.3
+ - @internal/plugin-catalog-customized@0.0.9-next.3
+
+## example-backend@0.2.82-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-kubernetes-backend@0.10.0-next.3
+ - @backstage/plugin-catalog-backend@1.9.0-next.3
+ - @backstage/plugin-code-coverage-backend@0.2.10-next.3
+ - @backstage/plugin-lighthouse-backend@0.2.0-next.3
+ - @backstage/plugin-auth-backend@0.18.2-next.3
+ - @backstage/plugin-scaffolder-backend@1.13.0-next.3
+ - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/plugin-events-backend@0.2.5-next.3
+ - example-app@0.2.82-next.3
+ - @backstage/backend-common@0.18.4-next.2
+ - @backstage/backend-tasks@0.5.1-next.2
+ - @backstage/catalog-client@1.4.1-next.1
+ - @backstage/config@1.0.7
+ - @backstage/integration@1.4.4-next.0
+ - @backstage/plugin-adr-backend@0.3.2-next.3
+ - @backstage/plugin-app-backend@0.3.44-next.2
+ - @backstage/plugin-auth-node@0.2.13-next.2
+ - @backstage/plugin-azure-devops-backend@0.3.23-next.2
+ - @backstage/plugin-azure-sites-backend@0.1.6-next.2
+ - @backstage/plugin-badges-backend@0.1.38-next.3
+ - @backstage/plugin-catalog-node@1.3.5-next.3
+ - @backstage/plugin-entity-feedback-backend@0.1.2-next.3
+ - @backstage/plugin-events-node@0.2.5-next.2
+ - @backstage/plugin-explore-backend@0.0.6-next.2
+ - @backstage/plugin-graphql-backend@0.1.34-next.3
+ - @backstage/plugin-jenkins-backend@0.1.34-next.3
+ - @backstage/plugin-kafka-backend@0.2.37-next.3
+ - @backstage/plugin-linguist-backend@0.2.1-next.3
+ - @backstage/plugin-permission-backend@0.5.19-next.2
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-permission-node@0.7.7-next.2
+ - @backstage/plugin-playlist-backend@0.2.7-next.3
+ - @backstage/plugin-proxy-backend@0.2.38-next.2
+ - @backstage/plugin-rollbar-backend@0.1.41-next.2
+ - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.3
+ - @backstage/plugin-search-backend@1.3.0-next.2
+ - @backstage/plugin-search-backend-module-pg@0.5.5-next.2
+ - @backstage/plugin-search-backend-node@1.2.0-next.2
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-tech-insights-backend@0.5.10-next.3
+ - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.2
+ - @backstage/plugin-tech-insights-node@0.4.2-next.2
+ - @backstage/plugin-techdocs-backend@1.6.1-next.3
+ - @backstage/plugin-todo-backend@0.1.41-next.3
+
+## example-backend-next@0.0.10-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-kubernetes-backend@0.10.0-next.3
+ - @backstage/plugin-catalog-backend@1.9.0-next.3
+ - @backstage/plugin-scaffolder-backend@1.13.0-next.3
+ - @backstage/backend-defaults@0.1.9-next.2
+ - @backstage/plugin-app-backend@0.3.44-next.2
+ - @backstage/plugin-auth-node@0.2.13-next.2
+ - @backstage/plugin-permission-backend@0.5.19-next.2
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-permission-node@0.7.7-next.2
+ - @backstage/plugin-search-backend@1.3.0-next.2
+ - @backstage/plugin-search-backend-module-catalog@0.1.0-next.2
+ - @backstage/plugin-search-backend-module-explore@0.1.0-next.1
+ - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.2
+ - @backstage/plugin-search-backend-node@1.2.0-next.2
+ - @backstage/plugin-techdocs-backend@1.6.1-next.3
+ - @backstage/plugin-todo-backend@0.1.41-next.3
+
+## e2e-test@0.2.2-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.4.39-next.3
+ - @backstage/cli-common@0.1.12
+ - @backstage/errors@1.1.5
+
+## techdocs-cli-embedded-app@0.2.81-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.22.6-next.3
+ - @backstage/core-app-api@1.7.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/plugin-techdocs@1.6.1-next.3
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/app-defaults@1.3.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/test-utils@1.3.0-next.3
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-catalog@1.10.0-next.3
+ - @backstage/plugin-techdocs-react@1.1.5-next.3
+
+## @internal/plugin-catalog-customized@0.0.9-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/plugin-catalog@1.10.0-next.3
+
+## @internal/plugin-todo-list@1.0.12-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
diff --git a/microsite/data/plugins/api-spectral-linter.yaml b/microsite/data/plugins/api-spectral-linter.yaml
new file mode 100644
index 0000000000..292279e324
--- /dev/null
+++ b/microsite/data/plugins/api-spectral-linter.yaml
@@ -0,0 +1,10 @@
+---
+title: API Spectral Linter
+author: dweber019
+authorUrl: https://github.com/dweber019
+category: Linting
+description: API Spectral Linter is a quality assurance tool that checks the compliance of API's specifications Spectral rule sets.
+documentation: https://github.com/dweber019/backstage-plugin-api-docs-spectral-linter
+iconUrl: https://raw.githubusercontent.com/dweber019/backstage-plugin-api-docs-spectral-linter/main/plugins/api-docs-spectral-linter/docs/pluginIcon.png
+npmPackageName: '@dweber019/backstage-plugin-api-docs-spectral-linter'
+addedDate: '2023-03-27'
diff --git a/microsite/data/plugins/bulletin-board.yaml b/microsite/data/plugins/bulletin-board.yaml
new file mode 100644
index 0000000000..67791f6f84
--- /dev/null
+++ b/microsite/data/plugins/bulletin-board.yaml
@@ -0,0 +1,10 @@
+---
+title: Bulletin Board
+author: v-ngu
+authorUrl: https://github.com/v-ngu
+category: Discovery
+description: Share interesting ideas, news and links with your teammates within Backstage.
+documentation: https://github.com/v-ngu/backstage-plugin-bulletin-board
+iconUrl: /img/bulletin-board.png
+npmPackageName: 'backstage-plugin-bulletin-board'
+addedDate: '2023-04-01'
diff --git a/microsite/package.json b/microsite/package.json
index 09409518ee..76696ce939 100644
--- a/microsite/package.json
+++ b/microsite/package.json
@@ -32,7 +32,7 @@
"@docusaurus/core": "2.4.0",
"@docusaurus/plugin-client-redirects": "^2.3.1",
"@docusaurus/preset-classic": "2.4.0",
- "@swc/core": "^1.3.36",
+ "@swc/core": "^1.3.46",
"clsx": "^1.1.1",
"docusaurus-plugin-sass": "^0.2.3",
"prism-react-renderer": "^1.3.5",
diff --git a/microsite/sidebars.json b/microsite/sidebars.json
index 09727685a0..b3e6f07b0e 100644
--- a/microsite/sidebars.json
+++ b/microsite/sidebars.json
@@ -277,15 +277,16 @@
"items": [
"auth/auth0/provider",
"auth/atlassian/provider",
- "auth/bitbucket/provider",
"auth/microsoft/provider",
+ "auth/microsoft/easy-auth",
+ "auth/bitbucket/provider",
"auth/github/provider",
"auth/gitlab/provider",
"auth/google/provider",
"auth/google/gcp-iap-auth",
"auth/okta/provider",
- "auth/onelogin/provider",
- "auth/oauth2-proxy/provider"
+ "auth/oauth2-proxy/provider",
+ "auth/onelogin/provider"
]
},
"auth/identity-resolver",
diff --git a/microsite/static/img/bulletin-board.png b/microsite/static/img/bulletin-board.png
new file mode 100644
index 0000000000..918d81827a
Binary files /dev/null and b/microsite/static/img/bulletin-board.png differ
diff --git a/microsite/yarn.lock b/microsite/yarn.lock
index 021d21a043..8b254d6d9a 100644
--- a/microsite/yarn.lock
+++ b/microsite/yarn.lock
@@ -2624,90 +2624,92 @@ __metadata:
languageName: node
linkType: hard
-"@swc/core-darwin-arm64@npm:1.3.42":
- version: 1.3.42
- resolution: "@swc/core-darwin-arm64@npm:1.3.42"
+"@swc/core-darwin-arm64@npm:1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core-darwin-arm64@npm:1.3.46"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-darwin-x64@npm:1.3.42":
- version: 1.3.42
- resolution: "@swc/core-darwin-x64@npm:1.3.42"
+"@swc/core-darwin-x64@npm:1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core-darwin-x64@npm:1.3.46"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@swc/core-linux-arm-gnueabihf@npm:1.3.42":
- version: 1.3.42
- resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.42"
+"@swc/core-linux-arm-gnueabihf@npm:1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.46"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"@swc/core-linux-arm64-gnu@npm:1.3.42":
- version: 1.3.42
- resolution: "@swc/core-linux-arm64-gnu@npm:1.3.42"
+"@swc/core-linux-arm64-gnu@npm:1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core-linux-arm64-gnu@npm:1.3.46"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-arm64-musl@npm:1.3.42":
- version: 1.3.42
- resolution: "@swc/core-linux-arm64-musl@npm:1.3.42"
+"@swc/core-linux-arm64-musl@npm:1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core-linux-arm64-musl@npm:1.3.46"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-linux-x64-gnu@npm:1.3.42":
- version: 1.3.42
- resolution: "@swc/core-linux-x64-gnu@npm:1.3.42"
+"@swc/core-linux-x64-gnu@npm:1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core-linux-x64-gnu@npm:1.3.46"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-x64-musl@npm:1.3.42":
- version: 1.3.42
- resolution: "@swc/core-linux-x64-musl@npm:1.3.42"
+"@swc/core-linux-x64-musl@npm:1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core-linux-x64-musl@npm:1.3.46"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-win32-arm64-msvc@npm:1.3.42":
- version: 1.3.42
- resolution: "@swc/core-win32-arm64-msvc@npm:1.3.42"
+"@swc/core-win32-arm64-msvc@npm:1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core-win32-arm64-msvc@npm:1.3.46"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-win32-ia32-msvc@npm:1.3.42":
- version: 1.3.42
- resolution: "@swc/core-win32-ia32-msvc@npm:1.3.42"
+"@swc/core-win32-ia32-msvc@npm:1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core-win32-ia32-msvc@npm:1.3.46"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@swc/core-win32-x64-msvc@npm:1.3.42":
- version: 1.3.42
- resolution: "@swc/core-win32-x64-msvc@npm:1.3.42"
+"@swc/core-win32-x64-msvc@npm:1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core-win32-x64-msvc@npm:1.3.46"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
-"@swc/core@npm:^1.3.36":
- version: 1.3.42
- resolution: "@swc/core@npm:1.3.42"
+"@swc/core@npm:^1.3.46":
+ version: 1.3.46
+ resolution: "@swc/core@npm:1.3.46"
dependencies:
- "@swc/core-darwin-arm64": 1.3.42
- "@swc/core-darwin-x64": 1.3.42
- "@swc/core-linux-arm-gnueabihf": 1.3.42
- "@swc/core-linux-arm64-gnu": 1.3.42
- "@swc/core-linux-arm64-musl": 1.3.42
- "@swc/core-linux-x64-gnu": 1.3.42
- "@swc/core-linux-x64-musl": 1.3.42
- "@swc/core-win32-arm64-msvc": 1.3.42
- "@swc/core-win32-ia32-msvc": 1.3.42
- "@swc/core-win32-x64-msvc": 1.3.42
+ "@swc/core-darwin-arm64": 1.3.46
+ "@swc/core-darwin-x64": 1.3.46
+ "@swc/core-linux-arm-gnueabihf": 1.3.46
+ "@swc/core-linux-arm64-gnu": 1.3.46
+ "@swc/core-linux-arm64-musl": 1.3.46
+ "@swc/core-linux-x64-gnu": 1.3.46
+ "@swc/core-linux-x64-musl": 1.3.46
+ "@swc/core-win32-arm64-msvc": 1.3.46
+ "@swc/core-win32-ia32-msvc": 1.3.46
+ "@swc/core-win32-x64-msvc": 1.3.46
+ peerDependencies:
+ "@swc/helpers": ^0.5.0
dependenciesMeta:
"@swc/core-darwin-arm64":
optional: true
@@ -2729,7 +2731,7 @@ __metadata:
optional: true
"@swc/core-win32-x64-msvc":
optional: true
- checksum: 5c28c03ee6a4e1f630c4a519b56d7e23a0102f70fad977a3ab144a3da96231cf4849e473cdc9ee7be6b9266ba0838d0bc0b6b3575a75540f302befe96cc9606e
+ checksum: bd1773bf9e7940b540d4f7a36bf109594562fcca338ec60d5a95bd1bc9fc2e3e632351c3c9cf803f6947bf7ebc200e5260d034c49db8d28689d96d031e2836b1
languageName: node
linkType: hard
@@ -3732,7 +3734,7 @@ __metadata:
"@docusaurus/plugin-client-redirects": ^2.3.1
"@docusaurus/preset-classic": 2.4.0
"@spotify/prettier-config": ^14.0.0
- "@swc/core": ^1.3.36
+ "@swc/core": ^1.3.46
"@tsconfig/docusaurus": ^1.0.6
"@types/webpack-env": ^1.18.0
clsx: ^1.1.1
diff --git a/mkdocs.yml b/mkdocs.yml
index 4b5c2cf7a2..4a75c3f67f 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -6,6 +6,7 @@ edit_uri: edit/master/docs
plugins:
- techdocs-core
+# For sidebar navigation on https://backstage.io/, see `microsite/sidebars.json`
nav:
- Overview:
- What is Backstage?: 'overview/what-is-backstage.md'
diff --git a/package.json b/package.json
index e6f04eac95..5bf140d66b 100644
--- a/package.json
+++ b/package.json
@@ -47,7 +47,7 @@
"@types/react": "^17",
"@types/react-dom": "^17"
},
- "version": "1.13.0-next.2",
+ "version": "1.13.0-next.3",
"dependencies": {
"@backstage/errors": "workspace:^",
"@manypkg/get-packages": "^1.1.3"
diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md
index b33264451c..e8ad84d5d7 100644
--- a/packages/app-defaults/CHANGELOG.md
+++ b/packages/app-defaults/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/app-defaults
+## 1.3.0-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.7.0-next.3
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-permission-react@0.4.12-next.1
+
## 1.3.0-next.2
### Patch Changes
diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json
index 08b726cbbe..b8bbec2227 100644
--- a/packages/app-defaults/package.json
+++ b/packages/app-defaults/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/app-defaults",
"description": "Provides the default wiring of a Backstage App",
- "version": "1.3.0-next.2",
+ "version": "1.3.0-next.3",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index 3cc4aa0190..2cfd48a509 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,74 @@
# example-app
+## 0.2.82-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-kubernetes@0.8.0-next.3
+ - @backstage/plugin-scaffolder@1.13.0-next.3
+ - @backstage/cli@0.22.6-next.3
+ - @backstage/plugin-explore@0.4.2-next.3
+ - @backstage/plugin-catalog-react@1.5.0-next.3
+ - @backstage/plugin-scaffolder-react@1.3.0-next.3
+ - @backstage/core-app-api@1.7.0-next.3
+ - @backstage/catalog-model@1.3.0-next.0
+ - @backstage/plugin-techdocs@1.6.1-next.3
+ - @backstage/core-components@0.13.0-next.3
+ - @backstage/app-defaults@1.3.0-next.3
+ - @backstage/config@1.0.7
+ - @backstage/core-plugin-api@1.5.1-next.1
+ - @backstage/integration-react@1.1.12-next.3
+ - @backstage/theme@0.2.19-next.0
+ - @backstage/plugin-airbrake@0.3.17-next.3
+ - @backstage/plugin-apache-airflow@0.2.10-next.3
+ - @backstage/plugin-api-docs@0.9.2-next.3
+ - @backstage/plugin-azure-devops@0.2.8-next.3
+ - @backstage/plugin-azure-sites@0.1.6-next.3
+ - @backstage/plugin-badges@0.2.41-next.3
+ - @backstage/plugin-catalog-common@1.0.13-next.1
+ - @backstage/plugin-catalog-graph@0.2.29-next.3
+ - @backstage/plugin-catalog-import@0.9.7-next.3
+ - @backstage/plugin-circleci@0.3.17-next.3
+ - @backstage/plugin-cloudbuild@0.3.17-next.3
+ - @backstage/plugin-code-coverage@0.2.10-next.3
+ - @backstage/plugin-cost-insights@0.12.6-next.3
+ - @backstage/plugin-dynatrace@4.0.0-next.3
+ - @backstage/plugin-entity-feedback@0.2.0-next.3
+ - @backstage/plugin-gcalendar@0.3.13-next.3
+ - @backstage/plugin-gcp-projects@0.3.36-next.3
+ - @backstage/plugin-github-actions@0.5.17-next.3
+ - @backstage/plugin-gocd@0.1.23-next.3
+ - @backstage/plugin-graphiql@0.2.49-next.3
+ - @backstage/plugin-home@0.4.33-next.3
+ - @backstage/plugin-jenkins@0.7.16-next.3
+ - @backstage/plugin-kafka@0.3.17-next.3
+ - @backstage/plugin-lighthouse@0.4.2-next.3
+ - @backstage/plugin-linguist@0.1.2-next.3
+ - @backstage/plugin-linguist-common@0.1.0
+ - @backstage/plugin-microsoft-calendar@0.1.2-next.3
+ - @backstage/plugin-newrelic@0.3.35-next.3
+ - @backstage/plugin-newrelic-dashboard@0.2.10-next.3
+ - @backstage/plugin-org@0.6.7-next.3
+ - @backstage/plugin-pagerduty@0.5.10-next.3
+ - @backstage/plugin-permission-react@0.4.12-next.1
+ - @backstage/plugin-playlist@0.1.8-next.3
+ - @backstage/plugin-rollbar@0.4.17-next.3
+ - @backstage/plugin-search@1.2.0-next.3
+ - @backstage/plugin-search-common@1.2.3-next.0
+ - @backstage/plugin-search-react@1.5.2-next.3
+ - @backstage/plugin-sentry@0.5.2-next.3
+ - @backstage/plugin-shortcuts@0.3.9-next.3
+ - @backstage/plugin-stack-overflow@0.1.13-next.3
+ - @backstage/plugin-stackstorm@0.1.1-next.3
+ - @backstage/plugin-tech-insights@0.3.9-next.3
+ - @backstage/plugin-tech-radar@0.6.3-next.3
+ - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.3
+ - @backstage/plugin-techdocs-react@1.1.5-next.3
+ - @backstage/plugin-todo@0.2.19-next.3
+ - @backstage/plugin-user-settings@0.7.2-next.3
+ - @internal/plugin-catalog-customized@0.0.9-next.3
+
## 0.2.82-next.2
### Patch Changes
diff --git a/packages/app/package.json b/packages/app/package.json
index 155f33250a..b9f64ddd75 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,6 +1,6 @@
{
"name": "example-app",
- "version": "0.2.82-next.2",
+ "version": "0.2.82-next.3",
"private": true,
"backstage": {
"role": "frontend"
diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md
index d325959c18..bb2599b189 100644
--- a/packages/backend-next/CHANGELOG.md
+++ b/packages/backend-next/CHANGELOG.md
@@ -1,5 +1,27 @@
# example-backend-next
+## 0.0.10-next.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-kubernetes-backend@0.10.0-next.3
+ - @backstage/plugin-catalog-backend@1.9.0-next.3
+ - @backstage/plugin-scaffolder-backend@1.13.0-next.3
+ - @backstage/backend-defaults@0.1.9-next.2
+ - @backstage/plugin-app-backend@0.3.44-next.2
+ - @backstage/plugin-auth-node@0.2.13-next.2
+ - @backstage/plugin-permission-backend@0.5.19-next.2
+ - @backstage/plugin-permission-common@0.7.5-next.0
+ - @backstage/plugin-permission-node@0.7.7-next.2
+ - @backstage/plugin-search-backend@1.3.0-next.2
+ - @backstage/plugin-search-backend-module-catalog@0.1.0-next.2
+ - @backstage/plugin-search-backend-module-explore@0.1.0-next.1
+ - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.2
+ - @backstage/plugin-search-backend-node@1.2.0-next.2
+ - @backstage/plugin-techdocs-backend@1.6.1-next.3
+ - @backstage/plugin-todo-backend@0.1.41-next.3
+
## 0.0.10-next.2
### Patch Changes
diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json
index 9ad6d2f7a1..f8b1e4138f 100644
--- a/packages/backend-next/package.json
+++ b/packages/backend-next/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend-next",
- "version": "0.0.10-next.2",
+ "version": "0.0.10-next.3",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/packages/backend-openapi-utils/.eslintrc.js b/packages/backend-openapi-utils/.eslintrc.js
new file mode 100644
index 0000000000..e2a53a6ad2
--- /dev/null
+++ b/packages/backend-openapi-utils/.eslintrc.js
@@ -0,0 +1 @@
+module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md
new file mode 100644
index 0000000000..9887ddf8d5
--- /dev/null
+++ b/packages/backend-openapi-utils/CHANGELOG.md
@@ -0,0 +1,7 @@
+# @backstage/backend-openapi-utils
+
+## 0.0.1-next.0
+
+### Patch Changes
+
+- 62fe726fdc5: New plugin! Primary focus is to support types on `Router`s in backend packages. Developers can use the `ApiRouter` from this package in their packages to support a typed experience based on their OpenAPI specs. The `ApiRouter` supports request bodies, response bodies, query parameters and path parameters, as well as full path-based context of the above. This means no more guessing on an endpoint like `req.post('/not-my-route', (req, res)=>{res.send(req.body.badparam)})`. Typescript would catch `/not-my-route`, `req.body.badparam`, `res.send(req.body.badparam)`.
diff --git a/packages/backend-openapi-utils/README.md b/packages/backend-openapi-utils/README.md
new file mode 100644
index 0000000000..51455ccccb
--- /dev/null
+++ b/packages/backend-openapi-utils/README.md
@@ -0,0 +1,45 @@
+# @backstage/openapi-utils
+
+## Summary
+
+This package is meant to provide a typed Express router for an OpenAPI spec. Based on the [`oatx`](https://github.com/varanauskas/oatx) library and adapted to override Express values.
+
+## Getting Started
+
+### Configuration
+
+1. Run `yarn --cwd backstage-cli package schema:openapi:generate` to translate your `src/schema/openapi.yaml` to a new Typescript file in `src/schema/openapi.ts`. In the case of projects that require linting + a license header, you will need to do this manually.
+
+2. In your plugin's `src/service/createRouter.ts`,
+
+```ts
+import {ApiRouter} from `@backstage/backend-openapi-utils`;
+import spec from '../schema/openapi'
+...
+
+export function createRouter(){
+ const router = Router() as ApiRouter;
+ ...
+}
+```
+
+### Limitations
+
+1. `as const` makes all fields `readonly`
+ To ensure a good DX of using a simple imported JSON spec, we want to remove any type issues between `readonly` arrays and mutable arrays. Typescript does not allow them to be compared, so converting all imports from the `openapi3-ts` library to `readonly` is important. This is achieved through the `ImmutableObject` type in `types/immutable.ts`.
+
+```ts
+...
+// We want an interface like this,
+Router() as ApiRouter
+
+// Not an interface like this,
+Router() as ApiRouter>
+...
+```
+
+## Future Work
+
+### Runtime validation
+
+Using a package like [`express-openapi-validator`](https://www.npmjs.com/package/express-openapi-validator), would allow us to remove [validation of request bodies with `AJV`](https://github.com/backstage/backstage/blob/master/plugins/catalog-backend/src/service/util.ts#L58). However, `AJV` currently doesn't have support for OpenAPI 3.1 and `express-openapi-validator` enforces full URL matching for paths, meaning it cannot be mounted at the router level.
diff --git a/packages/backend-openapi-utils/api-report.md b/packages/backend-openapi-utils/api-report.md
new file mode 100644
index 0000000000..180a7846ed
--- /dev/null
+++ b/packages/backend-openapi-utils/api-report.md
@@ -0,0 +1,644 @@
+## API Report File for "@backstage/backend-openapi-utils"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+import type { ContentObject } from 'openapi3-ts';
+import type core from 'express-serve-static-core';
+import { FromSchema } from 'json-schema-to-ts';
+import { JSONSchema7 } from 'json-schema-to-ts';
+import type { OpenAPIObject } from 'openapi3-ts';
+import type { ParameterObject } from 'openapi3-ts';
+import type { ReferenceObject } from 'openapi3-ts';
+import type { RequestBodyObject } from 'openapi3-ts';
+import type { ResponseObject } from 'openapi3-ts';
+import { Router } from 'express';
+import type { SchemaObject } from 'openapi3-ts';
+
+// @public
+export interface ApiRouter extends Router {
+ // (undocumented)
+ all: DocRequestMatcher;
+ // (undocumented)
+ delete: DocRequestMatcher;
+ // (undocumented)
+ get: DocRequestMatcher;
+ // (undocumented)
+ head: DocRequestMatcher;
+ // (undocumented)
+ options: DocRequestMatcher;
+ // (undocumented)
+ patch: DocRequestMatcher;
+ // (undocumented)
+ post: DocRequestMatcher;
+ // (undocumented)
+ put: DocRequestMatcher;
+}
+
+// @public (undocumented)
+type ComponentRef<
+ Doc extends RequiredDoc,
+ Type extends ComponentTypes,
+ Ref extends ImmutableReferenceObject,
+> = Ref extends {
+ $ref: `#/components/${Type}/${infer Name}`;
+}
+ ? Name extends keyof Doc['components'][Type]
+ ? Doc['components'][Type][Name] extends ImmutableReferenceObject
+ ? ComponentRef
+ : Doc['components'][Type][Name]
+ : never
+ : never;
+
+// @public (undocumented)
+type ComponentTypes = Extract<
+ keyof Doc['components'],
+ string
+>;
+
+// @public (undocumented)
+type ConvertAll = []> = T extends [
+ infer First extends JSONSchema7,
+ ...infer Rest,
+]
+ ? ConvertAll]>
+ : R;
+
+// @public (undocumented)
+interface CookieObject extends ParameterObject {
+ // (undocumented)
+ in: 'cookie';
+ // (undocumented)
+ style?: 'form';
+}
+
+// @public (undocumented)
+type CookieSchema<
+ Doc extends RequiredDoc,
+ Path extends PathTemplate>,
+ Method extends DocPathMethod,
+> = ParametersSchema, Method, ImmutableCookieObject>;
+
+// @public (undocumented)
+type DiscriminateUnion = Extract<
+ T,
+ Record
+>;
+
+// @public (undocumented)
+type DocOperation<
+ Doc extends RequiredDoc,
+ Path extends keyof Doc['paths'],
+ Method extends keyof Doc['paths'][Path],
+> = Doc['paths'][Path][Method];
+
+// @public (undocumented)
+type DocParameter<
+ Doc extends RequiredDoc,
+ Path extends Extract,
+ Method extends keyof Doc['paths'][Path],
+ Parameter extends keyof Doc['paths'][Path][Method]['parameters'],
+> = DocOperation<
+ Doc,
+ Path,
+ Method
+>['parameters'][Parameter] extends ImmutableReferenceObject
+ ? 'parameters' extends ComponentTypes
+ ? ComponentRef<
+ Doc,
+ 'parameters',
+ DocOperation['parameters'][Parameter]
+ >
+ : never
+ : DocOperation['parameters'][Parameter];
+
+// @public (undocumented)
+type DocParameters<
+ Doc extends RequiredDoc,
+ Path extends Extract,
+ Method extends keyof Doc['paths'][Path],
+> = DocOperation['parameters'] extends ReadonlyArray
+ ? {
+ [Index in keyof DocOperation<
+ Doc,
+ Path,
+ Method
+ >['parameters']]: DocParameter;
+ }
+ : never;
+
+// @public
+type DocPath<
+ Doc extends PathDoc,
+ Path extends PathTemplate>,
+> = ValueOf<{
+ [Template in Extract<
+ keyof Doc['paths'],
+ string
+ >]: Path extends PathTemplate ? Template : never;
+}>;
+
+// @public (undocumented)
+type DocPathMethod<
+ Doc extends Pick,
+ Path extends DocPathTemplate,
+> = keyof Doc['paths'][DocPath];
+
+// @public (undocumented)
+type DocPathTemplate = PathTemplate<
+ Extract
+>;
+
+// @public
+type DocRequestHandler<
+ Doc extends RequiredDoc,
+ Path extends DocPathTemplate,
+ Method extends keyof Doc['paths'][Path],
+> = core.RequestHandler<
+ PathSchema,
+ ResponseBodyToJsonSchema,
+ RequestBodyToJsonSchema,
+ QuerySchema,
+ Record
+>;
+
+// @public
+type DocRequestHandlerParams<
+ Doc extends RequiredDoc,
+ Path extends DocPathTemplate,
+ Method extends keyof Doc['paths'][Path],
+> = core.RequestHandlerParams<
+ PathSchema,
+ ResponseBodyToJsonSchema,
+ RequestBodyToJsonSchema,
+ QuerySchema,
+ Record
+>;
+
+// @public
+interface DocRequestMatcher<
+ Doc extends RequiredDoc,
+ T,
+ Method extends
+ | 'all'
+ | 'get'
+ | 'post'
+ | 'put'
+ | 'delete'
+ | 'patch'
+ | 'options'
+ | 'head',
+> {
+ // (undocumented)
+ , Method>>(
+ path: Path,
+ ...handlers: Array>
+ ): T;
+ // (undocumented)
+ , Method>>(
+ path: Path,
+ ...handlers: Array>
+ ): T;
+}
+
+// @public (undocumented)
+type Filter = T extends U ? T : never;
+
+// @public (undocumented)
+type FullMap<
+ T extends {
+ [key: string]: any;
+ },
+> = RequiredMap & OptionalMap;
+
+// @public (undocumented)
+interface HeaderObject extends ParameterObject {
+ // (undocumented)
+ in: 'header';
+ // (undocumented)
+ style: 'simple';
+}
+
+// @public (undocumented)
+type HeaderSchema<
+ Doc extends RequiredDoc,
+ Path extends PathTemplate>,
+ Method extends DocPathMethod,
+> = ParametersSchema, Method, ImmutableHeaderObject>;
+
+// @public
+type Immutable = T extends
+ | Function
+ | boolean
+ | number
+ | string
+ | null
+ | undefined
+ ? T
+ : T extends Map
+ ? ReadonlyMap, Immutable>
+ : T extends Set
+ ? ReadonlySet>
+ : {
+ readonly [P in keyof T]: Immutable;
+ };
+
+// @public (undocumented)
+type ImmutableContentObject = ImmutableObject;
+
+// @public (undocumented)
+type ImmutableCookieObject = ImmutableObject;
+
+// @public (undocumented)
+type ImmutableHeaderObject = ImmutableObject;
+
+// @public (undocumented)
+type ImmutableObject = {
+ readonly [K in keyof T]: Immutable;
+};
+
+// @public (undocumented)
+type ImmutableOpenAPIObject = ImmutableObject;
+
+// @public (undocumented)
+type ImmutableParameterObject = ImmutableObject;
+
+// @public (undocumented)
+type ImmutablePathObject = ImmutableObject;
+
+// @public (undocumented)
+type ImmutableQueryObject = ImmutableObject;
+
+// @public (undocumented)
+type ImmutableReferenceObject = ImmutableObject;
+
+// @public (undocumented)
+type ImmutableRequestBodyObject = ImmutableObject;
+
+// @public (undocumented)
+type ImmutableResponseObject = ImmutableObject;
+
+// @public (undocumented)
+type ImmutableSchemaObject = ImmutableObject;
+
+declare namespace internal {
+ export {
+ RequiredDoc,
+ PathDoc,
+ ValueOf,
+ PathTemplate,
+ DocPath,
+ DocPathTemplate,
+ DocPathMethod,
+ MethodAwareDocPath,
+ DocOperation,
+ ComponentTypes,
+ ComponentRef,
+ SchemaRef,
+ ObjectWithContentSchema,
+ UnionToIntersection,
+ LastOf,
+ Push,
+ TuplifyUnion,
+ ConvertAll,
+ UnknownIfNever,
+ ToTypeSafe,
+ DiscriminateUnion,
+ MapDiscriminatedUnion,
+ PickOptionalKeys,
+ PickRequiredKeys,
+ OptionalMap,
+ RequiredMap,
+ FullMap,
+ Filter,
+ DocRequestHandler,
+ DocRequestHandlerParams,
+ DocRequestMatcher,
+ Immutable,
+ ImmutableObject,
+ ImmutableReferenceObject,
+ ImmutableOpenAPIObject,
+ ImmutableContentObject,
+ ImmutableRequestBodyObject,
+ ImmutableResponseObject,
+ ImmutableParameterObject,
+ HeaderObject,
+ ImmutableHeaderObject,
+ CookieObject,
+ ImmutableCookieObject,
+ QueryObject,
+ ImmutableQueryObject,
+ PathObject,
+ ImmutablePathObject,
+ ImmutableSchemaObject,
+ DocParameter,
+ DocParameters,
+ ResolveDocParameterSchema,
+ ParameterSchema,
+ MapToSchema,
+ ParametersSchema,
+ HeaderSchema,
+ CookieSchema,
+ PathSchema,
+ QuerySchema,
+ RequestBody,
+ RequestBodySchema,
+ RequestBodyToJsonSchema,
+ Response_2 as Response,
+ ResponseSchemas,
+ ResponseBodyToJsonSchema,
+ };
+}
+export { internal };
+
+// @public (undocumented)
+type LastOf = UnionToIntersection<
+ T extends any ? () => T : never
+> extends () => infer R
+ ? R
+ : never;
+
+// @public (undocumented)
+type MapDiscriminatedUnion, K extends keyof T> = {
+ [V in T[K]]: DiscriminateUnion;
+};
+
+// @public (undocumented)
+type MapToSchema<
+ Doc extends RequiredDoc,
+ T extends Record,
+> = {
+ [V in keyof T]: NonNullable extends ImmutableParameterObject
+ ? ParameterSchema['schema']>
+ : never;
+};
+
+// @public (undocumented)
+type MethodAwareDocPath<
+ Doc extends PathDoc,
+ Path extends PathTemplate>,
+ Method extends keyof Doc['paths'][Path],
+> = ValueOf<{
+ [Template in Extract<
+ keyof Doc['paths'],
+ string
+ >]: Path extends PathTemplate
+ ? Method extends DocPathMethod
+ ? PathTemplate
+ : never
+ : never;
+}>;
+
+// @public (undocumented)
+type ObjectWithContentSchema<
+ Doc extends RequiredDoc,
+ Object extends {
+ content?: ImmutableContentObject;
+ },
+> = Object['content'] extends ImmutableContentObject
+ ? SchemaRef
+ : never;
+
+// @public (undocumented)
+type OptionalMap<
+ T extends {
+ [key: string]: any;
+ },
+> = {
+ [P in Exclude, undefined>]?: NonNullable;
+};
+
+// @public (undocumented)
+type ParameterSchema<
+ Doc extends RequiredDoc,
+ Schema extends ImmutableParameterObject['schema'],
+> = ResolveDocParameterSchema extends infer R
+ ? R extends ImmutableSchemaObject
+ ? R extends JSONSchema7
+ ? FromSchema
+ : never
+ : never
+ : never;
+
+// @public (undocumented)
+type ParametersSchema<
+ Doc extends RequiredDoc,
+ Path extends Extract,
+ Method extends keyof Doc['paths'][Path],
+ FilterType extends ImmutableParameterObject,
+> = number extends keyof DocParameters
+ ? MapToSchema<
+ Doc,
+ FullMap<
+ MapDiscriminatedUnion<
+ Filter[number], FilterType>,
+ 'name'
+ >
+ >
+ >
+ : never;
+
+// @public (undocumented)
+type PathDoc = Pick;
+
+// @public (undocumented)
+interface PathObject extends ParameterObject {
+ // (undocumented)
+ in: 'path';
+ // (undocumented)
+ style?: 'simple' | 'label' | 'matrix';
+}
+
+// @public (undocumented)
+type PathSchema<
+ Doc extends RequiredDoc,
+ Path extends PathTemplate>,
+ Method extends DocPathMethod,
+> = ParametersSchema, Method, ImmutablePathObject>;
+
+// @public
+type PathTemplate =
+ Path extends `${infer Prefix}{${infer PathName}}${infer Suffix}`
+ ? `${Prefix}:${PathName}${PathTemplate}`
+ : Path;
+
+// @public (undocumented)
+type PickOptionalKeys<
+ T extends {
+ [key: string]: any;
+ },
+> = {
+ [K in keyof T]: true extends T[K]['required'] ? never : K;
+}[keyof T];
+
+// @public (undocumented)
+type PickRequiredKeys<
+ T extends {
+ [key: string]: any;
+ },
+> = {
+ [K in keyof T]: true extends T[K]['required'] ? K : never;
+}[keyof T];
+
+// @public (undocumented)
+type Push = [...T, V];
+
+// @public (undocumented)
+interface QueryObject extends ParameterObject {
+ // (undocumented)
+ in: 'query';
+ // (undocumented)
+ style?: 'form' | 'deepObject' | 'pipeDelimited' | 'spaceDelimited';
+}
+
+// @public (undocumented)
+type QuerySchema<
+ Doc extends RequiredDoc,
+ Path extends PathTemplate>,
+ Method extends DocPathMethod,
+> = ParametersSchema, Method, ImmutableQueryObject>;
+
+// @public (undocumented)
+type RequestBody<
+ Doc extends RequiredDoc,
+ Path extends Extract,
+ Method extends keyof Doc['paths'][Path],
+> = DocOperation<
+ Doc,
+ Path,
+ Method
+>['requestBody'] extends ImmutableReferenceObject
+ ? 'requestBodies' extends ComponentTypes
+ ? ComponentRef<
+ Doc,
+ 'requestBodies',
+ DocOperation['requestBody']
+ >
+ : never
+ : DocOperation['requestBody'];
+
+// @public (undocumented)
+type RequestBodySchema<
+ Doc extends RequiredDoc,
+ Path extends DocPathTemplate,
+ Method extends DocPathMethod,
+> = RequestBody<
+ Doc,
+ DocPath,
+ Method
+> extends ImmutableRequestBodyObject
+ ? ObjectWithContentSchema, Method>>
+ : never;
+
+// @public
+type RequestBodyToJsonSchema<
+ Doc extends RequiredDoc,
+ Path extends PathTemplate>,
+ Method extends DocPathMethod,
+> = ToTypeSafe>;
+
+// @public
+type RequiredDoc = Pick;
+
+// @public (undocumented)
+type RequiredMap<
+ T extends {
+ [key: string]: any;
+ },
+> = {
+ [P in Exclude, undefined>]: NonNullable;
+};
+
+// @public (undocumented)
+type ResolveDocParameterSchema<
+ Doc extends RequiredDoc,
+ Schema extends ImmutableParameterObject['schema'],
+> = Schema extends ImmutableReferenceObject
+ ? 'parameters' extends ComponentTypes
+ ? ComponentRef
+ : never
+ : Schema;
+
+// @public (undocumented)
+type Response_2<
+ Doc extends RequiredDoc,
+ Path extends keyof Doc['paths'],
+ Method extends keyof Doc['paths'][Path],
+ StatusCode extends keyof DocOperation['responses'],
+> = DocOperation<
+ Doc,
+ Path,
+ Method
+>['responses'][StatusCode] extends ImmutableReferenceObject
+ ? 'responses' extends ComponentTypes
+ ? ComponentRef<
+ Doc,
+ 'responses',
+ DocOperation['responses'][StatusCode]
+ >
+ : never
+ : DocOperation['responses'][StatusCode];
+
+// @public
+type ResponseBodyToJsonSchema<
+ Doc extends RequiredDoc,
+ Path extends PathTemplate>,
+ Method extends DocPathMethod,
+> = ToTypeSafe>>;
+
+// @public (undocumented)
+type ResponseSchemas<
+ Doc extends RequiredDoc,
+ Path extends DocPathTemplate,
+ Method extends DocPathMethod,
+> = {
+ [StatusCode in keyof DocOperation<
+ Doc,
+ Path,
+ Method
+ >['responses']]: Response_2<
+ Doc,
+ Path,
+ Method,
+ StatusCode
+ > extends ImmutableResponseObject
+ ? ObjectWithContentSchema>
+ : never;
+};
+
+// @public (undocumented)
+type SchemaRef = Schema extends {
+ $ref: `#/components/schemas/${infer Name}`;
+}
+ ? 'schemas' extends keyof Doc['components']
+ ? Name extends keyof Doc['components']['schemas']
+ ? SchemaRef
+ : never
+ : never
+ : {
+ [Key in keyof Schema]: SchemaRef;
+ };
+
+// @public (undocumented)
+type ToTypeSafe = UnknownIfNever>[number]>;
+
+// @public (undocumented)
+type TuplifyUnion<
+ T,
+ L = LastOf,
+ N = [T] extends [never] ? true : false,
+> = true extends N ? [] : Push>, L>;
+
+// @public
+type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (
+ k: infer I,
+) => void
+ ? I
+ : never;
+
+// @public (undocumented)
+type UnknownIfNever = [P] extends [never] ? unknown : P;
+
+// @public
+type ValueOf = T[keyof T];
+```
diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json
new file mode 100644
index 0000000000..0e2e707083
--- /dev/null
+++ b/packages/backend-openapi-utils/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "@backstage/backend-openapi-utils",
+ "description": "OpenAPI typescript support.",
+ "version": "0.0.1-next.0",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.cjs.js",
+ "module": "dist/index.esm.js",
+ "types": "dist/index.d.ts"
+ },
+ "backstage": {
+ "role": "node-library"
+ },
+ "scripts": {
+ "start": "backstage-cli package start",
+ "build": "backstage-cli package build",
+ "lint": "backstage-cli package lint",
+ "test": "backstage-cli package test",
+ "clean": "backstage-cli package clean",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack"
+ },
+ "devDependencies": {
+ "@backstage/cli": "workspace:^"
+ },
+ "files": [
+ "dist"
+ ],
+ "dependencies": {
+ "@types/express": "^4.17.6",
+ "@types/express-serve-static-core": "^4.17.5",
+ "express": "^4.17.1",
+ "express-promise-router": "^4.1.0",
+ "json-schema-to-ts": "^2.6.2",
+ "openapi3-ts": "^3.1.2"
+ }
+}
diff --git a/packages/backend-openapi-utils/src/index.ts b/packages/backend-openapi-utils/src/index.ts
new file mode 100644
index 0000000000..f8fdcff16b
--- /dev/null
+++ b/packages/backend-openapi-utils/src/index.ts
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Common functionalities for the openapi-router plugin.
+ *
+ * @packageDocumentation
+ */
+import * as internal from './types';
+
+export { internal };
+export type { ApiRouter } from './router';
diff --git a/packages/backend-openapi-utils/src/router.ts b/packages/backend-openapi-utils/src/router.ts
new file mode 100644
index 0000000000..253fc1596e
--- /dev/null
+++ b/packages/backend-openapi-utils/src/router.ts
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Router } from 'express';
+import { DocRequestMatcher, RequiredDoc } from './types';
+
+/**
+ * Typed Express router based on an OpenAPI 3.1 spec.
+ * @public
+ */
+export interface ApiRouter extends Router {
+ get: DocRequestMatcher;
+
+ post: DocRequestMatcher;
+
+ all: DocRequestMatcher;
+
+ put: DocRequestMatcher;
+
+ delete: DocRequestMatcher;
+
+ patch: DocRequestMatcher;
+
+ options: DocRequestMatcher;
+
+ head: DocRequestMatcher;
+}
diff --git a/packages/backend-openapi-utils/src/setupTests.ts b/packages/backend-openapi-utils/src/setupTests.ts
new file mode 100644
index 0000000000..4b9026cde5
--- /dev/null
+++ b/packages/backend-openapi-utils/src/setupTests.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export {};
diff --git a/packages/backend-openapi-utils/src/types/common.ts b/packages/backend-openapi-utils/src/types/common.ts
new file mode 100644
index 0000000000..5568ed795c
--- /dev/null
+++ b/packages/backend-openapi-utils/src/types/common.ts
@@ -0,0 +1,286 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Pulled from https://github.com/varanauskas/oatx.
+ */
+
+import { FromSchema, JSONSchema7 } from 'json-schema-to-ts';
+import {
+ ImmutableContentObject,
+ ImmutableOpenAPIObject,
+ ImmutableReferenceObject,
+} from './immutable';
+
+/**
+ * Basic OpenAPI spec with paths and components properties enforced.
+ * @public
+ */
+export type RequiredDoc = Pick;
+
+/**
+ * @public
+ */
+export type PathDoc = Pick;
+
+/**
+ * Get value types of `T`.
+ * @public
+ */
+export type ValueOf = T[keyof T];
+
+/**
+ * Validate a string against OpenAPI path template, {@link https://spec.openapis.org/oas/v3.1.0#path-templating-matching}.
+ *
+ * @example
+ * ```ts
+ * const path: PathTemplate<"/posts/{postId}/comments/{commentId}"> = "/posts/:postId/comments/:commentId";
+ * const pathWithoutParams: PathTemplate<"/posts/comments"> = "/posts/comments";
+ * ```
+ *
+ * @public
+ */
+export type PathTemplate =
+ Path extends `${infer Prefix}{${infer PathName}}${infer Suffix}`
+ ? `${Prefix}:${PathName}${PathTemplate}`
+ : Path;
+
+/**
+ * Extract path as specified in OpenAPI `Doc` based on request path
+ * @example
+ * ```ts
+ * const spec = {
+ * paths: {
+ * "/posts/{postId}/comments/{commentId}": {},
+ * "/posts/comments": {},
+ * }
+ * };
+ * const specPathWithParams: DocPath = "/posts/{postId}/comments/{commentId}";
+ * const specPathWithoutParams: DocPath = "/posts/comments";
+ * ```
+ *
+ * @public
+ */
+export type DocPath<
+ Doc extends PathDoc,
+ Path extends PathTemplate>,
+> = ValueOf<{
+ [Template in Extract<
+ keyof Doc['paths'],
+ string
+ >]: Path extends PathTemplate ? Template : never;
+}>;
+
+/**
+ * @public
+ */
+export type DocPathTemplate = PathTemplate<
+ Extract
+>;
+
+/**
+ * @public
+ */
+export type DocPathMethod<
+ Doc extends Pick,
+ Path extends DocPathTemplate,
+> = keyof Doc['paths'][DocPath];
+
+/**
+ * @public
+ */
+export type MethodAwareDocPath<
+ Doc extends PathDoc,
+ Path extends PathTemplate>,
+ Method extends keyof Doc['paths'][Path],
+> = ValueOf<{
+ [Template in Extract<
+ keyof Doc['paths'],
+ string
+ >]: Path extends PathTemplate
+ ? Method extends DocPathMethod
+ ? PathTemplate
+ : never
+ : never;
+}>;
+
+/**
+ * @public
+ */
+export type DocOperation<
+ Doc extends RequiredDoc,
+ Path extends keyof Doc['paths'],
+ Method extends keyof Doc['paths'][Path],
+> = Doc['paths'][Path][Method];
+
+/**
+ * @public
+ */
+export type ComponentTypes = Extract<
+ keyof Doc['components'],
+ string
+>;
+
+/**
+ * @public
+ */
+export type ComponentRef<
+ Doc extends RequiredDoc,
+ Type extends ComponentTypes,
+ Ref extends ImmutableReferenceObject,
+> = Ref extends { $ref: `#/components/${Type}/${infer Name}` }
+ ? Name extends keyof Doc['components'][Type]
+ ? Doc['components'][Type][Name] extends ImmutableReferenceObject
+ ? ComponentRef
+ : Doc['components'][Type][Name]
+ : never
+ : never;
+
+/**
+ * @public
+ */
+export type SchemaRef = Schema extends {
+ $ref: `#/components/schemas/${infer Name}`;
+}
+ ? 'schemas' extends keyof Doc['components']
+ ? Name extends keyof Doc['components']['schemas']
+ ? SchemaRef
+ : never
+ : never
+ : { [Key in keyof Schema]: SchemaRef };
+
+/**
+ * @public
+ */
+export type ObjectWithContentSchema<
+ Doc extends RequiredDoc,
+ Object extends { content?: ImmutableContentObject },
+> = Object['content'] extends ImmutableContentObject
+ ? SchemaRef
+ : never;
+
+/**
+ * From {@link https://stackoverflow.com/questions/71393738/typescript-intersection-not-union-type-from-json-schema}
+ *
+ * StackOverflow says not to do this, but union types aren't possible any other way.
+ *
+ * @public
+ */
+export type UnionToIntersection = (
+ U extends any ? (k: U) => void : never
+) extends (k: infer I) => void
+ ? I
+ : never;
+
+/**
+ * @public
+ */
+export type LastOf = UnionToIntersection<
+ T extends any ? () => T : never
+> extends () => infer R
+ ? R
+ : never;
+
+/**
+ * @public
+ */
+export type Push = [...T, V];
+
+/**
+ * @public
+ */
+export type TuplifyUnion<
+ T,
+ L = LastOf,
+ N = [T] extends [never] ? true : false,
+> = true extends N ? [] : Push>, L>;
+
+/**
+ * @public
+ */
+export type ConvertAll = []> = T extends [
+ infer First extends JSONSchema7,
+ ...infer Rest,
+]
+ ? ConvertAll]>
+ : R;
+
+/**
+ * @public
+ */
+export type UnknownIfNever = [P] extends [never] ? unknown : P;
+
+/**
+ * @public
+ */
+export type ToTypeSafe = UnknownIfNever>[number]>;
+
+/**
+ * @public
+ */
+export type DiscriminateUnion = Extract<
+ T,
+ Record
+>;
+
+/**
+ * @public
+ */
+export type MapDiscriminatedUnion<
+ T extends Record,
+ K extends keyof T,
+> = {
+ [V in T[K]]: DiscriminateUnion;
+};
+
+/**
+ * @public
+ */
+export type PickOptionalKeys = {
+ [K in keyof T]: true extends T[K]['required'] ? never : K;
+}[keyof T];
+
+/**
+ * @public
+ */
+export type PickRequiredKeys = {
+ [K in keyof T]: true extends T[K]['required'] ? K : never;
+}[keyof T];
+
+/**
+ * @public
+ */
+export type OptionalMap = {
+ [P in Exclude, undefined>]?: NonNullable;
+};
+
+/**
+ * @public
+ */
+export type RequiredMap = {
+ [P in Exclude, undefined>]: NonNullable;
+};
+
+/**
+ * @public
+ */
+export type FullMap = RequiredMap &
+ OptionalMap;
+
+/**
+ * @public
+ */
+export type Filter = T extends U ? T : never;
diff --git a/packages/backend-openapi-utils/src/types/express.ts b/packages/backend-openapi-utils/src/types/express.ts
new file mode 100644
index 0000000000..b0020dab37
--- /dev/null
+++ b/packages/backend-openapi-utils/src/types/express.ts
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import type core from 'express-serve-static-core';
+import { DocPathTemplate, MethodAwareDocPath, RequiredDoc } from './common';
+import { PathSchema, QuerySchema } from './params';
+import { RequestBodyToJsonSchema } from './requests';
+import { ResponseBodyToJsonSchema } from './responses';
+
+/**
+ * Typed express request handler.
+ * @public
+ */
+export type DocRequestHandler<
+ Doc extends RequiredDoc,
+ Path extends DocPathTemplate,
+ Method extends keyof Doc['paths'][Path],
+> = core.RequestHandler<
+ PathSchema,
+ ResponseBodyToJsonSchema,
+ RequestBodyToJsonSchema,
+ QuerySchema,
+ Record
+>;
+
+/**
+ * Typed express error handler / request handler union type.
+ * @public
+ */
+export type DocRequestHandlerParams<
+ Doc extends RequiredDoc,
+ Path extends DocPathTemplate,
+ Method extends keyof Doc['paths'][Path],
+> = core.RequestHandlerParams<
+ PathSchema,
+ ResponseBodyToJsonSchema,
+ RequestBodyToJsonSchema,
+ QuerySchema,
+ Record
+>;
+
+/**
+ * Superset of the express router path matcher that enforces typed request and response bodies.
+ * @public
+ */
+export interface DocRequestMatcher<
+ Doc extends RequiredDoc,
+ T,
+ Method extends
+ | 'all'
+ | 'get'
+ | 'post'
+ | 'put'
+ | 'delete'
+ | 'patch'
+ | 'options'
+ | 'head',
+> {
+ , Method>>(
+ path: Path,
+ ...handlers: Array>
+ ): T;
+ , Method>>(
+ path: Path,
+ ...handlers: Array>
+ ): T;
+}
diff --git a/packages/backend-openapi-utils/src/types/immutable.ts b/packages/backend-openapi-utils/src/types/immutable.ts
new file mode 100644
index 0000000000..3b253133d8
--- /dev/null
+++ b/packages/backend-openapi-utils/src/types/immutable.ts
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import type {
+ ContentObject,
+ OpenAPIObject,
+ ReferenceObject,
+ RequestBodyObject,
+ ParameterObject,
+ SchemaObject,
+ ResponseObject,
+} from 'openapi3-ts';
+
+/**
+ * This file is meant to hold Immutable overwrites of the values provided by the `openapi3-ts`
+ * package due to issues with `as const` supporting only readonly values.
+ */
+
+/**
+ * From {@link https://github.com/microsoft/TypeScript/issues/13923#issuecomment-653675557}, allows
+ * us to convert from `as const` to the various OpenAPI types documented in `openapi3-ts`.
+ *
+ * @public
+ */
+export type Immutable = T extends
+ | Function
+ | boolean
+ | number
+ | string
+ | null
+ | undefined
+ ? T
+ : T extends Map
+ ? ReadonlyMap, Immutable>
+ : T extends Set
+ ? ReadonlySet>
+ : { readonly [P in keyof T]: Immutable };
+
+/**
+ * @public
+ */
+export type ImmutableObject = { readonly [K in keyof T]: Immutable };
+
+/**
+ * @public
+ */
+export type ImmutableReferenceObject = ImmutableObject;
+
+/**
+ * @public
+ */
+export type ImmutableOpenAPIObject = ImmutableObject;
+
+/**
+ * @public
+ */
+export type ImmutableContentObject = ImmutableObject;
+
+/**
+ * @public
+ */
+export type ImmutableRequestBodyObject = ImmutableObject;
+
+/**
+ * @public
+ */
+export type ImmutableResponseObject = ImmutableObject;
+
+/**
+ * @public
+ */
+export type ImmutableParameterObject = ImmutableObject;
+
+/**
+ * @public
+ */
+export interface HeaderObject extends ParameterObject {
+ in: 'header';
+ style: 'simple';
+}
+
+/**
+ * @public
+ */
+export type ImmutableHeaderObject = ImmutableObject;
+
+/**
+ * @public
+ */
+export interface CookieObject extends ParameterObject {
+ in: 'cookie';
+ style?: 'form';
+}
+
+/**
+ * @public
+ */
+export type ImmutableCookieObject = ImmutableObject;
+
+/**
+ * @public
+ */
+export interface QueryObject extends ParameterObject {
+ in: 'query';
+ style?: 'form' | 'deepObject' | 'pipeDelimited' | 'spaceDelimited';
+}
+
+/**
+ * @public
+ */
+export type ImmutableQueryObject = ImmutableObject;
+
+/**
+ * @public
+ */
+export interface PathObject extends ParameterObject {
+ in: 'path';
+ style?: 'simple' | 'label' | 'matrix';
+}
+/**
+ * @public
+ */
+export type ImmutablePathObject = ImmutableObject;
+
+/**
+ * @public
+ */
+export type ImmutableSchemaObject = ImmutableObject;
diff --git a/packages/backend-openapi-utils/src/types/index.ts b/packages/backend-openapi-utils/src/types/index.ts
new file mode 100644
index 0000000000..98e58f68ad
--- /dev/null
+++ b/packages/backend-openapi-utils/src/types/index.ts
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export * from './common';
+export * from './express';
+export * from './immutable';
+export * from './params';
+export * from './requests';
+export * from './responses';
diff --git a/packages/backend-openapi-utils/src/types/params.ts b/packages/backend-openapi-utils/src/types/params.ts
new file mode 100644
index 0000000000..dce743e6e8
--- /dev/null
+++ b/packages/backend-openapi-utils/src/types/params.ts
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {
+ ImmutableCookieObject,
+ ImmutableHeaderObject,
+ ImmutableParameterObject,
+ ImmutablePathObject,
+ ImmutableQueryObject,
+ ImmutableReferenceObject,
+ ImmutableSchemaObject,
+} from './immutable';
+import {
+ ComponentRef,
+ ComponentTypes,
+ DocOperation,
+ DocPath,
+ DocPathMethod,
+ Filter,
+ FullMap,
+ MapDiscriminatedUnion,
+ PathTemplate,
+ RequiredDoc,
+} from './common';
+import { FromSchema, JSONSchema7 } from 'json-schema-to-ts';
+
+/**
+ * @public
+ */
+export type DocParameter<
+ Doc extends RequiredDoc,
+ Path extends Extract,
+ Method extends keyof Doc['paths'][Path],
+ Parameter extends keyof Doc['paths'][Path][Method]['parameters'],
+> = DocOperation<
+ Doc,
+ Path,
+ Method
+>['parameters'][Parameter] extends ImmutableReferenceObject
+ ? 'parameters' extends ComponentTypes
+ ? ComponentRef<
+ Doc,
+ 'parameters',
+ DocOperation['parameters'][Parameter]
+ >
+ : never
+ : DocOperation['parameters'][Parameter];
+
+/**
+ * @public
+ */
+export type DocParameters<
+ Doc extends RequiredDoc,
+ Path extends Extract