Merge branch 'master' of https://github.com/backstage/backstage into migrate-scaffolder-to-metrics-service

This commit is contained in:
Kurt King
2026-04-02 22:47:04 -06:00
760 changed files with 22569 additions and 3253 deletions
+3 -3
View File
@@ -26,7 +26,7 @@ Optional description with code examples.
Migration instructions (breaking changes only).
**Affected components:** button, card
**Affected components:** Button, Card
```
**Required:**
@@ -40,7 +40,7 @@ Migration instructions (breaking changes only).
```markdown
Fixed button hover state
**Affected components:** button
**Affected components:** Button
```
````markdown
@@ -56,7 +56,7 @@ Update imports:
```
````
**Affected components:** table
**Affected components:** Table
```
@@ -0,0 +1,7 @@
---
'@backstage/backend-plugin-api': minor
'@backstage/backend-defaults': patch
'@backstage/backend-test-utils': patch
---
Added support for typed `examples` on actions registered via the actions registry. Action authors can now provide examples with compile-time-checked `input` and `output` values that match their schema definitions.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli-module-new': patch
---
Rename the legacy `frontend-plugin` to `frontend-plugin-legacy`
@@ -0,0 +1,5 @@
---
'@backstage/app-defaults': patch
---
Added `FetchMiddlewares.clarifyFailures()` to the default fetch API middleware stack.
+17
View File
@@ -0,0 +1,17 @@
---
'@backstage/plugin-app': patch
---
Added support for configuring URL redirects on the `app/routes` extension. Redirects can be configured through `app-config` as an array of `{from, to}` path pairs, which will cause navigation to the `from` path to be redirected to the `to` path.
For example:
```yaml
app:
extensions:
- app/routes:
config:
redirects:
- from: /old-path
to: /new-path
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-defaults': patch
---
Refactored auditor severity log level mappings to use `zod/v4` with schema-driven defaults and type inference.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-node': patch
---
Added `OAuthAuthenticatorLogoutResult` type. The `logout` method on `OAuthAuthenticator` can now optionally return `{ logoutUrl }` to trigger a browser redirect after sign-out. This allows providers like Auth0 to clear their session cookies by redirecting to their logout endpoint.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend-module-auth0-provider': minor
---
Added federated logout support. Set `federatedLogout: true` in the Auth0 provider config to clear both the Auth0 session and any upstream IdP session on sign-out. The authenticator returns a logout URL that redirects the browser to Auth0's `/v2/logout?federated` endpoint, ensuring users must fully re-authenticate after signing out.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-azure': patch
---
Add Azure DevOps SCM event translation layer for instant catalog reprocessing.
+11
View File
@@ -0,0 +1,11 @@
---
'@backstage/plugin-catalog-backend': patch
'@backstage/cli-module-auth': patch
'@backstage/cli-module-build': patch
'@backstage/cli-module-test-jest': patch
'@backstage/cli': patch
'@backstage/ui': patch
'@backstage/repo-tools': patch
---
Bumped `glob` dependency from v7/v8/v11 to v13 to address security vulnerabilities in older versions. Bumped `rollup` from v4.27 to v4.59+ to fix a high severity path traversal vulnerability (GHSA-mw96-cpmx-2vgc).
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': patch
---
Improved catalog entity filter query performance by switching from `IN (subquery)` to `EXISTS (correlated subquery)` patterns. This enables PostgreSQL semi-join optimizations and fixes `NOT IN` NULL-semantics pitfalls by using `NOT EXISTS` instead.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-graph': patch
---
Added `title` and `icon` to the new frontend system plugin definition.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-import': patch
---
Added `title` and `icon` to the new frontend system plugin definition.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog': patch
---
Exported the NFS variant of the catalog index page as `CatalogIndexPage` from the `./alpha` entry point, along with supporting types `CatalogIndexPageProps`, `CatalogTableRow`, and `CatalogTableColumnsFunc`. This allows adopters to use and customize the catalog index page within a `PageBlueprint` in the new frontend system.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': patch
---
Reduced search table write churn during stitching by syncing only changed rows instead of doing a full delete and re-insert. On Postgres this uses a single writable CTE, on MySQL a temporary table merge with deadlock retry, and on SQLite the previous bulk replace.
+24
View File
@@ -0,0 +1,24 @@
---
'@backstage/ui': minor
---
**BREAKING**: The `Header` component's `tabs` prop now uses `HeaderNavTabItem[]` instead of `HeaderTab[]`. Tabs render as a `<nav>` element with links and optional dropdown menus instead of `role="tablist"`. A new `activeTabId` prop controls which tab is highlighted.
**Migration:**
```diff
- import { Header, type HeaderTab } from '@backstage/ui';
+ import { Header, type HeaderNavTabItem } from '@backstage/ui';
// Tabs no longer support matchStrategy — active state is controlled via activeTabId
- const tabs: HeaderTab[] = [
- { id: 'overview', label: 'Overview', href: '/overview', matchStrategy: 'prefix' },
+ const tabs: HeaderNavTabItem[] = [
+ { id: 'overview', label: 'Overview', href: '/overview' },
];
- <Header title="My Page" tabs={tabs} />
+ <Header title="My Page" tabs={tabs} activeTabId="overview" />
```
**Affected components:** Header
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-app-api': minor
---
Added `FetchMiddlewares.clarifyFailures()` which replaces the uninformative "TypeError: Failed to fetch" with a message that includes the request method and URL.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': minor
---
Added a new `execute-template` actions registry action that executes a scaffolder template with provided input values and returns a task ID for tracking progress.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/ui': patch
---
Added RangeSlider component for selecting numeric ranges.
**Affected components:** RangeSlider
@@ -0,0 +1,6 @@
---
'@backstage/core-app-api': patch
'@backstage/plugin-app': patch
---
The default auth implementation now checks for a `logoutUrl` in the logout response body. If the auth provider returns one (e.g. Auth0 federated logout), the browser is redirected to that URL to clear the provider's session cookies. This is backward compatible — providers that return an empty response are unaffected.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
Bumped create-app version.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-notifications-backend-module-email': patch
---
build(deps): bump `nodemailer` from 7.0.13 to 8.0.4
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/ui': patch
---
Fixed `Avatar` becoming elliptical in flex layouts by preventing it from shrinking.
**Affected components:** Avatar
@@ -0,0 +1,5 @@
---
'@backstage/backend-defaults': patch
---
Fixed `AwsS3UrlReader` failing to read files from S3 buckets configured with custom endpoint hosts. When an integration was configured with a specific endpoint like `https://bucket-1.s3.eu-central-1.amazonaws.com`, the URL parser incorrectly fell through to the non-AWS code path, always defaulting the region to `us-east-1` instead of extracting it from the hostname.
@@ -0,0 +1,7 @@
---
'@backstage/ui': patch
---
Fixed relative `href` resolution for BUI link components. Relative paths like `../other` are now correctly turned into absolute paths before reaching the React Aria layer, ensuring client-side navigation goes to the right place.
**Affected components:** ButtonLink, Card, CellProfile, CellText, Link, ListRow, MenuItem, MenuListBoxItem, Row, SearchAutocompleteItem, Tab, Tag
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': patch
---
Fixed a deadlock in the catalog processing loop that occurred when running multiple replicas. The `getProcessableEntities` method used `SELECT ... FOR UPDATE SKIP LOCKED` to prevent concurrent processors from claiming the same rows, but the call was not wrapped in a transaction, so the row locks were released before the subsequent `UPDATE` executed. This allowed multiple replicas to select and update overlapping rows, causing PostgreSQL deadlock errors (code 40P01).
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-react': patch
---
Fixed `EntityInfoCard` header overflowing on narrow screens.
@@ -0,0 +1,5 @@
---
'@backstage/plugin-org': patch
---
Fixed `GroupProfileCard` and `UserProfileCard` content overflowing on narrow screens.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/frontend-plugin-api': patch
---
Fixed `FlattenedMessages` type to avoid excessive type instantiation depth in TypeScript 6 when using `createTranslationRef` with the `translations` option.
+26
View File
@@ -0,0 +1,26 @@
---
'@backstage/plugin-auth-node': minor
---
**BREAKING**: Refactored `SignInResolverFactoryOptions` to use a schema-first generic pattern, following Zod's [recommended approach](https://zod.dev/library-authors?id=how-to-accept-user-defined-schemas#how-to-accept-user-defined-schemas) for writing generic functions. The type parameters changed from `<TAuthResult, TOptionsOutput, TOptionsInput>` to `<TAuthResult, TSchema extends ZodType>`.
This fixes "Type instantiation is excessively deep and possibly infinite" errors that occurred when the Zod version in a user's project did not align with the one in Backstage core.
If you use `createSignInResolverFactory` without explicit type parameters (the typical usage), no changes are needed:
```ts
// This usage is unchanged
createSignInResolverFactory({
optionsSchema: z.object({ domain: z.string() }).optional(),
create(options = {}) {
/* ... */
},
});
```
If you reference `SignInResolverFactoryOptions` with explicit type parameters, update as follows:
```diff
- SignInResolverFactoryOptions<MyAuthResult, MyOutput, MyInput>
+ SignInResolverFactoryOptions<MyAuthResult, typeof mySchema>
```
@@ -0,0 +1,5 @@
---
'@backstage/frontend-plugin-api': patch
---
Refactored the internal `createSchemaFromZod` helper to use a schema-first generic pattern, replacing the `ZodSchema<TOutput, ZodTypeDef, TInput>` constraint with `TSchema extends ZodType`. This avoids "excessively deep" type inference errors when multiple Zod copies are resolved.
@@ -0,0 +1,5 @@
---
'@backstage/frontend-app-api': patch
---
Wrapped extension permission authorization in a try/catch to surface errors as `ForwardedError` with a clear message.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli-module-test-jest': patch
---
Minor error message update
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-gitlab': patch
---
Add GitLab SCM event translation layer for instant catalog reprocessing.
@@ -0,0 +1,5 @@
---
'@backstage/core-compat-api': patch
---
Hide the default page header for pages created through the compatibility wrappers, since legacy plugins already render their own headers.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/ui': patch
---
Added support for disabling pagination in `useTable` complete mode by setting `paginationOptions: { type: 'none' }`. This skips data slicing and produces `pagination: { type: 'none' }` in `tableProps`, removing the need for consumers to manually override the pagination prop on `Table`. Also fixed complete mode not reacting to dynamic changes in `paginationOptions.pageSize`.
**Affected components:** `useTable`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes': patch
---
Added `title` and `icon` to the new frontend system plugin definition.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-components': patch
---
Resolved DOM nesting warning in OAuthRequestDialog by rendering secondary text as block-level spans.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog': patch
---
Added Kind field to the About Card. Tags moved before Type and Lifecycle, Kind placed after them. A new `aboutCard.kindField.label` translation key was added.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-notifications': patch
---
Added `title` and `icon` to the new frontend system plugin definition.
+8
View File
@@ -0,0 +1,8 @@
---
'@backstage/plugin-scaffolder': patch
---
Fix the display of the description in `GitlabRepoPicker`:
- Move `owner.description` helper text outside the `allowedOwners` conditional so it renders for both `Select` and `Autocomplete` modes.
- Update the `Autocomplete` label to use `fields.gitlabRepoPicker.owner.inputTitle` instead of `fields.gitlabRepoPicker.owner.title`.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/ui': patch
---
Added `prefers-reduced-motion` support to Tab indicator animations. Users with reduced motion preferences will no longer see sliding transitions on the active and hover indicators.
**Affected components:** Tabs
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-search': patch
---
Fixed the `SearchModal` leaving the page in a broken state by not restoring body overflow and aria-hidden attributes when closing.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-org': patch
---
Added `title` and `icon` to the new frontend system plugin definition.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/repo-tools': patch
---
Parallelized CLI report generation, reducing wall-clock time by ~4x.
+81 -1
View File
@@ -224,5 +224,85 @@
"@backstage/plugin-user-settings-backend": "0.4.1",
"@backstage/plugin-user-settings-common": "0.1.0"
},
"changesets": []
"changesets": [
"add-actions-registry-examples",
"angry-clouds-tell",
"app-defaults-clarify-failures",
"app-routes-redirect-config",
"auditor-zod-v4-refactor",
"azure-scm-events-layer",
"bump-glob-rollup-security",
"catalog-entity-page-no-header",
"catalog-exists-query-optimization",
"catalog-graph-nfs-page",
"catalog-import-nfs-page",
"catalog-search-table-sync",
"chatty-cups-create",
"clarify-fetch-failures",
"cold-bikes-beam",
"cool-shoes-hide",
"create-app-1774970958",
"dependabot-03b295a",
"dependabot-2a735a0",
"dependabot-cc35625",
"drop-react-17-packages-ui",
"easy-pens-judge",
"fix-avatar-flex-shrink",
"fix-aws-s3-url-reader-custom-endpoints",
"fix-bui-relative-href-resolution",
"fix-catalog-filter-flicker",
"fix-catalog-refresh-state-deadlock",
"fix-catalog-table-loading-flash",
"fix-entity-info-card-header-overflow",
"fix-org-profile-card-overflow",
"fix-sidebar-settings-nav",
"fix-translation-ref-ts6",
"fix-zod-generic-auth-node",
"fix-zod-generic-frontend-plugin-api",
"frontend-app-api-permission-error",
"funny-items-wink",
"fuzzy-mangos-design",
"gitlab-scm-events-layer",
"happy-masks-allow",
"hide-compat-wrapper-headers",
"hip-parents-fall",
"hot-yaks-crash",
"kubernetes-nfs-metadata",
"lazy-jars-shake",
"loopback-redirect-uri-port",
"lucky-things-write",
"notifications-nfs-metadata",
"olive-peaches-fly",
"olive-ravens-smell",
"orange-friends-march",
"org-nfs-metadata",
"parallelize-cli-reports",
"plugin-header-remove-toolbar-wrapper",
"quiet-streets-laugh",
"remove-cli-module-new-dep",
"remove-empty-examples-scaffolder-bridge",
"remove-jest-when-dep",
"remove-plugin-header-action-define-params",
"remove-type-fest-github",
"renovate-9d44e41",
"renovate-ced70c0",
"repo-tools-peer-deps-react18",
"scaffolder-nfs-page-layout",
"show-pagination-label",
"shy-doors-repair",
"signals-nfs-metadata",
"simplify-compat-route-ref",
"simplify-route-ref-types",
"smart-cycles-fall",
"specialized-app-apis",
"swift-lizards-bathe",
"ts6-cli-dom-asynciterable",
"ts6-eslint-plugin",
"ts6-plugin-scaffolder",
"ui-menu-item-style-refactor",
"ui-react-aria-deps",
"unprocessed-entities-devtools",
"update-app-visualizer-header-action",
"wicked-impalas-fry"
]
}
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-github': patch
---
Fixed a bug where `GithubEntityProvider` with `validateLocationsExist: true` and `filters.branch` configured would always check for the catalog file on the repository's default branch (`HEAD`) instead of the configured branch. This caused repositories to be filtered out when the catalog file only existed on the non-default branch.
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Removed unnecessary empty `examples` array from actions bridged via the actions registry.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend-module-rails': patch
---
Removed unused `jest-when` dev dependency.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/ui': patch
---
Updated dependency `@types/use-sync-external-store` to `^1.0.0`.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/ui': patch
---
Added `showPaginationLabel` prop to `TablePagination` and `useTable` pagination options. When set to `false`, the pagination label (e.g., "1 - 20 of 150") is hidden while navigation controls remain visible. Defaults to `true`.
**Affected components:** `TablePagination`, `useTable`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-signals': patch
---
Added `title` and `icon` to the new frontend system plugin definition.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-compat-api': patch
---
Removed unnecessary type argument from internal `createRouteRef` call.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/frontend-plugin-api': minor
---
Simplified the type signature of `createRouteRef` by replacing the dual `TParams`/`TParamKeys` type parameters with a single `TParamKey` parameter. This is a breaking change for callers that explicitly provided type arguments, but most usage that relies on inference is unaffected.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/integration': patch
---
Fixed `SingleInstanceGithubCredentialsProvider` to return app credentials when `getCredentials` is called with a bare host URL (e.g. `https://github.com`) instead of falling back to a personal access token.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-react': patch
---
Fixed entity relation cards (e.g., "Has components") only showing one entity at a time by using `paginationOptions: { type: 'none' }` instead of deriving page size from data length.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli-module-build': patch
---
When building dist-workspaces with --always-pack, batch `yarn pack` operations to avoid packing packages and their dependencies simultaneously.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-components': patch
---
Use Backstage Link component for markdown anchor rendering to ensure consistent internal and external link behavior.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Added `DOM.AsyncIterable` to the default `lib` in the shared TypeScript configuration, enabling standard async iteration support for DOM APIs such as `FileSystemDirectoryHandle`. This aligns behavior with [TypeScript 6.0](https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/#the-dom-lib-now-contains-domiterable-and-domasynciterable), where this lib is included in `DOM` by default.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/eslint-plugin': patch
---
Fixed `no-mixed-plugin-imports` rule to return `null` from non-fixable suggestion handlers and added an explicit `SuggestionReportDescriptor[]` type annotation, matching the stricter type checking in TypeScript 6.0.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder': patch
---
Removed custom `IterableDirectoryHandle` and `WritableFileHandle` types in favor of the standard DOM `FileSystemDirectoryHandle` and `FileSystemFileHandle` types, which are now available through the `DOM.AsyncIterable` lib added to the shared TypeScript configuration.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/ui': patch
---
Fixed HeaderNav hover indicator covering tab text when theme uses opaque background colors. Also fixed an incorrect CSS variable reference (`--bui-font-family``--bui-font-regular`).
**Affected components:** Header