docs/releases/v1.50.0-changelog.md
Upgrade Helper: https://backstage.github.io/upgrade-helper/?to=1.50.0
connection.type: rds along with host, user, and region to use short-lived IAM tokens instead of a static password. Requires the @aws-sdk/rds-signer package and an IAM role with rds-db:connect permission.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.zod/v4 with schema-driven defaults and type inference.assertError to toError for error handling.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.HostDiscovery now logs a warning when backend.baseUrl is set to a localhost address while NODE_ENV is production, and when backend.baseUrl is not a valid URL.wait-for-expect to ^4.0.0.embedded-postgres as the database for local development. Set backend.database.client to embedded-postgres in your app config to enable this. The embedded-postgres package must be installed as an explicit dependency in your project.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..T behavior between ExtensionPoint and ServiceRef to consistently return null instead of throwing.isDatabaseConflictError.entityRef field to the Location type, exposing the stable entity reference for each registered location. Any code that produces Location objects must now include this field. Added updateLocation method to CatalogApi for updating the type and target of an existing location.createCatalogModelLayer API provides a builder for composing model definitions, and a compileCatalogModel function validates and merges them into a unified model. Built-in entity kinds now include model layer definitions.list command now groups actions by plugin source with colored headers and action titles. The execute --help command renders full action details including markdown descriptions. Complex schema types like objects, arrays, and union types are now accepted as JSON flags. Error messages from the server are now surfaced directly. The sources add and sources remove commands accept multiple plugin IDs at once.FetchMiddlewares.clarifyFailures() which replaces the uninformative "TypeError: Failed to fetch" with a message that includes the request method and URL.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.toError utility function is now available for converting unknown values to ErrorLike objects. If the value is already error-like it is returned as-is, strings are used directly as the error message, and all other values are wrapped as unknown error '<stringified>'. Non-error causes passed to CustomErrorBase are now converted and stored using toError rather than discarded.assertError to delegate to isError instead of duplicating the same checks.createSchemaFromZod helper. Use the new configSchema option instead. See the 1.50 migration documentation for more information.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.createFrontendModule to correctly say "Module" instead of "Plugin".open method to DialogApi that renders dialogs without any built-in dialog chrome, giving the caller full control over the dialog presentation. This avoids focus trap conflicts that occur when mixing components from different design libraries. The existing show and showModal methods are now deprecated in favor of open.FlattenedMessages type to avoid excessive type instantiation depth in TypeScript 6 when using createTranslationRef with the translations option.configSchema option for createExtension and createExtensionBlueprint that accepts direct schema values from any Standard Schema compatible library with JSON Schema support, such as zod v4 (zod@^4.0.0). The old config.schema option is now deprecated. Note that Zod v3 is not supported by the new configSchema option, including the zod/v4 subpath export which does not include JSON Schema conversion support. You must upgrade to the zod v4 package. See the 1.50 migration documentation for more information.titleLink prop to PageLayoutProps so the plugin header title can link back to the plugin root.defineParams callback from PluginHeaderActionBlueprint. It still works, but is no longer required.8659f33: 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:
- 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
bed3307: BREAKING: Dropped support for React 17. The minimum supported React version is now 18.
b4a1875: BREAKING: Tab href values in the Header component are now resolved through the router context instead of being passed raw to the <a> tag. This means relative href values (e.g. sub3, ./sub4, ../catalog) are now resolved against the current route, and absolute href values may be affected by the router's basename configuration.
Migration:
Tab navigation should work the same for absolute href values in most setups. If you use relative href values in tabs, verify they resolve as expected. If your app configures a router basename, check that absolute tab href values still navigate correctly.
Affected components: Header
49ffe8a: BREAKING: Removed the toolbarWrapper element from PluginHeader and dropped toolbarWrapper from PluginHeaderDefinition.classNames. Toolbar layout styles now live on toolbar (.bui-PluginHeaderToolbar).
Migration: Update custom CSS that targeted .bui-PluginHeaderToolbarWrapper to use .bui-PluginHeaderToolbar instead.
Affected components: PluginHeader
4032ad7: Added new Badge component for non-interactive labeling and categorization of content. It shares the visual appearance of Tag but renders as a plain DOM element with no interactive states.
Affected components: Badge
2e5c5f8: 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).
2840476: Resolved route-relative href props to absolute paths by default in all components, removing the need for the resolveHref option in component definitions.
b4a1875: Added automatic active tab detection to the Header component. When activeTabId is omitted, the active tab is now auto-detected from the current route using matchRoutes. Pass an explicit activeTabId to override, or null for no active tab.
Affected components: Header
8d79835: Added RangeSlider component for selecting numeric ranges.
Affected components: RangeSlider
bcbb6eb: Made SearchAutocomplete background-aware. The input now adapts its background color based on its parent container's background level.
Affected components: SearchAutocomplete
f73876a: Exported the TableBodySkeleton component as a public API for use outside of the built-in Table component. The component now accepts any column array whose items have an id property, making it compatible with custom column types.
5081bcc: Fixed Avatar becoming elliptical in flex layouts by preventing it from shrinking.
Affected components: Avatar
d840ba9: 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
8c2e24e: Added aria-hidden to the PluginHeader icon to prevent screen readers from announcing decorative plugin icons.
Affected components: PluginHeader
3bc23a5: 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
67b8881: Added ModalOverlay to Dialog so overlay styles are applied to the actual overlay rather than the modal content, and fixed dismissing via outside click in the process.
Affected components: Dialog
aa47a37: Add an initial CheckboxGroup component implementation and docs coverage.
3d67aeb: 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
c368cf3: Updated dependency @types/use-sync-external-store to ^1.0.0.
d0f055f: 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
17eb8e0: Fixed form field descriptions not being connected to inputs via aria-describedby, making them accessible to screen readers. Added a descriptionSlot prop to FieldLabel that uses React Aria's slot mechanism to automatically wire up the connection.
Affected components: FieldLabel, TextField, PasswordField, SearchField, Select, RadioGroup, CheckboxGroup
cc4a682: Fixed the ButtonIcon's loading spinner animation
Affected components: ButtonIcon
386972f: Fixed the Tabs active indicator not hiding when no tab matches the current route.
Affected components: Tabs
adcdd2f: Simplified the Menu component's item structure by removing the inner wrapper element and applying styles directly to the menu item, improving DOM clarity.
Affected components: Menu
0257ada: Added react-aria, react-stately, @react-aria/interactions, @react-stately/layout, and @react-stately/overlays as dependencies.
feaf3d1: 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
d7c67cd: BREAKING: The setting auth.omitIdentityTokenOwnershipClaim has had its default value switched to true.
With this setting Backstage user tokens issued by the auth backend will no longer contain an ent claim - the one with the user's ownership entity refs. This means that tokens issued in large orgs no longer risk hitting HTTP header size limits.
To get ownership info for the current user, code should use the userInfo core service. In practice code will typically already conform to this since the ent claim has not been readily exposed in any other way for quite some time. But code which explicitly decodes Backstage tokens - which is strongly discouraged - may be affected by this change.
The setting will remain for some time to allow it to be set back to false if need be, but it will be removed entirely in a future release.
assertError to toError for error handling.9244b70: Sign-out now redirects the browser to Auth0's /v2/logout endpoint, clearing the Auth0 session cookie so that the next sign-in creates a new Auth0 session. Previously, only the Backstage session was cleared, allowing users to sign back in without going through Auth0 logout first.
Set federatedLogout: true in the Auth0 provider config to additionally clear the upstream IdP session (e.g. Okta, Google). This is what guarantees a full re-login across the entire SSO chain and may require users to re-enter credentials.
createAuth0Authenticator factory function that accepts a CacheService to cache Auth0 profile API responses for 1 minute during token refreshes. This avoids hitting Auth0 rate limits on repeated page refreshes. The module now uses the cached variant by default. The existing auth0Authenticator export remains available for use without caching.fa55078: BREAKING: Refactored SignInResolverFactoryOptions to use a schema-first generic pattern, following Zod's recommended approach 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:
// 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:
- SignInResolverFactoryOptions<MyAuthResult, MyOutput, MyInput>
+ SignInResolverFactoryOptions<MyAuthResult, typeof mySchema>
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.location_entity_ref column to the locations database table that stores the full entity ref of the corresponding kind: Location catalog entity for each registered location row. The value is pre-computed and persisted so that it no longer needs to be recomputed from the location's type and target on every read.ModelProcessor that validates catalog entities against the compiled catalog model schemas, and integrated it into the CatalogBuilder and CatalogPlugin. This processor is only activated if you explicitly add catalog model sources to your backend; there is no functional change for regular catalog usage.entityRef field with the stable entity reference for each location. The entityRef field is also filterable via POST /locations/by-query. Added PUT /locations/:id endpoint for updating the type and target of an existing location.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).PermissionAuthorizer support and the createPermissionIntegrationRouter fallback path from CatalogBuilder. The permissionsRegistry service is now required, and permissions is always a PermissionsService.addPermissions and addPermissionRules methods from CatalogBuilder, and removed the catalogPermissionExtensionPoint wiring from CatalogPlugin. Custom permission rules and permissions should be registered via coreServices.permissionsRegistry directly.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.assertError to toError for error handling.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).wait-for-expect to ^4.0.0.e5fcfcb: Added provideStaticCatalogModel that helps provide a static catalog model at startup.
056e18e: BREAKING ALPHA: Removed the deprecated CatalogPermissionRuleInput, CatalogPermissionExtensionPoint, and catalogPermissionExtensionPoint exports. Use coreServices.permissionsRegistry directly to register catalog entity permission rules and permissions.
c384fff: BREAKING PRODUCERS: Added updateLocation method to CatalogService for updating the type and target of an existing location. Any code that implements CatalogService must now provide this method.
7a03196: BREAKING ALPHA: Removed the following deprecated exports from @backstage/plugin-catalog-node/alpha:
catalogServiceRef — use catalogServiceRef from @backstage/plugin-catalog-node insteadCatalogLocationsExtensionPoint / catalogLocationsExtensionPoint — use the non-alpha equivalents from @backstage/plugin-catalog-node insteadCatalogProcessingExtensionPoint / catalogProcessingExtensionPoint — use the non-alpha equivalents from @backstage/plugin-catalog-node insteadCatalogAnalysisExtensionPoint / catalogAnalysisExtensionPoint — use the non-alpha equivalents from @backstage/plugin-catalog-node insteadPermissionedRoute component. Use RequirePermission instead.execute-template actions registry action that executes a scaffolder template with provided input values and returns a task ID for tracking progress.PermissionsRegistryService instead of the deprecated createPermissionIntegrationRouter. This fixes an issue where scaffolder permissions were not visible to RBAC plugins because the actionsRegistryServiceRef dependency caused an empty permissions metadata router to shadow the scaffolder's actual permission metadata. The old createPermissionIntegrationRouter path is retained as a fallback for standalone createRouter usage.assertError to toError for error handling.MetricsService from @backstage/backend-plugin-api/alpha instead of the raw @opentelemetry/api meter.after=0 in task events endpointexamples array from actions bridged via the actions registry.wait-for-expect to ^4.0.0.if filtering on output links and text items. Items where the if condition evaluates to false are now excluded from the task output.scaffolderCatalogModelLayer, a Template kind model layer with JSON Schema definition, serving as an example of how plugins can declare their own catalog entity kinds.if property to ScaffolderOutputLink and ScaffolderOutputText types, allowing template authors to conditionally include output links and text items.SignalService and DefaultSignalService exports. Use SignalsService and DefaultSignalsService instead.FetchMiddlewares.clarifyFailures() to the default fetch API middleware stack.assertError to toError for error handling.wait-for-expect to ^4.0.0.wrapServer where stopped servers weren't removed from the clean up list.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.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).assertError to toError for error handling.isDev export from the internal version module.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, where this lib is included in DOM by default.assertError to toError for error handling.undici from 7.22.0 to 7.24.0bootstrapEnvProxyAgents() in favor of Node.js built-in proxy support. Set NODE_USE_ENV_PROXY=1 alongside your HTTP_PROXY/HTTPS_PROXY environment variables instead. See the corporate proxy guide for details. This function will be removed in a future release.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).auth login clearing previously configured action sources and other instance metadata when re-authenticating.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).@mui/material/styles). These sub-path package.json files lack a version field, causing the bundler to emit "No version specified" warnings that fail CI builds.yarn pack operations to avoid packing packages and their dependencies simultaneously.embedded-postgres as the database for local development. Set backend.database.client to embedded-postgres in your app config to enable this. The embedded-postgres package must be installed as an explicit dependency in your project.assertError to toError for error handling.frontend-plugin to frontend-plugin-legacyassertError to toError for error handling.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).assertError to toError for error handling.assertError to toError for error handling.createRouteRef call.assertError to toError for error handling.create-app template: reorganizing sidebar items, removing redundant config and code, and adding a documentation example.mcp-actions-backend and plugin-auth plugins@backstage/cli-module-new dependency from the next-app template, since it is already included through @backstage/cli-defaults.next-app to default-app and default-app to legacy-app.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.createZodV4FilterPredicateSchema as a zod v4 counterpart to createZodV3FilterPredicateSchema.ForwardedError with a clear message.apis to BootstrapSpecializedApp and FinalizedSpecializedApp types.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.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).assertError to toError for error handling.peer-deps command to only require peer dependencies that are actually referenced by each package, rather than requiring all tracked peer dependencies for every package with any React dependency.peer-deps command.NODE_USE_ENV_PROXY instead of global-agent.a0100d4: Fixes occasional duplication of v5 class name prefix for MUI 5 components.
Documentation added to explain how to resolve missing v5 prefix in class names when using MUI 5 components in main app.
effa7bf: Migrated AppLanguageApi extension to use the new configSchema option.
e5baa20: 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:
app:
extensions:
- app/routes:
config:
redirects:
- from: /old-path
to: /new-path
9244b70: 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.
e4804ab: Updated the default DialogApi implementation to support the new open method. The dialog display layer no longer renders any dialog chrome — callers provide their own dialog component. The deprecated show and showModal methods now use open internally with a Material UI dialog wrapper for backward compatibility.
d66a3ec: Updated the PageLayout swap to pass a clickable titleLink on the PluginHeader, resolved from the plugin's root route ref.
Updated dependencies
PluginHeaderActionBlueprint usage to pass params as a plain object.assertError to toError for error handling.DialogApi.showModal to the new DialogApi.open method.EntityHeader extension, so the page layout header was redundant.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.assertError to toError for error handling.aboutCard.kindField.label translation key was added.humanizeEntityRef usage with the Catalog Presentation API.analyzeBitbucketCloudWebhookEvent function is exported from the alpha entry point for custom integrations.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.type-fest dev dependency, replacing its PartialDeep import with a local helper type in tests.GithubOrgEntityProvider and replaced the GraphQL client in GithubEntityProvider by this one as well, improving resilience against intermittent GitHub API failures.assertError to toError for error handling.README-alpha.md extension examples to use current APIs.title and icon to the new frontend system plugin definition.humanizeEntityRef with the Catalog Presentation API in CatalogGraphCard and CatalogGraphPage components for consistent entity display.showArrowHeads on page:catalog-graph and entity-card:catalog-graph/relations.title and icon to the new frontend system plugin definition.assertError to toError for error handling.humanizeEntityRef usage with the Catalog Presentation API.configSchema option with zod v4 schema values.assertError to toError for error handling.EntityInfoCard header overflowing on narrow screens.catalogApiMock to include the new updateLocation method stub, keeping it in sync with the CatalogApi interface.humanizeEntityRef and humanizeEntity in favor of the Catalog Presentation API. Use useEntityPresentation, EntityDisplayName, or entityPresentationApiRef instead.paginationOptions: { type: 'none' } instead of deriving page size from data length.InspectEntityDialog from Material UI to Backstage UI components. Added new translation keys: inspectEntityDialog.overviewPage.copyAriaLabel, inspectEntityDialog.overviewPage.copiedStatus, inspectEntityDialog.overviewPage.helpLinkAriaLabel, and inspectEntityDialog.colocatedPage.entityListAriaLabel.482ceed: Migrated from assertError to toError for error handling.
b6f1fae: The unprocessed entities view is now primarily intended for use as a tab within the DevTools plugin. The standalone page is still available but disabled by default. To re-enable it, add the following to your app-config.yaml:
app:
extensions:
- page:catalog-unprocessed-entities
Updated dependencies
assertError to toError for error handling.GooglePubSubConsumingEventPublisher and EventConsumingGooglePubSubPublisher to use the new alpha MetricsServicewait-for-expect to ^4.0.0.wait-for-expect to ^4.0.0.title and icon to the new frontend system plugin definition.assertError to toError for error handling..well-known/oauth-protected-resource resource URL to comply with
RFC 9728 Section 7.3. Enabling dynamic resource paths.title and icon to the new frontend system plugin definition.limit=0 in getNotifications query to return empty results instead of all notificationsnodemailer from 7.0.13 to 8.0.4assertError to toError for error handling.MembersListCard now prefers metadata.title over metadata.name when displaying the group membership card, similarly to the rest of the group profile cardsGroupProfileCard and UserProfileCard content overflowing on narrow screens.title and icon to the new frontend system plugin definition.humanizeEntityRef usage with the Catalog Presentation API.humanizeEntityRef usage with the Catalog Presentation API.297302e: Fixed the NFS custom field explorer so loaded form fields render field options and previews correctly.
864a799: Fix the display of the description in GitlabRepoPicker:
owner.description helper text outside the allowedOwners conditional so it renders for both Select and Autocomplete modes.Autocomplete label to use fields.gitlabRepoPicker.owner.inputTitle instead of fields.gitlabRepoPicker.owner.title.e5af44c: Replaced deprecated humanizeEntityRef usage with the Catalog Presentation API.
5d8112e: Migrated the actions page to use @backstage/ui list and search components. Actions are now presented in a sidebar list with a separate detail panel for the selected action, along with built-in search filtering. The selected action is also reflected in the URL hash, allowing deep-linking to a specific action.
4cc9af2: Fixed the layout of the scaffolder plugin in the new frontend system to use the new page layout.
a7a14b7: 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.
Updated dependencies
assertError to toError for error handling.jest-when dev dependency.PermissionResourceRef definitions for scaffolder resource types: scaffolderTemplatePermissionResourceRef, scaffolderActionPermissionResourceRef, and scaffolderTaskPermissionResourceRef. These are exported from @backstage/plugin-scaffolder-node/alpha.flatted from 3.4.1 to 3.4.2SearchModal leaving the page in a broken state by not restoring body overflow and aria-hidden attributes when closing.catalogServiceRef from @backstage/plugin-catalog-node/alpha to the stable catalogServiceRef from @backstage/plugin-catalog-node.assertError to toError for error handling.wait-for-expect to ^4.0.0.title and icon to the new frontend system plugin definition.Header and Container instead of legacy Page/Content/ContentHeader wrappers. Added a SupportButton as a plugin header action. Changed plugin title to "Documentation" and icon to RiArticleLine.humanizeEntityRef usage with the Catalog Presentation API.assertError to toError for error handling.catalogServiceRef from @backstage/plugin-catalog-node/alpha to the stable catalogServiceRef from @backstage/plugin-catalog-node.assertError to toError for error handling.