diff --git a/.changeset/add-actions-registry-examples.md b/.changeset/add-actions-registry-examples.md deleted file mode 100644 index 5174bcc68d..0000000000 --- a/.changeset/add-actions-registry-examples.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@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. diff --git a/.changeset/add-missing-transitive-deps.md b/.changeset/add-missing-transitive-deps.md new file mode 100644 index 0000000000..83f87fcc7e --- /dev/null +++ b/.changeset/add-missing-transitive-deps.md @@ -0,0 +1,8 @@ +--- +'@backstage/core-components': patch +'@backstage/ui': patch +'@backstage/plugin-notifications': patch +'@backstage/plugin-scaffolder-backend-module-github': patch +--- + +Added missing dependencies that were previously only available transitively. diff --git a/.changeset/add-no-self-package-imports-lint-rule.md b/.changeset/add-no-self-package-imports-lint-rule.md new file mode 100644 index 0000000000..89d9658038 --- /dev/null +++ b/.changeset/add-no-self-package-imports-lint-rule.md @@ -0,0 +1,5 @@ +--- +'@backstage/eslint-plugin': minor +--- + +Added a new `no-self-package-imports` lint rule, enabled as `error` in the recommended config, that reports when a package imports itself by its own name instead of using a relative path. This pattern causes circular initialization errors in bundled ESM and with `jest.requireActual`. diff --git a/.changeset/add-service-unavailable-error-name.md b/.changeset/add-service-unavailable-error-name.md new file mode 100644 index 0000000000..78647f7a56 --- /dev/null +++ b/.changeset/add-service-unavailable-error-name.md @@ -0,0 +1,5 @@ +--- +'@backstage/errors': patch +--- + +Added explicit `name` property to `ServiceUnavailableError` for consistency with all other error classes, making it resilient to minification. diff --git a/.changeset/app-defaults-clarify-failures.md b/.changeset/app-defaults-clarify-failures.md deleted file mode 100644 index c6321a3a3a..0000000000 --- a/.changeset/app-defaults-clarify-failures.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/app-defaults': patch ---- - -Added `FetchMiddlewares.clarifyFailures()` to the default fetch API middleware stack. diff --git a/.changeset/app-routes-param-redirect-substitution.md b/.changeset/app-routes-param-redirect-substitution.md new file mode 100644 index 0000000000..66fc77a4ea --- /dev/null +++ b/.changeset/app-routes-param-redirect-substitution.md @@ -0,0 +1,17 @@ +--- +'@backstage/plugin-app': patch +--- + +The `app/routes` redirect config now supports path parameter substitution in the `to` target. Named params (`:userId`) and splat params (`*`) captured by the `from` path are replaced in the `to` string before navigating, making it possible to express redirects like: + +```yaml +app: + extensions: + - app/routes: + config: + redirects: + - from: /users/:userId + to: /profile/:userId + - from: /old-docs + to: /docs/* +``` diff --git a/.changeset/app-routes-redirect-config.md b/.changeset/app-routes-redirect-config.md deleted file mode 100644 index ce43e3c159..0000000000 --- a/.changeset/app-routes-redirect-config.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -'@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 -``` diff --git a/.changeset/aws-wif-token-file.md b/.changeset/aws-wif-token-file.md new file mode 100644 index 0000000000..308e874e6a --- /dev/null +++ b/.changeset/aws-wif-token-file.md @@ -0,0 +1,14 @@ +--- +'@backstage/integration-aws-node': minor +--- + +Added `webIdentityTokenFile` to `AwsIntegrationAccountConfig` and +`AwsIntegrationDefaultAccountConfig`. When set along with a `roleName`, +`DefaultAwsCredentialsManager` retrieves credentials by calling +`AssumeRoleWithWebIdentity` (via `fromTokenFile`) using the file's +contents as the web identity token. The file is re-read on each +credential refresh. + +The validator rejects combining `webIdentityTokenFile` with +`accessKeyId`/`secretAccessKey`, `profile`, or `externalId`, and +rejects setting it without a `roleName`. diff --git a/.changeset/backend-test-utils-tracing-service-mock.md b/.changeset/backend-test-utils-tracing-service-mock.md new file mode 100644 index 0000000000..91703f853e --- /dev/null +++ b/.changeset/backend-test-utils-tracing-service-mock.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Added a new tracing service mock to be leveraged in tests diff --git a/.changeset/backend-tracing-and-stuff.md b/.changeset/backend-tracing-and-stuff.md new file mode 100644 index 0000000000..c41742472f --- /dev/null +++ b/.changeset/backend-tracing-and-stuff.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-plugin-api': patch +'@backstage/backend-defaults': patch +--- + +Adds an alpha `TracingService` to provide a unified interface for emitting trace spans across Backstage plugins. diff --git a/.changeset/bitter-files-flash.md b/.changeset/bitter-files-flash.md new file mode 100644 index 0000000000..9b7ab014a5 --- /dev/null +++ b/.changeset/bitter-files-flash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': major +--- + +Add explicit memory management to SecureTemplater usage diff --git a/.changeset/brave-foxes-dance.md b/.changeset/brave-foxes-dance.md new file mode 100644 index 0000000000..b395f0e935 --- /dev/null +++ b/.changeset/brave-foxes-dance.md @@ -0,0 +1,22 @@ +--- +'@backstage/plugin-scaffolder-react': minor +'@backstage/plugin-scaffolder': minor +--- + +Added experimental BUI (Backstage UI) form theme for scaffolder forms. All default field extensions render BUI variants when enabled. + +**Extension config:** + +```yaml +app: + extensions: + - sub-page:scaffolder/templates: + config: + enableBackstageUi: true +``` + +**JSX props:** + +```tsx + +``` diff --git a/.changeset/brave-groups-learn.md b/.changeset/brave-groups-learn.md new file mode 100644 index 0000000000..773e8eed49 --- /dev/null +++ b/.changeset/brave-groups-learn.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Added `isPending` prop to Alert, Button, ButtonIcon, Table, and TableRoot as a replacement for the `loading` prop, aligning with React Aria naming conventions. The `loading` prop is now deprecated but still supported as an alias. CSS selectors now use `data-ispending` instead of `data-loading` for styling pending states; `data-loading` is still emitted for backward compatibility but will be removed alongside the `loading` prop. + +**Affected components:** Alert, Button, ButtonIcon, Table, TableRoot diff --git a/.changeset/bui-bg-inherit-css-var.md b/.changeset/bui-bg-inherit-css-var.md new file mode 100644 index 0000000000..214e370c2e --- /dev/null +++ b/.changeset/bui-bg-inherit-css-var.md @@ -0,0 +1,24 @@ +--- +'@backstage/ui': patch +--- + +Added a public `--bui-bg-inherit` CSS variable that resolves to the background +color of the nearest enclosing bg provider (`Box`, `Flex`, `Grid`, `Card`, +`Accordion`, or any element with a `data-bg` attribute), falling back to +`--bui-bg-app`. Use it from CSS for sticky or fixed elements that need to match +their surrounding surface without hardcoding a specific level. + +```css +.searchBarContainer { + position: sticky; + top: 0; + background-color: var(--bui-bg-inherit); +} +``` + +As part of this change, the `data-bg` painting rules previously duplicated in +`Box`, `Flex`, `Grid`, `Accordion`, and `Card` have been centralized into a +single source in `core.css`. Painting and component behavior are unchanged for +all existing usages, with one minor expansion: any element with a `data-bg` +attribute (including provider elements and any element that sets it directly) +is now painted, not only `Box`/`Flex`/`Grid`/`Card`/`Accordion` elements. diff --git a/.changeset/catalog-entity-page-no-header.md b/.changeset/catalog-entity-page-no-header.md deleted file mode 100644 index 51cda8f087..0000000000 --- a/.changeset/catalog-entity-page-no-header.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Disabled the default page layout header for the catalog entity page in the new frontend system. The entity page already renders its own header through the `EntityHeader` extension, so the page layout header was redundant. diff --git a/.changeset/catalog-exists-query-optimization.md b/.changeset/catalog-exists-query-optimization.md deleted file mode 100644 index e0eb2cbb31..0000000000 --- a/.changeset/catalog-exists-query-optimization.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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. diff --git a/.changeset/catalog-graph-nfs-page.md b/.changeset/catalog-graph-nfs-page.md deleted file mode 100644 index fac437c641..0000000000 --- a/.changeset/catalog-graph-nfs-page.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-graph': patch ---- - -Added `title` and `icon` to the new frontend system plugin definition. diff --git a/.changeset/catalog-import-nfs-page.md b/.changeset/catalog-import-nfs-page.md deleted file mode 100644 index 2944565205..0000000000 --- a/.changeset/catalog-import-nfs-page.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-import': patch ---- - -Added `title` and `icon` to the new frontend system plugin definition. diff --git a/.changeset/catalog-metrics-cache.md b/.changeset/catalog-metrics-cache.md new file mode 100644 index 0000000000..bbe427bcea --- /dev/null +++ b/.changeset/catalog-metrics-cache.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Improved the performance of the `catalog_entities_count` metric. + +The legacy Prometheus and OpenTelemetry observable gauges previously each ran their own copy of the per-kind count query against the `search` table on every metrics scrape. On large catalogs this could pile up faster than the queries completed, contending for buffers and stalling the database. + +The two callbacks now share a single query result with a short in-process TTL cache, and the underlying query reads from `final_entities` instead of `search`, avoiding the bitmap heap scans that dominated the previous form. The emitted labels and values are unchanged. diff --git a/.changeset/catalog-search-table-sync.md b/.changeset/catalog-search-table-sync.md deleted file mode 100644 index 3a3bcea96a..0000000000 --- a/.changeset/catalog-search-table-sync.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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. diff --git a/.changeset/chatty-cups-create.md b/.changeset/chatty-cups-create.md deleted file mode 100644 index 0fa05b14f3..0000000000 --- a/.changeset/chatty-cups-create.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -'@backstage/ui': minor ---- - -**BREAKING**: The `Header` component's `tabs` prop now uses `HeaderNavTabItem[]` instead of `HeaderTab[]`. Tabs render as a `