docs/releases/v1.45.0-changelog.md
Upgrade Helper: https://backstage.github.io/upgrade-helper/?to=1.45.0
instanceMetadata service to return a list of plugins not features.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.instanceMetadata service to main entrypoint.coreServices.rootInstanceMetadata as a root service.d57b13b: Added support for Postgres 18 to the available TestDatabases.
Note that the set of default databases to test against for users of the TestDatabases class was also updated to include Postgres 14 and 18, instead of 13 and 17. If you need to override this, you can pass in an explicit ids argument, for example ids: ['POSTGRES_17', 'POSTGRES_13', 'SQLITE_3'].
erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.@backstage/frontend-plugin-api. This means they no longer need to be converted with convertLegacyRouteRef or convertLegacyRouteRefs from @backstage/core-compat-api.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.@backstage/no-ui-css-imports-in-non-frontend rule, which ensures that CSS from @backstage/ui is not imported outside of the frontend app.ExtensionDefinition to OverridableExtensionDefinition and introduced a slimmer ExtensionDefinition type that does not include override methods. The overridable type is generally used as an output type, while plain ExtensionDefinitions are used for input. This reduces type conflicts across different of @backstage/frontend-plugin-api, improving long-term compatibility.4d03f08: Internal refactor of route reference implementations with minor updates to the toString implementations.
7c6a66d: Added support for plugin-relative attachTo declarations for extension definitions. This allows for the creation of extension and extension blueprints that attach to other extensions of a particular kind in the same plugin, rather than needing to provide the exact extension ID. This is particularly useful when wanting to provide extension blueprints with a built-in hierarchy where the extensions created from one blueprint attach to extensions created from the other blueprint, for example:
// kind: 'tabbed-page'
const parentPage = TabbedPageBlueprint.make({
params: {....}
})
// attachTo: { kind: 'tabbed-page', input: 'tabs' }
const child1 = TabContentBlueprint.make({
name: 'tab1',
params: {....}
})
878c251: Updated to ExtensionInput to make all type parameters optional.
05f60e1: Refactored constructor parameter properties to explicit property declarations for compatibility with TypeScript's erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.
Updated dependencies
package-docs command will now automatically use a typedoc.json file if one exists at the root of your project.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.539cf26: BREAKING: Migrated Avatar component from Base UI to custom implementation with size changes:
x-small size added (1.25rem / 20px)small size unchanged (1.5rem / 24px)medium size unchanged (2rem / 32px, default)large size changed from 3rem to 2.5rem (40px)x-large size added (3rem / 48px)Migration:
# Remove Base UI-specific props
- <Avatar src="..." name="..." render={...} />
+ <Avatar src="..." name="..." />
# Update large size usage to x-large for same visual size
- <Avatar src="..." name="..." size="large" />
+ <Avatar src="..." name="..." size="x-large" />
Added purpose prop for accessibility control ('informative' or 'decoration').
5c614ff: BREAKING: Migrated Checkbox component from Base UI to React Aria Components.
API changes required:
checked → isSelecteddefaultChecked → defaultSelecteddisabled → isDisabledrequired → isRequiredlabel prop removed - use children insteadbui-CheckboxLabel class removeddata-checked → data-selectedMigration examples:
Before:
<Checkbox label="Accept terms" checked={agreed} onChange={setAgreed} />
After:
<Checkbox isSelected={agreed} onChange={setAgreed}>
Accept terms
</Checkbox>
Before:
<Checkbox label="Option" disabled />
After:
<Checkbox isDisabled>Option</Checkbox>
Before:
<Checkbox />
After:
<Checkbox>
<VisuallyHidden>Accessible label</VisuallyHidden>
</Checkbox>
134151f: Fixing styles on SearchField in Backstage UI after migration to CSS modules. SearchField has now its own set of class names. We previously used class names from TextField but this approach was creating some confusion so going forward in your theme you'll be able to theme TextField and SearchField separately.
a67670d: BREAKING: Removed central componentDefinitions object and related type utilities (ComponentDefinitionName, ComponentClassNames).
Component definitions are primarily intended for documenting the CSS class API for theming purposes, not for programmatic use in JavaScript/TypeScript.
Migration Guide:
If you were using component definitions or class names to build custom components, we recommend migrating to either:
b78fc45: BREAKING: Changed className prop behavior to augment default styles instead of being ignored or overriding them.
Affected components:
If you were passing custom className values to any of these components that relied on the previous behavior, you may need to adjust your styles to account for the default classes now being applied alongside your custom classes.
83c100e: BREAKING: Removed Collapsible component. Migrate to Accordion or use React Aria Disclosure.
Accordion provides preset styling with a similar component structure.
- import { Collapsible } from '@backstage/ui';
+ import { Accordion, AccordionTrigger, AccordionPanel } from '@backstage/ui';
- <Collapsible.Root>
- <Collapsible.Trigger render={(props) => <Button {...props}>Toggle</Button>} />
- <Collapsible.Panel>Content</Collapsible.Panel>
- </Collapsible.Root>
+ <Accordion>
+ <AccordionTrigger title="Toggle" />
+ <AccordionPanel>Content</AccordionPanel>
+ </Accordion>
CSS classes: .bui-CollapsibleRoot → .bui-Accordion, .bui-CollapsibleTrigger → .bui-AccordionTrigger (now on heading element), .bui-CollapsiblePanel → .bui-AccordionPanel
For custom styling without preset styles:
import { Disclosure, Button, DisclosurePanel } from 'react-aria-components';
<Disclosure>
<Button slot="trigger">Toggle</Button>
<DisclosurePanel>Content</DisclosurePanel>
</Disclosure>;
816af0f: BREAKING: The SelectProps interface now accepts a generic type parameter for selection mode.
Added searchable and multiple selection support to Select component. The component now accepts searchable, selectionMode, and searchPlaceholder props to enable filtering and multi-selection modes.
Migration: If you're using SelectProps type directly, update from SelectProps to SelectProps<'single' | 'multiple'>. Component usage remains backward compatible.
truncate prop from being spread to the underlying DOM element.@base-ui-components/react dependency as all components now use React Aria Components.*.css.loading prop to Button and ButtonIcon components for displaying spinner during async operations.href prop.SearchResultListItemBlueprint and related componentserasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.980f240: Moved from ldapjs dependency to ldapts
Type Migration
Custom transformers must now accept Entry from ldapts instead of SearchEntry
from ldapjs The Entry type provides direct property access without need for
.object() or .raw() methods.
If you have custom user or group transformers, update the signature from:
(vendor: LdapVendor, config: UserConfig, entry: SearchEntry) =>
Promise<UserEntity | undefined>;
to
(vendor: LdapVendor, config: UserConfig, entry: Entry) =>
Promise<UserEntity | undefined>;
Search Options
Updated LDAP search configuration typesOnly: false → attributeValues: true
This inverts the boolean logic: ldapjs used negative form while ldapts uses
positive form. Both achieve the same result: retrieving attribute values rather
than just attribute names.
Update LDAP search options in configuration from
options:
typesOnly: false
to
options:
attributeValues: true
API Changes Removed LdapClient.searchStreaming() method. Users should
migrate to LdapClient.search() instead
If you're using searchStreaming directly:
// Before
await client.searchStreaming(dn, options, async entry => {
// process each entry
});
// After
const entries = await client.search(dn, options);
for (const entry of entries) {
// process each entry
}
NOTE:: Both methods have always loaded all entries into memory. The
searchStreamingmethod was only needed internally to handleldapjs's event-based API.
erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.backstage-gateway-hops header and rejects requests that exceed 3 hops with a 508 Loop Detected error.instanceMetadata service.87e597c: Adds support for default configuration for an entire notification channel. This setting will also be inherited down to origins and topics while still respecting the users individual choices.
This will be handy if you want to use a "opt-in" strategy.
15fb764: Show default settings for notifications even before receiving first notification.
Previously, it was not possible for the users to see or modify their notification settings until they had received at least one notification from specific origin or topic. This update ensures that default settings are displayed from the outset, allowing users to customize their preferences immediately.
05f60e1: Refactored constructor parameter properties to explicit property declarations for compatibility with TypeScript's erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.
Updated dependencies
87e597c: Adds support for default configuration for an entire notification channel. This setting will also be inherited down to origins and topics while still respecting the users individual choices.
This will be handy if you want to use a "opt-in" strategy.
SearchResultListItemBlueprint and related componentsSearchResultListItemBlueprint and related componentserasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.SearchResultListItemBlueprint and related components9bcfa77: Adjusted the log line wording of task worker starting
91ab2eb: Fix a bug in the Gitlab URL reader where search did not handle multiple globs
fa255f5: Support for Bitbucket Cloud's API token was added as appPassword is deprecated (no new creation from September 9, 2025) and will be removed on June 9, 2026.
API token usage example:
integrations:
bitbucketCloud:
- username: [email protected]
token: my-token
05f60e1: Refactored constructor parameter properties to explicit property declarations for compatibility with TypeScript's erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.
b2f6a5a: Fix #31348 issue where BitbucketUrlReader ignored provided token and instead always used integration credentials
Updated dependencies
erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.yarn new command now supports templating filenames.new command for the @internal scope: it now consistently defaults to the backstage-plugin- infix whether the --scope option is not set or it's set to internal.yarn new command to create an catalog entity provider. To add this template to an explicit list in the root package.json, use @backstage/cli/templates/catalog-provider-module.backstage-cli new --scope command with a scope that already includes the @ symbol (e.g., @backstage-community) would result in a double @@ prefix in the generated package name, causing invalid package.json files.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.toString implementations.viewbox back to old values.
fullScreen prop to EntityCatalogGraphCarderasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.@backstage/plugin-app-visualizer to the app in the --next template.@backstage/cli/templates/catalog-provider-module template to the explicit template configuration for the next-app template.@backstage/ui/css/styles.css.toString implementations.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.fa255f5: Support for Bitbucket Cloud's API token was added as appPassword is deprecated (no new creation from September 9, 2025) and will be removed on June 9, 2026.
API token usage example:
integrations:
bitbucketCloud:
- username: [email protected]
token: my-token
05f60e1: Refactored constructor parameter properties to explicit property declarations for compatibility with TypeScript's erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.
Updated dependencies
erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.@backstage/ui.a9315d0: Change internal state column to text to support state of over 255 characters
05f60e1: Refactored constructor parameter properties to explicit property declarations for compatibility with TypeScript's erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.
51ff7d8: Allow configuring dynamic client registration token expiration with config auth.experimentalDynamicClientRegistration.tokenExpiration.
Maximum expiration for the DCR token is 24 hours. Default expiration is 1 hour.
Updated dependencies
erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.fa255f5: Support for Bitbucket Cloud's API token was added as appPassword is deprecated (no new creation from September 9, 2025) and will be removed on June 9, 2026.
API token usage example:
integrations:
bitbucketCloud:
- username: [email protected]
token: my-token
05f60e1: Refactored constructor parameter properties to explicit property declarations for compatibility with TypeScript's erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.
Updated dependencies
erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.pageSizes for GitHub GraphQL API queries to prevent RESOURCE_LIMITS_EXCEEDED errors with organizations with large number of repositories. Please see the GitHub Discovery documentation for new configuration options.pageSizes for GitHub GraphQL API queries to prevent RESOURCE_LIMITS_EXCEEDED errors with organizations with large number of teams and members. Please see the GitHub Org Data documentation for new configuration options.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.viewbox back to old values.
fullScreen prop to EntityCatalogGraphCardcatalog.entity.create permission authorization in the default page extension.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.VisitList by adding optional enrichVisit, transformPathname, canSave functions to VisitsStorageApi, along with VisitDisplayProvider for colors, labels@kubernetes/client-node to 1.4.0.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.@kubernetes/client-node to 1.4.0.@kubernetes/client-node to 1.4.0.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.@kubernetes/client-node to 1.4.0.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.AWS SES client to version 2 to support nodemailer version 7.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.fa255f5: Support for Bitbucket Cloud's API token was added as appPassword is deprecated (no new creation from September 9, 2025) and will be removed on June 9, 2026.
API token usage example:
integrations:
bitbucketCloud:
- username: [email protected]
token: my-token
Updated dependencies
fa255f5: Support for Bitbucket Cloud's API token was added as appPassword is deprecated (no new creation from September 9, 2025) and will be removed on June 9, 2026.
API token usage example:
integrations:
bitbucketCloud:
- username: [email protected]
token: my-token
Updated dependencies
erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.useTemplateSchema hook by removing the title instead of setting it to undefinederasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.SignalClient would try to subscribe to the same channel twice after an error, instead of just once.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.storageApiRef implementationerasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.erasableSyntaxOnly setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.