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/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/core-header-marker.md b/.changeset/core-header-marker.md new file mode 100644 index 0000000000..a523c6f0b7 --- /dev/null +++ b/.changeset/core-header-marker.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Added stable DOM markers to the legacy Page and Header so adjacent layout components can coordinate spacing without relying on generated class names. diff --git a/.changeset/create-app-1777391535.md b/.changeset/create-app-1777391535.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1777391535.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/create-app-1777992972.md b/.changeset/create-app-1777992972.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1777992972.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/devtools-refresh-after-scheduled-task-action.md b/.changeset/devtools-refresh-after-scheduled-task-action.md new file mode 100644 index 0000000000..07e4dc1f8a --- /dev/null +++ b/.changeset/devtools-refresh-after-scheduled-task-action.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-devtools': patch +--- + +Scheduled Tasks page now refreshes its table automatically after a task is triggered or cancelled, so the updated status is visible without reloading the browser. diff --git a/.changeset/eager-wolves-enjoy.md b/.changeset/eager-wolves-enjoy.md new file mode 100644 index 0000000000..7807cfafd2 --- /dev/null +++ b/.changeset/eager-wolves-enjoy.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-test-utils': patch +--- + +Added support for `ExternalRouteRef` in the `mountedRoutes` option of `renderInTestApp` and `renderTestApp`. diff --git a/.changeset/fancy-parents-sit.md b/.changeset/fancy-parents-sit.md new file mode 100644 index 0000000000..4bda11ae4a --- /dev/null +++ b/.changeset/fancy-parents-sit.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Added support for grouping options into sections in the Select component. You can now pass section objects with a `title` and a nested `options` array alongside (or instead of) regular options to render grouped dropdowns with section headers. + +**Affected components:** Select diff --git a/.changeset/feature-flag-invalid-warning.md b/.changeset/feature-flag-invalid-warning.md new file mode 100644 index 0000000000..590a4bf959 --- /dev/null +++ b/.changeset/feature-flag-invalid-warning.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-defaults': patch +--- + +Invalid feature flag declarations are now treated as warnings rather than errors, letting the app load normally. diff --git a/.changeset/fifty-clubs-play.md b/.changeset/fifty-clubs-play.md new file mode 100644 index 0000000000..33d4378e69 --- /dev/null +++ b/.changeset/fifty-clubs-play.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Updated the `list-scaffolder-tasks` action to support the new "status" filter parameter, allowing the action to return tasks matching a specific status. diff --git a/.changeset/fix-card-scroll-shadow.md b/.changeset/fix-card-scroll-shadow.md new file mode 100644 index 0000000000..53a1b28ee2 --- /dev/null +++ b/.changeset/fix-card-scroll-shadow.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Disabled `Card` scroll shadow in browsers that don't support `animation-timeline: scroll()`. Prevents the shadow from being always visible over the `CardBody` when there's nothing to scroll or the body is not scrolled. + +**Affected components:** Card diff --git a/.changeset/fix-cardbody-min-height.md b/.changeset/fix-cardbody-min-height.md new file mode 100644 index 0000000000..70019d273a --- /dev/null +++ b/.changeset/fix-cardbody-min-height.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Fixed `CardBody` showing an unwanted scrollbar when constrained below the scroll shadow height. + +**Affected components:** Card diff --git a/.changeset/fix-circular-self-imports.md b/.changeset/fix-circular-self-imports.md new file mode 100644 index 0000000000..b30dbc1b80 --- /dev/null +++ b/.changeset/fix-circular-self-imports.md @@ -0,0 +1,10 @@ +--- +'@backstage/frontend-plugin-api': patch +'@backstage/catalog-model': patch +'@backstage/core-plugin-api': patch +'@backstage/plugin-catalog-node': patch +'@backstage/plugin-kubernetes-common': patch +'@backstage/plugin-kubernetes-node': patch +--- + +Removed a handful of internal imports that referenced the package by its own name. Value imports were switched to relative paths, and type-only imports to `import type`. These self-referential imports could trigger circular initialization errors in bundled ESM and when the package was loaded via `jest.requireActual` — most visibly `Cannot access '_AppRootElementBlueprintesm' before initialization` from `@backstage/frontend-plugin-api`. There are no user-facing API changes. diff --git a/.changeset/fix-facets-perf-regression.md b/.changeset/fix-facets-perf-regression.md new file mode 100644 index 0000000000..71f293271a --- /dev/null +++ b/.changeset/fix-facets-perf-regression.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Fixed a performance regression in the `/entity-facets` endpoint when filters or permission conditions are applied, by routing the EXISTS-based filter through `final_entities` instead of correlating against the much larger `search` table. diff --git a/.changeset/fix-lockfile-removal-detection.md b/.changeset/fix-lockfile-removal-detection.md new file mode 100644 index 0000000000..3f7d9541ae --- /dev/null +++ b/.changeset/fix-lockfile-removal-detection.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli-node': patch +--- + +Fixed a bug in `PackageGraph.listChangedPackages` where removed dependencies were not detected during lockfile analysis. The dependency graph from the previous lockfile was not being merged, causing transitive dependency removals to be missed. diff --git a/.changeset/fix-scheduler-sleep-overflow.md b/.changeset/fix-scheduler-sleep-overflow.md new file mode 100644 index 0000000000..bf51ade22d --- /dev/null +++ b/.changeset/fix-scheduler-sleep-overflow.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Fixed scheduler `sleep` firing immediately for durations longer than ~24.8 days, caused by Node.js `setTimeout` overflowing its 32-bit millisecond limit. diff --git a/.changeset/fluffy-brooms-sniff.md b/.changeset/fluffy-brooms-sniff.md new file mode 100644 index 0000000000..dc89a26226 --- /dev/null +++ b/.changeset/fluffy-brooms-sniff.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend': patch +--- + +Added action for search backend to query search engine using the actions registry diff --git a/.changeset/funny-animals-prove.md b/.changeset/funny-animals-prove.md new file mode 100644 index 0000000000..e4116a8d23 --- /dev/null +++ b/.changeset/funny-animals-prove.md @@ -0,0 +1,5 @@ +--- +'@techdocs/cli': minor +--- + +Add support for disabling external font downloads via techdocs-cli `techdocs-cli generate --disableExternalFonts`, useful for air-gapped Backstage instances. diff --git a/.changeset/funny-areas-rescue.md b/.changeset/funny-areas-rescue.md new file mode 100644 index 0000000000..0b13201f82 --- /dev/null +++ b/.changeset/funny-areas-rescue.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': minor +--- + +Add support for flex item props (`grow`, `shrink`, and `basis`) to `Box`, `Card`, `Grid`, and `Flex` itself. + +**Affected components:** Box, Card, Grid, Flex diff --git a/.changeset/gitlab-integration-fetch-fixes.md b/.changeset/gitlab-integration-fetch-fixes.md new file mode 100644 index 0000000000..a00fa4d6fa --- /dev/null +++ b/.changeset/gitlab-integration-fetch-fixes.md @@ -0,0 +1,8 @@ +--- +'@backstage/integration': patch +--- + +Fixed two issues in the GitLab integration's fetch behavior: + +- The internal fetch wrapper was passing `mode: 'same-origin'` on every request. This had no practical effect server-side, but would have caused cross-origin requests to be rejected when the integration is used from a browser. Requests now use the default fetch mode and work correctly in both browser and Node environments. +- When retries are configured, transient network errors (such as dropped connections or DNS hiccups) are now retried using the same `maxRetries` and exponential delay as retryable HTTP status codes. Previously, a thrown fetch error would propagate immediately on the first failure regardless of the retry configuration. Caller-initiated aborts continue to surface immediately without being retried. diff --git a/.changeset/gold-friends-end.md b/.changeset/gold-friends-end.md new file mode 100644 index 0000000000..ddbe4cee8a --- /dev/null +++ b/.changeset/gold-friends-end.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-node': patch +--- + +Added optional `status` filter to `ScaffolderService.listTasks`, allowing callers to retrieve tasks matching a specific status. diff --git a/.changeset/header-improvements.md b/.changeset/header-improvements.md new file mode 100644 index 0000000000..961cb3c0c7 --- /dev/null +++ b/.changeset/header-improvements.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Added `description`, `tags`, and `metadata` props to the `Header` component. The `description` prop accepts a markdown string with support for inline links. The `tags` prop renders a row of text or link items above the title. The `metadata` prop renders key-value pairs below the description. The `breadcrumbs` prop has been deprecated and will be removed in a future release. + +**Affected components:** Header diff --git a/.changeset/header-sticky-prop.md b/.changeset/header-sticky-prop.md new file mode 100644 index 0000000000..b74af33ae0 --- /dev/null +++ b/.changeset/header-sticky-prop.md @@ -0,0 +1,9 @@ +--- +'@backstage/ui': minor +--- + +Added a `sticky` prop to the `Header` component. When `true`, the title-and-actions bar stays fixed to the top of its scroll container while the rest of the header (tags, description, metadata) scrolls away. The sticky bar background color automatically matches the container surface using the bg-consumer system. + +**BREAKING**: Removed the main header class from the `Header` component. Custom styles that target this class should be updated to target the component sections that remain. + +**Affected components:** Header diff --git a/.changeset/isolate-invalid-feature-flags.md b/.changeset/isolate-invalid-feature-flags.md new file mode 100644 index 0000000000..eb20fb85ca --- /dev/null +++ b/.changeset/isolate-invalid-feature-flags.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': patch +--- + +Invalid feature flag declarations no longer crash the app during bootstrap. They are now reported through the error collector and skipped, letting the rest of the app load normally. diff --git a/.changeset/kind-files-press.md b/.changeset/kind-files-press.md new file mode 100644 index 0000000000..edc19b7a76 --- /dev/null +++ b/.changeset/kind-files-press.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-techdocs-backend': minor +'@backstage/plugin-techdocs-node': minor +--- + +Add support for disabling external font downloads via app-config option `techdocs.generator.mkdocs.disableExternalFonts`, useful for air-gapped Backstage instances. diff --git a/.changeset/lazy-rings-end.md b/.changeset/lazy-rings-end.md new file mode 100644 index 0000000000..33c8dd4ccd --- /dev/null +++ b/.changeset/lazy-rings-end.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Added `always()` and `failure()` status check functions for scaffolder steps. These functions can be used in the if field of a step to control execution after failures. `always()` ensures a step runs regardless of previous step outcomes, while `failure()` runs a step only when a previous step has failed. diff --git a/.changeset/limit-remix-icon-version.md b/.changeset/limit-remix-icon-version.md new file mode 100644 index 0000000000..4779d41f17 --- /dev/null +++ b/.changeset/limit-remix-icon-version.md @@ -0,0 +1,17 @@ +--- +'@backstage/ui': patch +'@backstage/plugin-api-docs': patch +'@backstage/plugin-app': patch +'@backstage/plugin-app-visualizer': patch +'@backstage/plugin-auth': patch +'@backstage/plugin-catalog-graph': patch +'@backstage/plugin-catalog-import': patch +'@backstage/plugin-catalog-react': patch +'@backstage/plugin-notifications': patch +'@backstage/plugin-org': patch +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-signals': patch +'@backstage/plugin-techdocs': patch +--- + +Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. diff --git a/.changeset/link-focus-visible.md b/.changeset/link-focus-visible.md new file mode 100644 index 0000000000..34c7f3e496 --- /dev/null +++ b/.changeset/link-focus-visible.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Fix `Card href=...` not showing a focus indicator on keyboard navigation. `Link` now composes `useFocusRing`, emits `data-focus-visible`, and renders a `--bui-ring` outline when keyboard-focused. The Card's existing focus-ring CSS matches when the trigger is focused. + +_Affected components_: Card, Link diff --git a/.changeset/many-tools-take.md b/.changeset/many-tools-take.md new file mode 100644 index 0000000000..dca11a68de --- /dev/null +++ b/.changeset/many-tools-take.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-react': patch +--- + +Added optional clustersCacheTtlMs option to KubernetesBackendClient that caches getClusters() responses for the specified duration, avoiding repeated /clusters requests when multiple proxy calls resolve cluster auth in quick succession. diff --git a/.changeset/mean-monkeys-create.md b/.changeset/mean-monkeys-create.md new file mode 100644 index 0000000000..d2f2571b46 --- /dev/null +++ b/.changeset/mean-monkeys-create.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Added invalid-state styling for Checkbox and corresponding Storybook variants for verification. + +**Affected components:** Checkbox, CheckboxGroup diff --git a/.changeset/msgraph-incremental-initial.md b/.changeset/msgraph-incremental-initial.md new file mode 100644 index 0000000000..6f41346a12 --- /dev/null +++ b/.changeset/msgraph-incremental-initial.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-msgraph-incremental': minor +--- + +Introduces a cursor-based incremental ingestion provider for Microsoft Graph that processes users and groups one page at a time. Unlike `MicrosoftGraphOrgEntityProvider`, this module never holds the full dataset in memory — each burst processes a single page (up to 999 users or 100 groups). The `@odata.nextLink` cursor is persisted so a pod restart resumes from the last completed page rather than starting over. diff --git a/.changeset/owner-column-cleanup.md b/.changeset/owner-column-cleanup.md new file mode 100644 index 0000000000..709f74f781 --- /dev/null +++ b/.changeset/owner-column-cleanup.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Simplified the `OwnerEntityColumn` in the task list to rely on `EntityRefLink` and the entity presentation API instead of manually fetching entities from the catalog. diff --git a/.changeset/plugin-header-spacing.md b/.changeset/plugin-header-spacing.md new file mode 100644 index 0000000000..a1c370ea19 --- /dev/null +++ b/.changeset/plugin-header-spacing.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Adjusted PluginHeader spacing and borders so headers with and without tabs align more consistently with surrounding page content, including when paired with page headers. + +**Affected components:** PluginHeader, Header diff --git a/.changeset/pre.json b/.changeset/pre.json index 2b8754aea1..83983c7741 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -223,7 +223,79 @@ "@backstage/plugin-techdocs-react": "1.3.10", "@backstage/plugin-user-settings": "0.9.2", "@backstage/plugin-user-settings-backend": "0.4.2", - "@backstage/plugin-user-settings-common": "0.1.0" + "@backstage/plugin-user-settings-common": "0.1.0", + "@backstage/plugin-catalog-backend-module-msgraph-incremental": "0.0.0" }, - "changesets": [] + "changesets": [ + "add-missing-transitive-deps", + "add-no-self-package-imports-lint-rule", + "add-service-unavailable-error-name", + "brave-groups-learn", + "bui-bg-inherit-css-var", + "chubby-candies-cry", + "clamp-react-aria-deps", + "core-header-marker", + "create-app-1777391535", + "create-app-1777992972", + "deduplicate-joinpaths-routing", + "delegate-attach-mock-api-factory", + "devtools-refresh-after-scheduled-task-action", + "eager-wolves-enjoy", + "extension-point-middleware-backend-app-api", + "extension-point-middleware-backend-defaults", + "fancy-parents-sit", + "feature-flag-invalid-warning", + "fifty-clubs-play", + "fix-alter-target-nullability", + "fix-card-scroll-shadow", + "fix-cardbody-min-height", + "fix-circular-self-imports", + "fix-dialog-dark-theme-selector", + "fix-embedded-postgres-config-paths", + "fix-facets-perf-regression", + "fix-implicit-any-renderInTestApp", + "fix-lockfile-removal-detection", + "fix-scheduler-sleep-overflow", + "fix-tabs-active-indicator-disappearing", + "fix-widget-resize-after-edit", + "fluffy-brooms-sniff", + "free-ways-flow", + "funny-animals-prove", + "funny-areas-rescue", + "gitlab-integration-fetch-fixes", + "gold-drinks-poke", + "gold-friends-end", + "header-improvements", + "header-sticky-prop", + "isolate-invalid-feature-flags", + "kind-files-press", + "lazy-rings-end", + "limit-remix-icon-version", + "link-focus-visible", + "mean-monkeys-create", + "move-registermswtesthooks-to-test-utils", + "msgraph-incremental-initial", + "owner-column-cleanup", + "plugin-header-spacing", + "preserve-external-hrefs-useDefinition", + "purple-insects-cross", + "remove-duplicate-deps", + "remove-portable-schema-deprecated-prop", + "remove-unused-deps", + "remove-unused-getgithubintegrationconfig", + "remove-uuid-dependency", + "replace-duplicate-error-utilities", + "shy-ways-lay", + "slack-scope-message-updates", + "swappable-notification-description", + "tough-pots-dream", + "ui-date-range-picker", + "unprocessed-entities-read-auth-check", + "unprocessed-entities-read-permission", + "upgrade-module-federation-v2", + "usetable-complete-debounce", + "whole-bees-wave", + "zod-v3-config-schema-docs", + "zod-v4-dep-bump" + ] } diff --git a/.changeset/preserve-external-hrefs-useDefinition.md b/.changeset/preserve-external-hrefs-useDefinition.md new file mode 100644 index 0000000000..b33e5db3ef --- /dev/null +++ b/.changeset/preserve-external-hrefs-useDefinition.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Fixed external URLs in BUI link components being rewritten as in-app paths when the app is served under a non-root base path. Absolute URLs (`http://`, `https://`, `//`, `mailto:`, `tel:`) are now passed through unchanged. Internal `href` values are resolved against the current `basename` exactly once, which also fixes a latent issue where internal link clicks under a non-root base path could navigate to a URL with the `basename` prefix doubled. + +**Affected components:** ButtonLink, Card, Link, Menu, Tab, Table, Tag diff --git a/.changeset/purple-insects-cross.md b/.changeset/purple-insects-cross.md new file mode 100644 index 0000000000..d0371e18ed --- /dev/null +++ b/.changeset/purple-insects-cross.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-devtools': patch +--- + +Migrated `ConfigContent` component from Material UI to Backstage UI (BUI). diff --git a/.changeset/remove-uuid-dependency.md b/.changeset/remove-uuid-dependency.md new file mode 100644 index 0000000000..b32c5a846d --- /dev/null +++ b/.changeset/remove-uuid-dependency.md @@ -0,0 +1,33 @@ +--- +'@backstage/backend-defaults': patch +'@backstage/backend-test-utils': patch +'@backstage/cli-module-new': patch +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch +'@backstage/plugin-auth-node': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-catalog-backend-module-aws': patch +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/plugin-catalog-backend-module-backstage-openapi': patch +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +'@backstage/plugin-catalog-backend-module-bitbucket-server': patch +'@backstage/plugin-catalog-backend-module-gerrit': patch +'@backstage/plugin-catalog-backend-module-gitea': patch +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/plugin-catalog-backend-module-gitlab': patch +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +'@backstage/plugin-catalog-backend-module-ldap': patch +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-catalog-backend-module-puppetdb': patch +'@backstage/plugin-notifications-backend': patch +'@backstage/plugin-permission-common': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-search-backend-module-elasticsearch': patch +'@backstage/plugin-search-backend-module-pg': patch +'@backstage/plugin-search-backend-node': patch +'@backstage/plugin-search-react': patch +'@backstage/plugin-signals': patch +'@backstage/plugin-signals-backend': patch +--- + +Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. diff --git a/.changeset/swappable-notification-description.md b/.changeset/swappable-notification-description.md new file mode 100644 index 0000000000..abfa470035 --- /dev/null +++ b/.changeset/swappable-notification-description.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications': patch +--- + +The notification description used in the notifications table is now a swappable component, so that apps can replace its rendering with a custom implementation. diff --git a/.changeset/tough-pots-dream.md b/.changeset/tough-pots-dream.md new file mode 100644 index 0000000000..0bdc1500a9 --- /dev/null +++ b/.changeset/tough-pots-dream.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-node': patch +--- + +Fixed bug causing `--legacyCopyReadmeMdToIndexMd` option to fail if docs directory is not present diff --git a/.changeset/ui-date-range-picker.md b/.changeset/ui-date-range-picker.md new file mode 100644 index 0000000000..e69da8d7f9 --- /dev/null +++ b/.changeset/ui-date-range-picker.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Added new `DateRangePicker` component — combines two date fields and a calendar popover for selecting a date range, built on React Aria with full keyboard and screen reader accessibility. Uses BUI design tokens throughout, including auto-incremented backgrounds via the bg consumer pattern. diff --git a/.changeset/unprocessed-entities-read-auth-check.md b/.changeset/unprocessed-entities-read-auth-check.md new file mode 100644 index 0000000000..1ca21079f2 --- /dev/null +++ b/.changeset/unprocessed-entities-read-auth-check.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-unprocessed': patch +--- + +Added permission authorization checks to the unprocessed entities read endpoints for pending and failed entities. diff --git a/.changeset/unprocessed-entities-read-permission.md b/.changeset/unprocessed-entities-read-permission.md new file mode 100644 index 0000000000..d1470586ef --- /dev/null +++ b/.changeset/unprocessed-entities-read-permission.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-unprocessed-entities-common': patch +--- + +Added `unprocessedEntitiesReadPermission` for authorizing read access to unprocessed entity endpoints. diff --git a/.changeset/usetable-complete-debounce.md b/.changeset/usetable-complete-debounce.md new file mode 100644 index 0000000000..2b6cd564da --- /dev/null +++ b/.changeset/usetable-complete-debounce.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Added `searchDebounceMs` and `filterDebounceMs` options to `useTable` in `complete` mode. Both default to `0` (no debounce, no observable change for existing consumers); set them to defer the client-side filter/search/sort pipeline on large datasets without reimplementing input-layer debouncing. The controlled `search` / `onSearchChange` and `filter` / `onFilterChange` callbacks continue to fire on every change. + +**Affected components:** Table diff --git a/.changeset/warm-pumas-beam.md b/.changeset/warm-pumas-beam.md new file mode 100644 index 0000000000..83ac3f2c3c --- /dev/null +++ b/.changeset/warm-pumas-beam.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-auth': patch +--- + +Improved the OAuth consent dialog for MCP authorization by showing more client details, including the client metadata host for CIMD clients, the metadata URL, callback URL, and requested scopes. diff --git a/.changeset/whole-bees-wave.md b/.changeset/whole-bees-wave.md new file mode 100644 index 0000000000..34a4b6b9c4 --- /dev/null +++ b/.changeset/whole-bees-wave.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Added a new `Combobox` component. It pairs a text input with a filterable dropdown of options and supports single selection, sectioned options, icons, sizes, and custom typed values via `allowsCustomValue`. + +**Affected components:** Combobox diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7e5cc36bdf..c91f17fb23 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -58,6 +58,7 @@ yarn.lock @backstage/maintainers @backst /plugins/catalog-backend-module-backstage-openapi @backstage/maintainers @backstage/openapi-tooling-maintainers /plugins/catalog-backend-module-gitea @backstage/maintainers @backstage/catalog-maintainers /plugins/catalog-backend-module-msgraph @backstage/maintainers @backstage/catalog-maintainers @pjungermann +/plugins/catalog-backend-module-msgraph-incremental @backstage/maintainers @backstage/catalog-maintainers /plugins/catalog-backend-module-puppetdb @backstage/maintainers @backstage/catalog-maintainers /plugins/catalog-graph @backstage/maintainers @backstage/catalog-maintainers @backstage/sda-se-reviewers /plugins/devtools @backstage/maintainers @awanlin diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index 353f878ae2..8549c058a6 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -75,6 +75,7 @@ codemod codemods codeowners codescene +Combobox composability composable config @@ -102,6 +103,7 @@ dayjs debounce debounced debounces +debouncing debuggability declaratively deduplicate @@ -345,6 +347,7 @@ params parseable passthrough passwordless +patcher Patrik pattison Peloton @@ -590,4 +593,4 @@ Zhou zod Zolotusky zoomable -zsh +zsh \ No newline at end of file diff --git a/.patches/pr-33721.txt b/.patches/pr-33721.txt new file mode 100644 index 0000000000..a4c71542c3 --- /dev/null +++ b/.patches/pr-33721.txt @@ -0,0 +1 @@ +Fix home page widgets not being draggable or resizable after the first save diff --git a/.patches/pr-33908.txt b/.patches/pr-33908.txt deleted file mode 100644 index 5d0dd14d5a..0000000000 --- a/.patches/pr-33908.txt +++ /dev/null @@ -1 +0,0 @@ -Make TechDocs sidebar positioning configurable via CSS custom properties \ No newline at end of file diff --git a/.patches/pr-33952.txt b/.patches/pr-33952.txt deleted file mode 100644 index 3244566d2e..0000000000 --- a/.patches/pr-33952.txt +++ /dev/null @@ -1 +0,0 @@ -Bump zod dependency to v4 for packages using configSchema and clarify that zod/v4 subpath from v3 is not supported \ No newline at end of file diff --git a/.patches/pr-33975.txt b/.patches/pr-33975.txt deleted file mode 100644 index 5cc55be263..0000000000 --- a/.patches/pr-33975.txt +++ /dev/null @@ -1 +0,0 @@ -Clamp React Aria dependency ranges to patch-only updates to prevent unintended minor version upgrades \ No newline at end of file diff --git a/.patches/pr-33984.txt b/.patches/pr-33984.txt deleted file mode 100644 index 522b8121d9..0000000000 --- a/.patches/pr-33984.txt +++ /dev/null @@ -1 +0,0 @@ -Fix active tab indicator disappearing on uncontrolled Tabs in @backstage/ui \ No newline at end of file diff --git a/.patches/pr-34001.txt b/.patches/pr-34001.txt new file mode 100644 index 0000000000..760a059e5f --- /dev/null +++ b/.patches/pr-34001.txt @@ -0,0 +1 @@ +Fix facets endpoint performance regression when filters or permissions are applied diff --git a/.patches/pr-34004.txt b/.patches/pr-34004.txt new file mode 100644 index 0000000000..506fd76855 --- /dev/null +++ b/.patches/pr-34004.txt @@ -0,0 +1 @@ +Preserve external hrefs in BUI link components under non-root base path \ No newline at end of file diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 916c48951d..eb0b111bc9 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -50,26 +50,11 @@ export default definePreview({ dynamicTitle: true, }, }, - background: { - name: 'Background', - description: 'Global background for components', - defaultValue: 'app', - toolbar: { - icon: 'contrast', - items: [ - { value: 'app', title: 'App Background' }, - { value: 'neutral-1', title: 'Neutral 1 Background' }, - { value: 'neutral-2', title: 'Neutral 2 Background' }, - { value: 'neutral-3', title: 'Neutral 3 Background' }, - ], - }, - }, }, initialGlobals: { themeMode: 'light', themeName: 'backstage', - background: 'app', }, parameters: { @@ -143,7 +128,6 @@ export default definePreview({ globals.themeMode === 'light' ? themes.light : themes.dark; const selectedThemeMode = globals.themeMode || 'light'; const selectedThemeName = globals.themeName || 'backstage'; - const selectedBackground = globals.background || 'app'; const isFullscreen = context.parameters.layout === 'fullscreen'; useEffect(() => { @@ -155,15 +139,13 @@ export default definePreview({ document.body.removeAttribute('data-theme-mode'); document.body.removeAttribute('data-theme-name'); }; - }, [selectedTheme, selectedThemeName]); + }, [selectedThemeMode, selectedThemeName]); useEffect(() => { appThemeApi.setActiveThemeId(selectedThemeMode); }, [selectedThemeMode]); document.body.style.backgroundColor = 'var(--bui-bg-app)'; - document.body.style.padding = - isFullscreen && selectedBackground !== 'app' ? '1rem' : ''; const docsStoryElements = document.getElementsByClassName('docs-story'); Array.from(docsStoryElements).forEach(element => { (element as HTMLElement).style.backgroundColor = 'var(--bui-bg-app)'; @@ -174,18 +156,23 @@ export default definePreview({ {/* @ts-ignore */} - {Array.from({ - length: - selectedBackground === 'app' - ? 0 - : parseInt(selectedBackground.split('-')[1], 10), - }).reduce( - children => ( - - {children} - - ), - , + {selectedThemeName === 'spotify' ? ( + + + + ) : ( + )} diff --git a/.storybook/themes/spotify.css b/.storybook/themes/spotify.css index 30aa0274d0..7a34299817 100644 --- a/.storybook/themes/spotify.css +++ b/.storybook/themes/spotify.css @@ -190,10 +190,6 @@ .bui-Tag { border-radius: var(--bui-radius-full); } - - .bui-Container { - padding-inline: 0; - } } [data-theme-mode='light'][data-theme-name='spotify'] { @@ -243,24 +239,3 @@ --bui-ring: rgba(255, 255, 255, 0.2); } - -/* - * Plugin header (@backstage/ui) and story shell header — kept at the bottom of - * this file for easier scanning alongside other component overrides above. - */ -[data-theme-name='spotify'] { - .bui-PluginHeaderToolbar { - padding: 0; - height: 32px; - border: none; - background: none; - margin-bottom: var(--bui-space-2); - } - - .bui-PluginHeaderTabsWrapper { - padding: 0; - border: none; - background: none; - margin-left: -8px; - } -} diff --git a/app-config.yaml b/app-config.yaml index 86391154f3..8c93e85f68 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -191,6 +191,7 @@ backend: pluginSources: - catalog - scaffolder + - search # See README.md in the proxy-backend plugin for information on the configuration format proxy: endpoints: diff --git a/docs-ui/package.json b/docs-ui/package.json index 30b6d28b45..40c5b5bd6f 100644 --- a/docs-ui/package.json +++ b/docs-ui/package.json @@ -11,6 +11,7 @@ "sync:changelog:force": "node scripts/sync-changelog.mjs --force" }, "resolutions": { + "@remixicon/react": ">=4.6.0 <4.9.0", "@types/react": "19.2.10", "@types/react-dom": "19.2.3" }, @@ -22,13 +23,13 @@ "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", "@next/mdx": "16.2.1", - "@remixicon/react": "^4.6.0", + "@remixicon/react": ">=4.6.0 <4.9.0", "@uiw/codemirror-themes": "^4.23.7", "@uiw/react-codemirror": "^4.23.7", "clsx": "^2.1.1", "html-react-parser": "^5.2.5", "motion": "^12.4.1", - "next": "16.2.1", + "next": "16.2.3", "next-mdx-remote-client": "^2.1.2", "prop-types": "^15.8.1", "react": "19.2.4", @@ -44,7 +45,7 @@ "@types/react-dom": "19.2.3", "eslint": "^9", "eslint-config-next": "16.2.1", - "postcss": "^8.5.6", + "postcss": "^8.5.10", "postcss-import": "^16.1.1", "typescript": "^5", "unified": "^11.0.4" diff --git a/docs-ui/src/app/components/alert/components.tsx b/docs-ui/src/app/components/alert/components.tsx index afc5eb654c..2df11d4a3a 100644 --- a/docs-ui/src/app/components/alert/components.tsx +++ b/docs-ui/src/app/components/alert/components.tsx @@ -119,20 +119,20 @@ export const WithActionsAndDescriptions = () => { ); }; -export const LoadingStates = () => { +export const PendingStates = () => { return ( - + diff --git a/docs-ui/src/app/components/alert/page.mdx b/docs-ui/src/app/components/alert/page.mdx index cdfdf184e0..3df813b7e9 100644 --- a/docs-ui/src/app/components/alert/page.mdx +++ b/docs-ui/src/app/components/alert/page.mdx @@ -8,7 +8,7 @@ import { statusVariantsSnippet, withDescriptionSnippet, withActionsSnippet, - loadingStatesSnippet, + pendingStatesSnippet, withoutIconsSnippet, customIconSnippet, } from './snippets'; @@ -17,7 +17,7 @@ import { StatusVariants, WithDescription, WithActions, - LoadingStates, + PendingStates, WithoutIcons, CustomIcon, } from './components'; @@ -79,16 +79,16 @@ Include custom actions like buttons for interactive alerts. code={withActionsSnippet} /> -### Loading States +### Pending State -The loading spinner replaces the icon to indicate an ongoing process. +The pending spinner replaces the icon to indicate an ongoing process. } - code={loadingStatesSnippet} + preview={} + code={pendingStatesSnippet} /> ### Without Icons diff --git a/docs-ui/src/app/components/alert/props-definition.ts b/docs-ui/src/app/components/alert/props-definition.ts index 6f2650fe42..85b6e021c1 100644 --- a/docs-ui/src/app/components/alert/props-definition.ts +++ b/docs-ui/src/app/components/alert/props-definition.ts @@ -10,31 +10,45 @@ export const alertPropDefs: Record = { values: ['info', 'success', 'warning', 'danger'], responsive: true, default: 'info', + description: + 'Visual status of the alert, which determines color and default icon.', }, icon: { type: 'enum', values: ['boolean', 'React.ReactElement'], responsive: false, + description: + 'Set to true to show the default status icon, or pass a custom icon element. Set to false to hide the icon.', + }, + isPending: { + type: 'boolean', + default: 'false', + description: + 'Replaces the icon with a spinner to indicate a pending operation.', }, loading: { - type: 'enum', - values: ['boolean'], - responsive: false, + type: 'boolean', + default: 'false', + description: 'Deprecated. Use `isPending` instead.', }, title: { type: 'enum', values: ['React.ReactNode'], responsive: false, + description: 'Primary message displayed in the alert.', }, description: { type: 'enum', values: ['React.ReactNode'], responsive: false, + description: 'Additional detail shown below the title.', }, customActions: { type: 'enum', values: ['React.ReactNode'], responsive: false, + description: + 'Custom action buttons displayed on the right side of the alert.', }, m: { type: 'enum', diff --git a/docs-ui/src/app/components/alert/snippets.ts b/docs-ui/src/app/components/alert/snippets.ts index 739dfde9db..aa4f05ed1c 100644 --- a/docs-ui/src/app/components/alert/snippets.ts +++ b/docs-ui/src/app/components/alert/snippets.ts @@ -97,13 +97,13 @@ export const withActionsAndDescriptionsSnippet = ``; -export const loadingStatesSnippet = ` - - +export const pendingStatesSnippet = ` + + diff --git a/docs-ui/src/app/components/button-icon/components.tsx b/docs-ui/src/app/components/button-icon/components.tsx index 3ed421289c..ba376549d2 100644 --- a/docs-ui/src/app/components/button-icon/components.tsx +++ b/docs-ui/src/app/components/button-icon/components.tsx @@ -56,12 +56,12 @@ export const Disabled = () => { ); }; -export const Loading = () => { +export const Pending = () => { return ( } variant="primary" - loading + isPending aria-label="Cloud" /> ); diff --git a/docs-ui/src/app/components/button-icon/page.mdx b/docs-ui/src/app/components/button-icon/page.mdx index 51ff0ea5a0..6f4678d29c 100644 --- a/docs-ui/src/app/components/button-icon/page.mdx +++ b/docs-ui/src/app/components/button-icon/page.mdx @@ -7,9 +7,9 @@ import { variantsSnippet, sizesSnippet, disabledSnippet, - loadingSnippet, + isPendingSnippet, } from './snippets'; -import { Variants, Sizes, Disabled, Loading } from './components'; +import { Variants, Sizes, Disabled, Pending } from './components'; import { PageTitle } from '@/components/PageTitle'; import { Theming } from '@/components/Theming'; import { ButtonIconDefinition } from '../../../utils/definitions'; @@ -63,7 +63,7 @@ export const reactAriaUrls = { code={disabledSnippet} /> -### Loading +### Pending Shows a spinner during async operations. @@ -71,8 +71,8 @@ Shows a spinner during async operations. align="center" py={4} open - preview={} - code={loadingSnippet} + preview={} + code={isPendingSnippet} /> diff --git a/docs-ui/src/app/components/button-icon/props-definition.tsx b/docs-ui/src/app/components/button-icon/props-definition.tsx index 05917cc2b4..d0b9a5717c 100644 --- a/docs-ui/src/app/components/button-icon/props-definition.tsx +++ b/docs-ui/src/app/components/button-icon/props-definition.tsx @@ -42,11 +42,16 @@ export const buttonIconPropDefs: Record = { default: 'false', description: 'Prevents interaction and applies disabled styling.', }, - loading: { + isPending: { type: 'boolean', default: 'false', description: 'Shows a spinner and disables the button.', }, + loading: { + type: 'boolean', + default: 'false', + description: 'Deprecated. Use `isPending` instead.', + }, type: { type: 'enum', values: ['button', 'submit', 'reset'], diff --git a/docs-ui/src/app/components/button-icon/snippets.ts b/docs-ui/src/app/components/button-icon/snippets.ts index b1ab27b77b..46e2eb2ab8 100644 --- a/docs-ui/src/app/components/button-icon/snippets.ts +++ b/docs-ui/src/app/components/button-icon/snippets.ts @@ -20,4 +20,4 @@ export const disabledSnippet = ` } variant="tertiary" aria-label="Cloud" /> `; -export const loadingSnippet = `} variant="primary" loading aria-label="Cloud" />`; +export const isPendingSnippet = `} variant="primary" isPending aria-label="Cloud" />`; diff --git a/docs-ui/src/app/components/button/components.tsx b/docs-ui/src/app/components/button/components.tsx index 1fe13f6630..5829bd978e 100644 --- a/docs-ui/src/app/components/button/components.tsx +++ b/docs-ui/src/app/components/button/components.tsx @@ -75,9 +75,9 @@ export const Destructive = () => { ); }; -export const Loading = () => { +export const Pending = () => { return ( - ); diff --git a/docs-ui/src/app/components/button/page.mdx b/docs-ui/src/app/components/button/page.mdx index 6434a7f4a4..765c3a0bef 100644 --- a/docs-ui/src/app/components/button/page.mdx +++ b/docs-ui/src/app/components/button/page.mdx @@ -8,7 +8,7 @@ import { withIconsSnippet, disabledSnippet, destructiveSnippet, - loadingSnippet, + isPendingSnippet, asLinkSnippet, buttonSnippetUsage, buttonResponsiveSnippet, @@ -24,17 +24,17 @@ import { WithIcons, Disabled, Destructive, - Loading, + Pending, AsLink, } from './components'; export const reactAriaUrls = { - button: 'https://react-spectrum.adobe.com/react-aria/Button.html', + button: 'https://react-aria.adobe.com/Button', }; } code={variantsSnippet} /> @@ -110,7 +110,7 @@ Use the `destructive` prop for dangerous actions like delete or remove. layout="side-by-side" /> -### Loading +### Pending Shows a spinner and disables interaction during async operations. @@ -118,8 +118,8 @@ Shows a spinner and disables interaction during async operations. align="center" py={4} open - preview={} - code={loadingSnippet} + preview={} + code={isPendingSnippet} layout="side-by-side" /> diff --git a/docs-ui/src/app/components/button/props-definition.tsx b/docs-ui/src/app/components/button/props-definition.tsx index 0f94fcffaf..3c82a59bb4 100644 --- a/docs-ui/src/app/components/button/props-definition.tsx +++ b/docs-ui/src/app/components/button/props-definition.tsx @@ -48,11 +48,16 @@ export const buttonPropDefs: Record = { default: 'false', description: 'Prevents interaction and applies disabled styling.', }, - loading: { + isPending: { type: 'boolean', default: 'false', description: 'Shows a spinner and disables the button.', }, + loading: { + type: 'boolean', + default: 'false', + description: 'Deprecated. Use `isPending` instead.', + }, children: { type: 'enum', values: ['ReactNode'], diff --git a/docs-ui/src/app/components/button/snippets.ts b/docs-ui/src/app/components/button/snippets.ts index 6b8aba7e26..2af42df2a7 100644 --- a/docs-ui/src/app/components/button/snippets.ts +++ b/docs-ui/src/app/components/button/snippets.ts @@ -55,7 +55,7 @@ export const destructiveSnippet = ` `; -export const loadingSnippet = ``; diff --git a/docs-ui/src/app/components/combobox/components.tsx b/docs-ui/src/app/components/combobox/components.tsx new file mode 100644 index 0000000000..74c6799dc7 --- /dev/null +++ b/docs-ui/src/app/components/combobox/components.tsx @@ -0,0 +1,151 @@ +'use client'; + +import { Combobox } from '../../../../../packages/ui/src/components/Combobox/Combobox'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { RiCloudLine } from '@remixicon/react'; + +const fontOptions = [ + { value: 'sans', label: 'Sans-serif' }, + { value: 'serif', label: 'Serif' }, + { value: 'mono', label: 'Monospace' }, + { value: 'cursive', label: 'Cursive' }, +]; + +const countries = [ + { value: 'us', label: 'United States' }, + { value: 'ca', label: 'Canada' }, + { value: 'mx', label: 'Mexico' }, + { value: 'uk', label: 'United Kingdom' }, + { value: 'fr', label: 'France' }, + { value: 'de', label: 'Germany' }, + { value: 'it', label: 'Italy' }, + { value: 'es', label: 'Spain' }, + { value: 'jp', label: 'Japan' }, + { value: 'cn', label: 'China' }, + { value: 'in', label: 'India' }, + { value: 'br', label: 'Brazil' }, + { value: 'au', label: 'Australia' }, +]; + +const sectionedFonts = [ + { + title: 'Serif Fonts', + options: [ + { value: 'times', label: 'Times New Roman' }, + { value: 'georgia', label: 'Georgia' }, + { value: 'garamond', label: 'Garamond' }, + ], + }, + { + title: 'Sans-Serif Fonts', + options: [ + { value: 'arial', label: 'Arial' }, + { value: 'helvetica', label: 'Helvetica' }, + { value: 'verdana', label: 'Verdana' }, + ], + }, + { + title: 'Monospace Fonts', + options: [ + { value: 'courier', label: 'Courier New' }, + { value: 'consolas', label: 'Consolas' }, + { value: 'fira', label: 'Fira Code' }, + ], + }, +]; + +export const Preview = () => ( + +); + +export const WithLabelAndDescription = () => ( + +); + +export const Sizes = () => ( + + + + +); + +export const WithIcon = () => ( + } + style={{ width: 300 }} + /> +); + +export const Disabled = () => ( + +); + +export const AllowsCustomValue = () => ( + +); + +export const DisabledOption = () => ( + +); + +export const WithSections = () => ( + +); diff --git a/docs-ui/src/app/components/combobox/page.mdx b/docs-ui/src/app/components/combobox/page.mdx new file mode 100644 index 0000000000..d579e1ffbb --- /dev/null +++ b/docs-ui/src/app/components/combobox/page.mdx @@ -0,0 +1,153 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { + Preview, + WithLabelAndDescription, + Sizes, + WithIcon, + Disabled, + DisabledOption, + AllowsCustomValue, + WithSections, +} from './components'; +import { comboboxPropDefs } from './props-definition'; +import { + optionPropDefs, + optionSectionPropDefs, +} from '../select/props-definition'; +import { + comboboxUsageSnippet, + comboboxDefaultSnippet, + comboboxDescriptionSnippet, + comboboxSizesSnippet, + comboboxDisabledSnippet, + comboboxResponsiveSnippet, + comboboxIconSnippet, + comboboxDisabledOptionsSnippet, + comboboxCustomValueSnippet, + comboboxSectionsSnippet, +} from './snippets'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { ComboboxDefinition } from '../../../utils/definitions'; + +export const reactAriaUrls = { + combobox: 'https://react-aria.adobe.com/ComboBox', +}; + + + +} + code={comboboxDefaultSnippet} +/> + +## Usage + + + +## API reference + + + + + +### Option types + +The `options` prop accepts an array containing either of the following shapes. + +#### `Option` + + + +#### `OptionSection` + + + +## Examples + +### Label and description + +} + code={comboboxDescriptionSnippet} +/> + +### Sizes + +} + code={comboboxSizesSnippet} +/> + +### With icon + +} + code={comboboxIconSnippet} +/> + +### Disabled + +} + code={comboboxDisabledSnippet} +/> + +### Disabled options + +} + code={comboboxDisabledOptionsSnippet} +/> + +### Custom values + +Allow the user to type a value that is not in the option list by setting `allowsCustomValue`. + +} + code={comboboxCustomValueSnippet} +/> + +### With sections + +Group options under section headings by passing objects with a `title` and a +nested `options` array. + +} + code={comboboxSectionsSnippet} +/> + +### Responsive + +Size can change at different breakpoints. + + + + + + diff --git a/docs-ui/src/app/components/combobox/props-definition.tsx b/docs-ui/src/app/components/combobox/props-definition.tsx new file mode 100644 index 0000000000..08499cc40b --- /dev/null +++ b/docs-ui/src/app/components/combobox/props-definition.tsx @@ -0,0 +1,113 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const comboboxPropDefs: Record = { + options: { + type: 'enum', + values: ['(Option | OptionSection)[]'], + description: ( + <> + Options to display in the dropdown. Pass Option objects + directly, or OptionSection objects to render grouped + options under section headings. + + ), + }, + allowsCustomValue: { + type: 'boolean', + default: 'false', + description: + 'When true, the typed text is accepted as the value on blur or Enter even if it does not match any option.', + }, + value: { + type: 'string', + description: 'Controlled selected value.', + }, + defaultValue: { + type: 'string', + description: 'Initial value for uncontrolled usage.', + }, + onChange: { + type: 'enum', + values: ['(value: Key | null) => void'], + description: 'Called when the selected option changes.', + }, + inputValue: { + type: 'string', + description: 'Controlled input text.', + }, + defaultInputValue: { + type: 'string', + description: 'Initial input text for uncontrolled usage.', + }, + onInputChange: { + type: 'enum', + values: ['(value: string) => void'], + description: 'Called when the input text changes.', + }, + label: { + type: 'string', + description: 'Visible label above the combobox.', + }, + secondaryLabel: { + type: 'string', + description: ( + <> + Secondary text shown next to the label. If not provided and isRequired + is true, displays Required. + + ), + }, + description: { + type: 'string', + description: 'Helper text displayed below the label.', + }, + placeholder: { + type: 'string', + description: 'Text shown when the input is empty.', + }, + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + responsive: true, + description: 'Visual size of the combobox field.', + }, + icon: { + type: 'enum', + values: ['ReactNode'], + description: 'Icon displayed before the input.', + }, + onOpenChange: { + type: 'enum', + values: ['(isOpen: boolean) => void'], + description: 'Called when the dropdown opens or closes.', + }, + isDisabled: { + type: 'boolean', + description: 'Prevents user interaction when true.', + }, + disabledKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Keys of options that should be disabled.', + }, + isRequired: { + type: 'boolean', + description: 'Marks the field as required for form validation.', + }, + isInvalid: { + type: 'boolean', + description: 'Displays the combobox in an error state.', + }, + name: { + type: 'string', + description: 'Form field name for form submission.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/combobox/snippets.ts b/docs-ui/src/app/components/combobox/snippets.ts new file mode 100644 index 0000000000..28ca8c90af --- /dev/null +++ b/docs-ui/src/app/components/combobox/snippets.ts @@ -0,0 +1,114 @@ +export const comboboxUsageSnippet = `import { Combobox } from '@backstage/ui'; + +`; + +export const comboboxDefaultSnippet = ``; + +export const comboboxDescriptionSnippet = ``; + +export const comboboxIconSnippet = `} + options={[ ... ]} +/>`; + +export const comboboxSizesSnippet = ` + + +`; + +export const comboboxDisabledSnippet = ``; + +export const comboboxResponsiveSnippet = ``; + +export const comboboxDisabledOptionsSnippet = ``; + +export const comboboxCustomValueSnippet = ``; + +export const comboboxSectionsSnippet = ``; diff --git a/docs-ui/src/app/components/date-range-picker/components.tsx b/docs-ui/src/app/components/date-range-picker/components.tsx new file mode 100644 index 0000000000..3da4ec0561 --- /dev/null +++ b/docs-ui/src/app/components/date-range-picker/components.tsx @@ -0,0 +1,45 @@ +'use client'; + +import { DateRangePicker } from '../../../../../packages/ui/src/components/DateRangePicker/DateRangePicker'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { parseDate } from '@internationalized/date'; + +export const WithLabel = () => { + return ; +}; + +export const Sizes = () => { + return ( + + + + + ); +}; + +export const WithDefaultValue = () => { + return ( + + ); +}; + +export const Disabled = () => { + return ( + + ); +}; diff --git a/docs-ui/src/app/components/date-range-picker/page.mdx b/docs-ui/src/app/components/date-range-picker/page.mdx new file mode 100644 index 0000000000..0299d23822 --- /dev/null +++ b/docs-ui/src/app/components/date-range-picker/page.mdx @@ -0,0 +1,85 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { dateRangePickerPropDefs } from './props-definition'; +import { + dateRangePickerUsageSnippet, + withLabelSnippet, + sizesSnippet, + withDefaultValueSnippet, + disabledSnippet, +} from './snippets'; +import { WithLabel, Sizes, WithDefaultValue, Disabled } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { DateRangePickerDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; + +export const reactAriaUrls = { + dateRangePicker: 'https://react-aria.adobe.com/DateRangePicker', +}; + + + +} + code={withLabelSnippet} +/> + +## Usage + + + +## API reference + + + + + +## Examples + +### Sizes + +} + code={sizesSnippet} + layout="side-by-side" +/> + +### With default value + +} + code={withDefaultValueSnippet} + layout="side-by-side" +/> + +### Disabled + +} + code={disabledSnippet} + layout="side-by-side" +/> + + + + diff --git a/docs-ui/src/app/components/date-range-picker/props-definition.tsx b/docs-ui/src/app/components/date-range-picker/props-definition.tsx new file mode 100644 index 0000000000..b7200f868e --- /dev/null +++ b/docs-ui/src/app/components/date-range-picker/props-definition.tsx @@ -0,0 +1,103 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const dateRangePickerPropDefs: Record = { + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + responsive: true, + description: ( + <> + Visual size of the picker. Use small for dense layouts,{' '} + medium for prominent fields. + + ), + }, + label: { + type: 'string', + description: 'Visible label displayed above the picker.', + }, + secondaryLabel: { + type: 'string', + description: ( + <> + Secondary text shown next to the label. If not provided and isRequired + is true, displays Required. + + ), + }, + description: { + type: 'string', + description: 'Help text displayed below the label.', + }, + value: { + type: 'enum', + values: ['RangeValue'], + description: 'Controlled value of the date range.', + }, + defaultValue: { + type: 'enum', + values: ['RangeValue'], + description: 'Default value for uncontrolled usage.', + }, + onChange: { + type: 'enum', + values: ['(value: RangeValue | null) => void'], + description: 'Handler called when the selected range changes.', + }, + granularity: { + type: 'enum', + values: ['day', 'hour', 'minute', 'second'], + default: 'day', + description: + 'Smallest unit displayed. Defaults to "day" for dates and "minute" for times.', + }, + minValue: { + type: 'enum', + values: ['DateValue'], + description: 'Minimum allowed date. Dates before this are disabled.', + }, + maxValue: { + type: 'enum', + values: ['DateValue'], + description: 'Maximum allowed date. Dates after this are disabled.', + }, + isDateUnavailable: { + type: 'enum', + values: ['(date: DateValue) => boolean'], + description: + 'Callback invoked for each calendar date. Return true to mark a date as unavailable.', + }, + allowsNonContiguousRanges: { + type: 'boolean', + description: + 'When combined with isDateUnavailable, allows selecting ranges that contain unavailable dates.', + }, + startName: { + type: 'string', + description: 'Form field name for the start date, submitted as ISO 8601.', + }, + endName: { + type: 'string', + description: 'Form field name for the end date, submitted as ISO 8601.', + }, + isRequired: { + type: 'boolean', + description: 'Whether the field is required for form submission.', + }, + isDisabled: { + type: 'boolean', + description: 'Whether the picker is disabled.', + }, + isReadOnly: { + type: 'boolean', + description: 'Whether the picker is read-only.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/date-range-picker/snippets.ts b/docs-ui/src/app/components/date-range-picker/snippets.ts new file mode 100644 index 0000000000..3faab626ed --- /dev/null +++ b/docs-ui/src/app/components/date-range-picker/snippets.ts @@ -0,0 +1,28 @@ +export const dateRangePickerUsageSnippet = `import { DateRangePicker } from '@backstage/ui'; + +`; + +export const withLabelSnippet = ``; + +export const sizesSnippet = ` + + +`; + +export const withDefaultValueSnippet = `import { parseDate } from '@internationalized/date'; + +`; + +export const disabledSnippet = ``; diff --git a/docs-ui/src/app/components/header/components.tsx b/docs-ui/src/app/components/header/components.tsx index 26dc715a5d..2a583e6c80 100644 --- a/docs-ui/src/app/components/header/components.tsx +++ b/docs-ui/src/app/components/header/components.tsx @@ -1,6 +1,8 @@ 'use client'; import { Header } from '../../../../../packages/ui/src/components/Header/Header'; +import { HeaderMetadataUsers } from '../../../../../packages/ui/src/components/Header/HeaderMetadataUsers'; +import { HeaderMetadataStatus } from '../../../../../packages/ui/src/components/Header/HeaderMetadataStatus'; import { Button } from '../../../../../packages/ui/src/components/Button/Button'; import { ButtonIcon } from '../../../../../packages/ui/src/components/ButtonIcon/ButtonIcon'; import { @@ -11,6 +13,29 @@ import { import { MemoryRouter } from 'react-router-dom'; import { RiMore2Line } from '@remixicon/react'; +const users = { + giles: { + name: 'Giles Peyton-Nicoll', + src: 'https://i.pravatar.cc/150?u=giles', + href: '/users/giles', + }, + alice: { + name: 'Alice Johnson', + src: 'https://i.pravatar.cc/150?u=alice42', + href: '/users/alice', + }, + bob: { + name: 'Bob Smith', + src: 'https://i.pravatar.cc/150?u=bob', + href: '/users/bob', + }, + carol: { + name: 'Carol Williams', + src: 'https://i.pravatar.cc/150?u=carol', + href: '/users/carol', + }, +}; + const tabs = [ { id: 'overview', label: 'Overview', href: '/overview' }, { id: 'checks', label: 'Checks', href: '/checks' }, @@ -29,12 +54,37 @@ const breadcrumbs = [ }, ]; +const tags = [ + { label: 'TypeScript' }, + { label: 'Platform', href: '/platform' }, +]; + +const metadataUsers = [ + { label: 'Type', value: 'website' }, + { + label: 'Status', + value: , + }, + { + label: 'Owner', + value: , + }, + { + label: 'Contributors', + value: ( + + ), + }, +]; + export const WithEverything = () => (
@@ -45,6 +95,84 @@ export const WithEverything = () => ( ); +export const WithMetadataUsers = () => ( + +
, + }, + { + label: 'Contributors', + value: ( + + ), + }, + ]} + /> + +); + +export const WithTags = () => ( + +
+ +); + +export const WithDescription = () => ( + +
+ +); + +export const WithMetadata = () => ( + +
+ +); + +export const WithMetadataStatus = () => ( + +
, + }, + { + label: 'Build', + value: ( + + ), + }, + { + label: 'Coverage', + value: , + }, + ]} + /> + +); + export const WithLongBreadcrumbs = () => (
diff --git a/docs-ui/src/app/components/header/page.mdx b/docs-ui/src/app/components/header/page.mdx index 9e02b70a70..107bf6d7f9 100644 --- a/docs-ui/src/app/components/header/page.mdx +++ b/docs-ui/src/app/components/header/page.mdx @@ -3,17 +3,28 @@ import { CodeBlock } from '@/components/CodeBlock'; import { Snippet } from '@/components/Snippet'; import { WithEverything, - WithLongBreadcrumbs, WithTabs, + WithTags, + WithDescription, + WithMetadata, + WithMetadataUsers, + WithMetadataStatus, WithCustomActions, WithMenu, } from './components'; -import { headerPagePropDefs } from './props-definition'; +import { + headerPagePropDefs, + headerMetadataUsersPropDefs, +} from './props-definition'; import { usage, defaultSnippet, withTabs, - withBreadcrumbs, + withTags, + withDescription, + withMetadata, + withMetadataUsers, + withMetadataStatus, withCustomActions, withMenu, } from './snippets'; @@ -24,7 +35,7 @@ import { ChangelogComponent } from '@/components/ChangelogComponent'; } code={defaultSnippet} /> @@ -39,11 +50,37 @@ import { ChangelogComponent } from '@/components/ChangelogComponent'; ## Examples -### Breadcrumbs +### Tags -Labels are truncated at 240px. +Tags are rendered above the title. Each tag with an `href` renders as a link; tags without `href` render as plain text. Tags are separated by a small circle divider. -} code={withBreadcrumbs} /> +} code={withTags} /> + +### Description + +The description accepts a markdown string with support for inline links. Bold, italic, and block-level markdown are not rendered. + +} code={withDescription} /> + +### Metadata + +Key-value pairs displayed below the description. + +} code={withMetadata} /> + +### Metadata with users + +Use `HeaderMetadataUsers` as the metadata value to display users as avatars. A single user shows the avatar with their name beside it. Multiple users show a row of avatars — hover to reveal each name via tooltip. When a user has an `href`, the avatar and name become links. + +} code={withMetadataUsers} /> + + + +### Metadata with status + +Use `HeaderMetadataStatus` as the metadata value to display a status indicator. The dot colour is driven by the `color` prop which maps to BUI status tokens. Pass an `href` to make the label a link. + +} code={withMetadataStatus} /> ### Tabs diff --git a/docs-ui/src/app/components/header/props-definition.tsx b/docs-ui/src/app/components/header/props-definition.tsx index 0acc7d30ae..f4e7c2b670 100644 --- a/docs-ui/src/app/components/header/props-definition.tsx +++ b/docs-ui/src/app/components/header/props-definition.tsx @@ -5,6 +5,51 @@ export const headerPagePropDefs: Record = { type: 'string', description: 'Page heading displayed in the header.', }, + tags: { + type: 'complex', + description: + 'Items displayed above the title. Each tag renders as a link when href is provided, or as plain text otherwise. Tags are separated by a small circle divider.', + complexType: { + name: 'HeaderTag[]', + properties: { + label: { + type: 'string', + required: true, + description: 'Display text for the tag.', + }, + href: { + type: 'string', + required: false, + description: 'URL to navigate to when the tag is clicked.', + }, + }, + }, + }, + description: { + type: 'string', + description: + 'Markdown string rendered below the title. Only inline links are supported. Bold, italic, and block-level markdown are not rendered.', + }, + metadata: { + type: 'complex', + description: 'Key-value pairs displayed below the description.', + complexType: { + name: 'HeaderMetadataItem[]', + properties: { + label: { + type: 'string', + required: true, + description: 'The key label, displayed in secondary color.', + }, + value: { + type: 'string | ReactNode', + required: true, + description: + 'The value to display alongside the label. Pass a string for plain text or a ReactNode for custom content such as HeaderMetadataUsers.', + }, + }, + }, + }, customActions: { type: 'enum', values: ['ReactNode'], @@ -49,6 +94,7 @@ export const headerPagePropDefs: Record = { }, breadcrumbs: { type: 'complex', + deprecated: true, description: 'Breadcrumb trail displayed above the title.', complexType: { name: 'HeaderBreadcrumb[]', @@ -68,3 +114,33 @@ export const headerPagePropDefs: Record = { }, ...classNamePropDefs, }; + +export const headerMetadataUsersPropDefs: Record = { + users: { + type: 'complex', + description: + 'List of users to display. A single user shows the avatar with their name beside it. Multiple users show a row of avatars with names revealed on hover via tooltip.', + complexType: { + name: 'HeaderMetadataUser[]', + properties: { + name: { + type: 'string', + required: true, + description: + 'Display name shown beside the avatar (single) or in the tooltip (multiple).', + }, + src: { + type: 'string', + required: false, + description: 'URL for the avatar image.', + }, + href: { + type: 'string', + required: false, + description: + 'When provided, the avatar becomes a link and the name is rendered as a Link component.', + }, + }, + }, + }, +}; diff --git a/docs-ui/src/app/components/header/snippets.ts b/docs-ui/src/app/components/header/snippets.ts index 8dfef0e69e..ac38d6d7eb 100644 --- a/docs-ui/src/app/components/header/snippets.ts +++ b/docs-ui/src/app/components/header/snippets.ts @@ -2,15 +2,41 @@ export const usage = `import { Header } from '@backstage/ui';
`; -export const defaultSnippet = `
, + }, + { + label: 'Owner', + value: , + }, + { + label: 'Contributors', + value: ( + + ), + }, ]} tabs={[ { id: 'overview', label: 'Overview', href: '/overview' }, - { id: 'settings', label: 'Settings', href: '/settings' }, + { id: 'checks', label: 'Checks', href: '/checks' }, ]} customActions={ <> @@ -54,3 +80,70 @@ export const withMenu = `
} />`; + +export const withTags = `
`; + +export const withDescription = `
`; + +export const withMetadata = `
`; + +export const withMetadataStatus = `import { Header, HeaderMetadataStatus } from '@backstage/ui'; + +
, + }, + { + label: 'Build', + value: , + }, + { + label: 'Coverage', + value: , + }, + ]} +/>`; + +export const withMetadataUsers = `import { Header, HeaderMetadataUsers } from '@backstage/ui'; + +
, + }, + { + label: 'Contributors', + value: ( + + ), + }, + ]} +/>`; diff --git a/docs-ui/src/app/components/select/components.tsx b/docs-ui/src/app/components/select/components.tsx index 1cbc323b84..46cf6b0666 100644 --- a/docs-ui/src/app/components/select/components.tsx +++ b/docs-ui/src/app/components/select/components.tsx @@ -40,6 +40,33 @@ const skills = [ { value: 'swift', label: 'Swift' }, ]; +const sectionedFonts = [ + { + title: 'Serif Fonts', + options: [ + { value: 'times', label: 'Times New Roman' }, + { value: 'georgia', label: 'Georgia' }, + { value: 'garamond', label: 'Garamond' }, + ], + }, + { + title: 'Sans-Serif Fonts', + options: [ + { value: 'arial', label: 'Arial' }, + { value: 'helvetica', label: 'Helvetica' }, + { value: 'verdana', label: 'Verdana' }, + ], + }, + { + title: 'Monospace Fonts', + options: [ + { value: 'courier', label: 'Courier New' }, + { value: 'consolas', label: 'Consolas' }, + { value: 'fira', label: 'Fira Code' }, + ], + }, +]; + export const Preview = () => ( +); + +export const SearchableWithSections = () => ( + `; + +export const selectSectionsSnippet = ``; diff --git a/docs-ui/src/app/components/slider/page.mdx b/docs-ui/src/app/components/slider/page.mdx index c46185f9f6..19ffec08d0 100644 --- a/docs-ui/src/app/components/slider/page.mdx +++ b/docs-ui/src/app/components/slider/page.mdx @@ -28,7 +28,7 @@ import { ChangelogComponent } from '@/components/ChangelogComponent'; import { SliderDefinition } from '../../../utils/definitions'; export const reactAriaUrls = { - slider: 'https://react-spectrum.adobe.com/react-aria/Slider.html', + slider: 'https://react-aria.adobe.com/Slider', }; -### Loading States +### Pending States -When fetching data, the table shows a loading state. If the user triggers a new query (by paginating, sorting, or searching) while previous data is displayed, the table enters a "stale" state where it continues showing the previous data until new data arrives. This prevents jarring layout shifts. +When fetching data, the table shows a pending state. If the user triggers a new query (by paginating, sorting, or searching) while previous data is displayed, the table enters a "stale" state where it continues showing the previous data until new data arrives. This prevents jarring layout shifts. -You can access these states via `tableProps.loading` and `tableProps.isStale` if you need to render additional loading indicators. +You can access these states via `tableProps.isPending` and `tableProps.isStale` if you need to render additional pending indicators. ## Combining Features diff --git a/docs-ui/src/app/components/table/props-definition.tsx b/docs-ui/src/app/components/table/props-definition.tsx index 30381e30f7..5d4d94c083 100644 --- a/docs-ui/src/app/components/table/props-definition.tsx +++ b/docs-ui/src/app/components/table/props-definition.tsx @@ -157,6 +157,28 @@ export const useTableOptionsPropDefs: Record = { ), }, + searchDebounceMs: { + type: 'number', + description: ( + <> + Trailing-edge debounce delay (ms) applied to the search value before it + reaches searchFn. Defaults to 0 (no debounce). + Does not affect the controlled onSearchChange callback. + Only used with complete mode. + + ), + }, + filterDebounceMs: { + type: 'number', + description: ( + <> + Trailing-edge debounce delay (ms) applied to the filter value before it + reaches filterFn. Defaults to 0 (no debounce). + Does not affect the controlled onFilterChange callback. + Only used with complete mode. + + ), + }, }; export const useTableReturnPropDefs: Record = { @@ -166,7 +188,7 @@ export const useTableReturnPropDefs: Record = { description: ( <> Props to spread onto the Table component. Includes data, - loading, error, pagination, and sort state. + isPending, error, pagination, and sort state. ), }, @@ -207,10 +229,15 @@ export const tablePropDefs: Record = { values: ['T[]'], description: 'Array of data items to display in the table.', }, + isPending: { + type: 'boolean', + default: 'false', + description: 'Whether the table is in a pending state.', + }, loading: { type: 'boolean', default: 'false', - description: 'Whether the table is in a loading state.', + description: 'Deprecated. Use `isPending` instead.', }, isStale: { type: 'boolean', @@ -466,17 +493,22 @@ export const tableRootPropDefs: Record = { ), }, - loading: { + isPending: { type: 'boolean', default: 'false', description: ( <> - Whether the table is in a loading state (e.g., initial data fetch). Adds{' '} - aria-busy attribute and data-loading data + Whether the table is in a pending state (e.g., initial data fetch). Adds{' '} + aria-busy attribute and data-ispending data attribute for styling. ), }, + loading: { + type: 'boolean', + default: 'false', + description: 'Deprecated. Use `isPending` instead.', + }, }; export const columnPropDefs: Record = { diff --git a/docs-ui/src/app/tokens/page.mdx b/docs-ui/src/app/tokens/page.mdx index f359c10525..dbaab30252 100644 --- a/docs-ui/src/app/tokens/page.mdx +++ b/docs-ui/src/app/tokens/page.mdx @@ -264,6 +264,42 @@ pressed, and disabled variants for interactive states. +## Inherited background + +`--bui-bg-inherit` resolves to the bg color of the nearest enclosing element with a +`data-bg` attribute (set by `Box`, `Flex`, `Grid`, `Card`, `Accordion`, or any +element that explicitly sets `data-bg`). When no such ancestor exists it falls +back to `--bui-bg-app`. Use it from CSS when a sticky, fixed, or otherwise +overlapping element needs to match its surrounding bg without hardcoding a level. + + + + + + + Prop + Description + + + + + + --bui-bg-inherit + + + Resolves to the bg color of the nearest enclosing `data-bg` ancestor, + falling back to `--bui-bg-app`. + + + + + ## Solid background colors diff --git a/docs-ui/src/components/Chip/Chip.tsx b/docs-ui/src/components/Chip/Chip.tsx index b348b46c32..a1d9d75e62 100644 --- a/docs-ui/src/components/Chip/Chip.tsx +++ b/docs-ui/src/components/Chip/Chip.tsx @@ -4,12 +4,18 @@ import styles from './styles.module.css'; export const Chip = ({ children, head = false, + deprecated = false, }: { children: ReactNode; head?: boolean; + deprecated?: boolean; }) => { return ( - + {children} ); diff --git a/docs-ui/src/components/Chip/styles.module.css b/docs-ui/src/components/Chip/styles.module.css index d752ae2602..2446e46388 100644 --- a/docs-ui/src/components/Chip/styles.module.css +++ b/docs-ui/src/components/Chip/styles.module.css @@ -14,6 +14,11 @@ color: #2563eb; } +.deprecated { + background-color: #fff4e5; + color: #b45309; +} + [data-theme-mode='dark'] .chip { background-color: #2c2c2c; color: #fff; @@ -22,3 +27,8 @@ [data-theme-mode='dark'] .chip.head { background-color: #33405b; } + +[data-theme-mode='dark'] .chip.deprecated { + background-color: #3d2a10; + color: #fbbf24; +} diff --git a/docs-ui/src/components/PropsTable/PropsTable.tsx b/docs-ui/src/components/PropsTable/PropsTable.tsx index a8af2ad116..db5759d0e3 100644 --- a/docs-ui/src/components/PropsTable/PropsTable.tsx +++ b/docs-ui/src/components/PropsTable/PropsTable.tsx @@ -52,7 +52,12 @@ export const PropsTable = >({ switch (column) { case 'prop': - return {propName}; + return ( +
+ {propName} + {propData.deprecated && deprecated} +
+ ); case 'type': return ( diff --git a/docs-ui/src/utils/data.ts b/docs-ui/src/utils/data.ts index 2a16065930..fb7ac148a5 100644 --- a/docs-ui/src/utils/data.ts +++ b/docs-ui/src/utils/data.ts @@ -49,10 +49,19 @@ export const components: Page[] = [ title: 'CheckboxGroup', slug: 'checkbox-group', }, + { + title: 'Combobox', + slug: 'combobox', + status: 'new', + }, { title: 'Container', slug: 'container', }, + { + title: 'DateRangePicker', + slug: 'date-range-picker', + }, { title: 'Dialog', slug: 'dialog', diff --git a/docs-ui/src/utils/propDefs.ts b/docs-ui/src/utils/propDefs.ts index f714dd0d08..f92f1a37eb 100644 --- a/docs-ui/src/utils/propDefs.ts +++ b/docs-ui/src/utils/propDefs.ts @@ -44,6 +44,7 @@ export type PropDef = { required?: boolean; responsive?: boolean; description?: ReactNode; + deprecated?: boolean; }; export { breakpoints }; diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index 085b426dc6..b697e168fe 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -314,12 +314,12 @@ __metadata: languageName: node linkType: hard -"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.1, @codemirror/state@npm:^6.4.0, @codemirror/state@npm:^6.5.0": - version: 6.5.2 - resolution: "@codemirror/state@npm:6.5.2" +"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.1, @codemirror/state@npm:^6.4.0, @codemirror/state@npm:^6.6.0": + version: 6.6.0 + resolution: "@codemirror/state@npm:6.6.0" dependencies: "@marijn/find-cluster-break": "npm:^1.0.0" - checksum: 10/5ccd3acb0c0a5b88e83fb91be39099fceb9f44a5047cc41a75d53f160e736851f65c8de40950b90c6519e6d2828e12f468db0af658dde30e938896f1c39eec91 + checksum: 10/5d624f3c8832b287d76ebb5f57c01327641875c12c58ada2a97f958dc4df8c3bb0a1ad08ed370300a4a929ee8d5c7f14a397449a0d075ac3129d60d85f077441 languageName: node linkType: hard @@ -336,14 +336,14 @@ __metadata: linkType: hard "@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0, @codemirror/view@npm:^6.34.4, @codemirror/view@npm:^6.35.0": - version: 6.39.16 - resolution: "@codemirror/view@npm:6.39.16" + version: 6.41.1 + resolution: "@codemirror/view@npm:6.41.1" dependencies: - "@codemirror/state": "npm:^6.5.0" + "@codemirror/state": "npm:^6.6.0" crelt: "npm:^1.0.6" style-mod: "npm:^4.1.0" w3c-keyname: "npm:^2.2.4" - checksum: 10/199576febda2a91fe7676b8708627ed2e38d7e964ec8258331422fe7c7f89003eee2de7dec828e09c046de005742fd476cae6ceebc7bd994744f771253bfcbf3 + checksum: 10/ab8156db1012f94ac39d603da4c397ab1de8877f941d0cf67f79cd09fffe9f39d5de8a10611a788ce9d5a88cad2633445880955fd0dc1ad67813cbf9be97774a languageName: node linkType: hard @@ -928,10 +928,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:16.2.1": - version: 16.2.1 - resolution: "@next/env@npm:16.2.1" - checksum: 10/c4f19f1767d7a1e8e9ff93cdee7e3b6a923d26d9d71f44124a797f03703ab9a18508b5ede997cc99d0307f2e0d0d1c426e9673a6c11ea10e170b87462a572236 +"@next/env@npm:16.2.3": + version: 16.2.3 + resolution: "@next/env@npm:16.2.3" + checksum: 10/30ed128d8ffae47e58732ee134b78da36e2d6942da7479ec5e640d205b7822224daf2f07d7a69352dc362908eb260fc9fa7eaba1ce5e6311abeacc6ffb0fe90a languageName: node linkType: hard @@ -961,58 +961,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:16.2.1": - version: 16.2.1 - resolution: "@next/swc-darwin-arm64@npm:16.2.1" +"@next/swc-darwin-arm64@npm:16.2.3": + version: 16.2.3 + resolution: "@next/swc-darwin-arm64@npm:16.2.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:16.2.1": - version: 16.2.1 - resolution: "@next/swc-darwin-x64@npm:16.2.1" +"@next/swc-darwin-x64@npm:16.2.3": + version: 16.2.3 + resolution: "@next/swc-darwin-x64@npm:16.2.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:16.2.1": - version: 16.2.1 - resolution: "@next/swc-linux-arm64-gnu@npm:16.2.1" +"@next/swc-linux-arm64-gnu@npm:16.2.3": + version: 16.2.3 + resolution: "@next/swc-linux-arm64-gnu@npm:16.2.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:16.2.1": - version: 16.2.1 - resolution: "@next/swc-linux-arm64-musl@npm:16.2.1" +"@next/swc-linux-arm64-musl@npm:16.2.3": + version: 16.2.3 + resolution: "@next/swc-linux-arm64-musl@npm:16.2.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:16.2.1": - version: 16.2.1 - resolution: "@next/swc-linux-x64-gnu@npm:16.2.1" +"@next/swc-linux-x64-gnu@npm:16.2.3": + version: 16.2.3 + resolution: "@next/swc-linux-x64-gnu@npm:16.2.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:16.2.1": - version: 16.2.1 - resolution: "@next/swc-linux-x64-musl@npm:16.2.1" +"@next/swc-linux-x64-musl@npm:16.2.3": + version: 16.2.3 + resolution: "@next/swc-linux-x64-musl@npm:16.2.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:16.2.1": - version: 16.2.1 - resolution: "@next/swc-win32-arm64-msvc@npm:16.2.1" +"@next/swc-win32-arm64-msvc@npm:16.2.3": + version: 16.2.3 + resolution: "@next/swc-win32-arm64-msvc@npm:16.2.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:16.2.1": - version: 16.2.1 - resolution: "@next/swc-win32-x64-msvc@npm:16.2.1" +"@next/swc-win32-x64-msvc@npm:16.2.3": + version: 16.2.3 + resolution: "@next/swc-win32-x64-msvc@npm:16.2.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1175,12 +1175,12 @@ __metadata: languageName: node linkType: hard -"@remixicon/react@npm:^4.6.0": - version: 4.9.0 - resolution: "@remixicon/react@npm:4.9.0" +"@remixicon/react@npm:>=4.6.0 <4.9.0": + version: 4.8.0 + resolution: "@remixicon/react@npm:4.8.0" peerDependencies: react: ">=18.2.0" - checksum: 10/3d8f1d86b2bb20ab5e44d15f18811e928b0886f7710eb7a1516afb9913ba72e46facec5dfee382825139d800bcbb6704c15d0c760d0f977c12257d4af8db3295 + checksum: 10/10241f2e07826ce7d595cf9687a35c96cc9cf9eb68a9431d7dfa1b9df479dbef302874d28c0502cee2a536cf34722de7c49ed12d10a2b071e4e42ba4a278c516 languageName: node linkType: hard @@ -1534,9 +1534,9 @@ __metadata: languageName: node linkType: hard -"@uiw/codemirror-extensions-basic-setup@npm:4.25.8": - version: 4.25.8 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.25.8" +"@uiw/codemirror-extensions-basic-setup@npm:4.25.9": + version: 4.25.9 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.25.9" dependencies: "@codemirror/autocomplete": "npm:^6.0.0" "@codemirror/commands": "npm:^6.0.0" @@ -1553,13 +1553,13 @@ __metadata: "@codemirror/search": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: 10/a8d83465f9f3393b6e95d98ae7f3616ad57f819bce64224831d3db19647524538fc013973074a63551afa69daad9a8ab05f2e5c7441db7e30e722495d7e991d3 + checksum: 10/bab06a40bdd8fb99a0af5115511cdb812c93aac2b93ccd8a02bdf8ea06098d6be2ce1302efc560a3b577171a5cd87d34c3215e523f21450ba100b147dfcb975c languageName: node linkType: hard "@uiw/codemirror-themes@npm:^4.23.7": - version: 4.25.8 - resolution: "@uiw/codemirror-themes@npm:4.25.8" + version: 4.25.9 + resolution: "@uiw/codemirror-themes@npm:4.25.9" dependencies: "@codemirror/language": "npm:^6.0.0" "@codemirror/state": "npm:^6.0.0" @@ -1568,19 +1568,19 @@ __metadata: "@codemirror/language": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: 10/e9983b0f6e663ca200d36437b6b52b4061ce5ccefece6f738b15370a8a7ac6774e7139a82e9e28ae273692e25d0c0804693587ea0967e163a1c7ac8cf3859cd1 + checksum: 10/4a4fe7ae5f6c2bd37170b46c75ccabb67b47b7d3cee0de45c63fafe4f2b7569461b009e0ff5386480574e651627ed03c077833d53b6d3391102b79107ae39d15 languageName: node linkType: hard "@uiw/react-codemirror@npm:^4.23.7": - version: 4.25.8 - resolution: "@uiw/react-codemirror@npm:4.25.8" + version: 4.25.9 + resolution: "@uiw/react-codemirror@npm:4.25.9" dependencies: "@babel/runtime": "npm:^7.18.6" "@codemirror/commands": "npm:^6.1.0" "@codemirror/state": "npm:^6.1.1" "@codemirror/theme-one-dark": "npm:^6.0.0" - "@uiw/codemirror-extensions-basic-setup": "npm:4.25.8" + "@uiw/codemirror-extensions-basic-setup": "npm:4.25.9" codemirror: "npm:^6.0.0" peerDependencies: "@babel/runtime": ">=7.11.0" @@ -1590,7 +1590,7 @@ __metadata: codemirror: ">=6.0.0" react: ">=17.0.0" react-dom: ">=17.0.0" - checksum: 10/8c974e22dad1ad6231f33f7db42cd5b68caaf9bea545539b06b8a89dda3427eebadf47c8f48ee0d74cdf5a25000a8fcc02bac9fe560b624955eedf1f9bb47a85 + checksum: 10/02c6ababa9307cf10aee5b32db1a0e5885485960819d708cd154bc218cf4d8b182b5fb49fa7386014401d71c8391ce211b29b2de201ad1fdece2c1716d09a74d languageName: node linkType: hard @@ -2338,7 +2338,7 @@ __metadata: "@mdx-js/react": "npm:^3.1.0" "@next/mdx": "npm:16.2.1" "@octokit/rest": "npm:^22.0.1" - "@remixicon/react": "npm:^4.6.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" "@shikijs/transformers": "npm:^3.13.0" "@types/mdx": "npm:^2.0.13" "@types/node": "npm:^22.13.14" @@ -2351,9 +2351,9 @@ __metadata: eslint-config-next: "npm:16.2.1" html-react-parser: "npm:^5.2.5" motion: "npm:^12.4.1" - next: "npm:16.2.1" + next: "npm:16.2.3" next-mdx-remote-client: "npm:^2.1.2" - postcss: "npm:^8.5.6" + postcss: "npm:^8.5.10" postcss-import: "npm:^16.1.1" prop-types: "npm:^15.8.1" react: "npm:19.2.4" @@ -3103,12 +3103,12 @@ __metadata: languageName: node linkType: hard -"framer-motion@npm:^12.35.2": - version: 12.35.2 - resolution: "framer-motion@npm:12.35.2" +"framer-motion@npm:^12.38.0": + version: 12.38.0 + resolution: "framer-motion@npm:12.38.0" dependencies: - motion-dom: "npm:^12.35.2" - motion-utils: "npm:^12.29.2" + motion-dom: "npm:^12.38.0" + motion-utils: "npm:^12.36.0" tslib: "npm:^2.4.0" peerDependencies: "@emotion/is-prop-valid": "*" @@ -3121,7 +3121,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/10af699ff1e35a166ef60ceab464479b81624ef74de3ec9e11b427f86bd7bf2c8c8a9f24fb0646288b2d4b0c1b219203da351821fc568c7b91c6821594af4a3f + checksum: 10/4d529d1648a8e31ec9859e7ff1296b7e4ef0028eb09cbc7d626068766ab53e486038b431fac33b1438a1cc076a244e6843c5a8c0f38442885832308452b4b25e languageName: node linkType: hard @@ -4500,27 +4500,27 @@ __metadata: languageName: node linkType: hard -"motion-dom@npm:^12.35.2": - version: 12.35.2 - resolution: "motion-dom@npm:12.35.2" +"motion-dom@npm:^12.38.0": + version: 12.38.0 + resolution: "motion-dom@npm:12.38.0" dependencies: - motion-utils: "npm:^12.29.2" - checksum: 10/dd009e58b178dd80b123a86199ae78ecd6b2fc6c8e03464b2daf43b4218dfcc36042ec0af8fad2c6c157198f56849f90dc033b58f46478b45fbaeaefcc2710ad + motion-utils: "npm:^12.36.0" + checksum: 10/78c040b46d93273932cf80c70e39845be5a442dcaf18d4345b45a9193de9dfa87c885b609943cb652115e4eac5d46ef40b452185073dd43fc328b134f9975e90 languageName: node linkType: hard -"motion-utils@npm:^12.29.2": - version: 12.29.2 - resolution: "motion-utils@npm:12.29.2" - checksum: 10/ae5f9be58c07939af72334894ed1a18653d724946182a718dc3d11268ef26e63804c3f16dee5a6110596d4406b539c4513822b74f86adebef9488601c34b18b7 +"motion-utils@npm:^12.36.0": + version: 12.36.0 + resolution: "motion-utils@npm:12.36.0" + checksum: 10/c4a2a7ffac48ca44082d6d31b115f245025060a7e69d70dac062646d8f96c39e5662a7c8a51f255566fdf8e719ef1269a8e9aa3a04fc263bb65b5a7b61331901 languageName: node linkType: hard "motion@npm:^12.4.1": - version: 12.35.2 - resolution: "motion@npm:12.35.2" + version: 12.38.0 + resolution: "motion@npm:12.38.0" dependencies: - framer-motion: "npm:^12.35.2" + framer-motion: "npm:^12.38.0" tslib: "npm:^2.4.0" peerDependencies: "@emotion/is-prop-valid": "*" @@ -4533,7 +4533,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/3d99a53816634cbee1b38ed8a9a5d88bafbd29eb3bc02e78fc741c604972b4b88d317cf374bba30a1486f727bb1657ef8826f83e669a3b04fd1ec3ef75bfb62d + checksum: 10/d7ae2ba3cc112c4467822956b92065239640b9c62204d3bee1780da9fc0147185373534138d39975e82bf73b5f1b28d3fb3581031e4e7e0cfb230472767bd10d languageName: node linkType: hard @@ -4587,19 +4587,19 @@ __metadata: languageName: node linkType: hard -"next@npm:16.2.1": - version: 16.2.1 - resolution: "next@npm:16.2.1" +"next@npm:16.2.3": + version: 16.2.3 + resolution: "next@npm:16.2.3" dependencies: - "@next/env": "npm:16.2.1" - "@next/swc-darwin-arm64": "npm:16.2.1" - "@next/swc-darwin-x64": "npm:16.2.1" - "@next/swc-linux-arm64-gnu": "npm:16.2.1" - "@next/swc-linux-arm64-musl": "npm:16.2.1" - "@next/swc-linux-x64-gnu": "npm:16.2.1" - "@next/swc-linux-x64-musl": "npm:16.2.1" - "@next/swc-win32-arm64-msvc": "npm:16.2.1" - "@next/swc-win32-x64-msvc": "npm:16.2.1" + "@next/env": "npm:16.2.3" + "@next/swc-darwin-arm64": "npm:16.2.3" + "@next/swc-darwin-x64": "npm:16.2.3" + "@next/swc-linux-arm64-gnu": "npm:16.2.3" + "@next/swc-linux-arm64-musl": "npm:16.2.3" + "@next/swc-linux-x64-gnu": "npm:16.2.3" + "@next/swc-linux-x64-musl": "npm:16.2.3" + "@next/swc-win32-arm64-msvc": "npm:16.2.3" + "@next/swc-win32-x64-msvc": "npm:16.2.3" "@swc/helpers": "npm:0.5.15" baseline-browser-mapping: "npm:^2.9.19" caniuse-lite: "npm:^1.0.30001579" @@ -4643,7 +4643,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10/319c0b18173a90e53b5e5ffafa8a8fecb7cc340b77728796743edd996c7ee7652201892bff60c32f6a3b75abdff1449b77f13f6fab8fd56d4f9da47cf0fb9299 + checksum: 10/5164885daacbb36a771380e1b5efba524863e1bdf2b5a6c80413cbf1e3ab4e8ddab5716cd91ff94ca5c5c5deb2a12d1312d6d6ae994e16ebfa985fdda6134bc6 languageName: node linkType: hard @@ -4857,9 +4857,9 @@ __metadata: linkType: hard "picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 10/60c2595003b05e4535394d1da94850f5372c9427ca4413b71210f437f7b2ca091dbd611c45e8b37d10036fa8eade25c1b8951654f9d3973bfa66a2ff4d3b08bc + version: 2.3.2 + resolution: "picomatch@npm:2.3.2" + checksum: 10/b788ef8148a2415b9dec12f0bb350ae6a5830f8f1950e472abc2f5225494debf7d1b75eb031df0ceaea9e8ec3e7bad599e8dbf3c60d61b42be429ba41bff4426 languageName: node linkType: hard @@ -4915,14 +4915,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.5.6": - version: 8.5.8 - resolution: "postcss@npm:8.5.8" +"postcss@npm:^8.5.10": + version: 8.5.10 + resolution: "postcss@npm:8.5.10" dependencies: nanoid: "npm:^3.3.11" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10/cbacbfd7f767e2c820d4bf09a3a744834dd7d14f69ff08d1f57b1a7defce9ae5efcf31981890d9697a972a64e9965de677932ef28e4c8ba23a87aad45b82c459 + checksum: 10/7eac6169e535b63c8412e94d4f6047fc23efa3e9dde804b541940043c831b25f1cd867d83cd2c4371ad2450c8abcb42c208aa25668c1f0f3650d7f72faf711a8 languageName: node linkType: hard @@ -6241,11 +6241,11 @@ __metadata: linkType: hard "yaml@npm:^2.0.0": - version: 2.8.1 - resolution: "yaml@npm:2.8.1" + version: 2.8.3 + resolution: "yaml@npm:2.8.3" bin: yaml: bin.mjs - checksum: 10/eae07b3947d405012672ec17ce27348aea7d1fa0534143355d24a43a58f5e05652157ea2182c4fe0604f0540be71f99f1173f9d61018379404507790dff17665 + checksum: 10/ecad41d39d34fae5cc17ea2d4b7f7f55faacd45cbce8983ba22d48d1ed1a92ed242ea49ea813a79ac39a69f75f9c5a03e7b5395fd954d55476f25e21a47c141d languageName: node linkType: hard diff --git a/docs/ai/well-known-actions.md b/docs/ai/well-known-actions.md index 547f7d31b7..4c9ea87c5a 100644 --- a/docs/ai/well-known-actions.md +++ b/docs/ai/well-known-actions.md @@ -33,3 +33,7 @@ This is a (non-exhaustive) list of actions that are known to be part of the Acti - `scaffolder.list-scaffolder-tasks` (List Scaffolder Tasks): This allows you to list scaffolder tasks that have been created. - `scaffolder.execute-template` (Execute Scaffolder Template): Executes a Scaffolder template with its template ref and input parameter values. - `scaffolder.get-scaffolder-task-logs` (Get Scaffolder Task Logs): This allows you to fetch the logs of a given scaffolder task. + +### Search + +- `search.query` (Query Search Engine): Query the Backstage search engine for documents across all or selected document types. diff --git a/docs/contribute/doc-style-guide.md b/docs/contribute/doc-style-guide.md index 3aa56b336f..1e28ed4676 100644 --- a/docs/contribute/doc-style-guide.md +++ b/docs/contribute/doc-style-guide.md @@ -228,6 +228,14 @@ helps downstream localization. - Use (`-`) for unordered lists. - Leave a blank line after each list. - Indent nested lists with two spaces. +- Use a numbered list for a sequence of steps rather than prose with + "First", "Then", and "Finally". Numbered lists are easier to scan, make + the order explicit, and give readers a clear way to reference a specific + step. + +| Do | Don't | +| :----------------------------------------------------------------- | :------------------------------------------------------------------------------ | +| 1) Install the package. 2) Run the migration. 3) Start the server. | First, install the package. Then, run the migration. Finally, start the server. | ### Tables diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index fe80235c54..10cfb1ea57 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -746,6 +746,75 @@ input: When `each` is used, the outputs of a repeated step are returned as an array of outputs from each iteration. +### Status Check Functions - `always()` and `failure()` + +By default, when a step fails during a scaffolder run, all subsequent steps are skipped and the task is marked as failed. This can be problematic when your template creates external resources (repositories, cloud infrastructure, deployments) that need to be cleaned up if a later step fails. + +Status check functions give you control over which steps run even after a failure. You use them inside a `${{ ... }}` template expression in the `if` field of a step. + +| Function | Description | +| ----------- | ---------------------------------------------------------------------------- | +| `always()` | Always runs the step, regardless of whether previous steps passed or failed. | +| `failure()` | Runs the step only when a previous step has failed. | + +These functions must be used as template expressions such as `${{ always() }}` or `${{ failure() }}`. + +After a step has failed, the scaffolder only attempts later steps whose `if` expression invokes one of these status check functions. + +#### Usage + +```yaml +steps: + - id: cleanup + name: Cleanup Resources + action: my:cleanup:action + if: ${{ always() }} +``` + +#### Example: Cleanup on failure + +A common pattern is to create resources in early steps and add cleanup steps +that only run if something goes wrong: + +```yaml +steps: + - id: create-repo + name: Create Repository + action: publish:github + input: + repoUrl: ${{ parameters.repoUrl }} + + - id: deploy + name: Deploy to Kubernetes + action: deploy:kubernetes + input: + manifest: ./k8s/deployment.yaml + + # Only runs when a previous step failed — cleans up the repository + - id: cleanup-repo + name: Delete Repository + action: github:repo:delete + if: ${{ failure() }} + input: + repoUrl: ${{ parameters.repoUrl }} + + # Always runs — post an audit event regardless of outcome + - id: audit + name: Post Audit Event + action: debug:log + if: ${{ always() }} + input: + message: 'Scaffolder run completed for ${{ parameters.repoUrl }}' + + # Does not run after a failure, because it does not invoke a status check function + - id: plain-truthy-condition + name: Plain Truthy Condition + action: debug:log + if: ${{ true }} + input: + message: 'This step is skipped after a previous failure' +``` + ## Outputs Each individual step can output some variables that can be used in the diff --git a/docs/features/techdocs/cli.md b/docs/features/techdocs/cli.md index 7d3e0c209c..ded463e895 100644 --- a/docs/features/techdocs/cli.md +++ b/docs/features/techdocs/cli.md @@ -149,6 +149,8 @@ Options: Defaults to false, which means that the techdocs-core plugin is always added to the mkdocs file. --legacyCopyReadmeMdToIndexMd Attempt to ensure an index.md exists falling back to using /README.md or README.md in case a default /index.md is not provided. (default: false) + --disableExternalFonts Disable external font downloads for all TechDocs sites. Useful for air-gapped environments + where Google fonts cannot be accessed. (default: false) --runAsDefaultUser Bypass setting the container user as the same user and group id as host for Linux and MacOS (default: false) -v, --verbose Enable verbose output. (default: false) -h, --help display help for command diff --git a/docs/features/techdocs/configuration.md b/docs/features/techdocs/configuration.md index cf9215ebc3..9c8c0dfc90 100644 --- a/docs/features/techdocs/configuration.md +++ b/docs/features/techdocs/configuration.md @@ -97,6 +97,33 @@ techdocs: legacyCopyReadmeMdToIndexMd: false ``` +#### Disable external fonts + +`techdocs.generator.mkdocs.disableExternalFonts` + +(Optional) Use this when the generator cannot reach the internet (for example air-gapped or restricted networks). MkDocs Material otherwise tries to download the Roboto font from Google during generation. + +When `true`, TechDocs patches each `mkdocs.yml` during generation: if no `theme` section exists it adds `name: material` and `font: false`; if a `theme` exists but `font` is omitted, it sets `font: false`; if `font` is already set in the file, your value is left unchanged. + +**Example:** + +```yaml +techdocs: + generator: + mkdocs: + disableExternalFonts: true +``` + +Alternatively, configure `mkdocs.yml` manually: + +```yaml +theme: + name: material + font: false +``` + +**Note:** When using `theme.font` in `mkdocs.yml`, `theme.name: material` is required. If `font` is already set in the file, app-config patching does not override it; it only adds `font: false` when `font` was not configured. + #### Default Plugins `techdocs.generator.mkdocs.defaultPlugins` diff --git a/docs/features/techdocs/how-to-guides--old.md b/docs/features/techdocs/how-to-guides--old.md index 175a8e2ee8..992124177d 100644 --- a/docs/features/techdocs/how-to-guides--old.md +++ b/docs/features/techdocs/how-to-guides--old.md @@ -92,7 +92,7 @@ the source code hosting provider. Notice that instead of the `dir:` prefix, the `url:` prefix is used instead. For example: - **GitHub**: `url:https://githubhost.com/org/repo/tree/` -- **GitLab**: `url:https://gitlabhost.com/org/repo/tree/` +- **GitLab**: `url:https://gitlabhost.com/org/repo` - **Bitbucket**: `url:https://bitbuckethost.com/project/repo/src/` - **Azure**: `url:https://azurehost.com/organization/project/_git/repository` diff --git a/docs/features/techdocs/how-to-guides.md b/docs/features/techdocs/how-to-guides.md index 10b8270283..2678b5c6f1 100644 --- a/docs/features/techdocs/how-to-guides.md +++ b/docs/features/techdocs/how-to-guides.md @@ -93,7 +93,7 @@ the source code hosting provider. Notice that instead of the `dir:` prefix, the `url:` prefix is used instead. For example: - **GitHub**: `url:https://githubhost.com/org/repo/tree/` -- **GitLab**: `url:https://gitlabhost.com/org/repo/tree/` +- **GitLab**: `url:https://gitlabhost.com/org/repo` - **Bitbucket**: `url:https://bitbuckethost.com/project/repo/src/` - **Azure**: `url:https://azurehost.com/organization/project/_git/repository` @@ -373,9 +373,24 @@ on how you have configured your `template.yaml`. Done! You now have support for TechDocs in your own software template! -### Prevent download of Google fonts +### Disable external fonts -If your Backstage instance does not have internet access, the generation will fail. TechDocs tries to download the Roboto font from Google. You can disable it by adding the following lines to mkdocs.yaml: +`techdocs.generator.mkdocs.disableExternalFonts` + +(Optional) Use this when the generator cannot reach the internet (for example air-gapped or restricted networks). MkDocs Material otherwise tries to download the Roboto font from Google during generation. + +When `true`, TechDocs patches each `mkdocs.yml` during generation: if no `theme` section exists it adds `name: material` and `font: false`; if a `theme` exists but `font` is omitted, it sets `font: false`; if `font` is already set in the file, your value is left unchanged. + +**Example:** + +```yaml +techdocs: + generator: + mkdocs: + disableExternalFonts: true +``` + +Alternatively, configure `mkdocs.yml` manually: ```yaml theme: @@ -383,11 +398,19 @@ theme: font: false ``` -:::note Note +**Note:** When using `theme.font` in `mkdocs.yml`, `theme.name: material` is required. If `font` is already set in the file, app-config patching does not override it; it only adds `font: false` when `font` was not configured. -The addition `name: material` is necessary. Otherwise it will not work +#### Using techdocs-cli in CI/CD -::: +When generating TechDocs sites in CI/CD workflows using `techdocs-cli`, you can +use the `--disableExternalFonts` flag: + +```bash +techdocs-cli generate --disableExternalFonts +``` + +This will automatically patch the `mkdocs.yml` file during the generation +process, just like the `app-config.yaml` option does for local generation. ## How to enable iframes in TechDocs diff --git a/docs/frontend-system/building-plugins/06-swappable-components.md b/docs/frontend-system/building-plugins/06-swappable-components.md index 786388b3c8..7978ba667b 100644 --- a/docs/frontend-system/building-plugins/06-swappable-components.md +++ b/docs/frontend-system/building-plugins/06-swappable-components.md @@ -8,11 +8,11 @@ description: Configuring or overriding Swappable Components # Swappable components Swappable components are a feature of the frontend system that allow you to replace the implementations of components that are used in your Backstage app. -These Swappable Components are defined using `createSwappableComponent` and then can be exported from a plugins `-react` package in order to be used in both other plugins, and to be rebound to a new implementation by the Backstage Integrator. +These Swappable Components are defined using `createSwappableComponent` and then can be exported from a plugin's `-react` package in order to be used in both other plugins, and to be rebound to a new implementation by the Backstage Integrator. ## Creating a Swappable Component -In order to create a Swappable Component, you need to use the `createSwappableComponent` function from the `@backstage/frontend-plugin-api` package. You can supply a default implementation for the component, as well as a way to separate both the props of the external component and in the implementation of the component. +In order to create a Swappable Component, you need to use the `createSwappableComponent` function from the `@backstage/frontend-plugin-api` package. You can supply a default implementation for the component, as well as a way to separate the props of the external component from the props used by the implementation of the component. ```tsx title="in @internal/plugin-example-react" import { createSwappableComponent } from '@backstage/frontend-plugin-api'; @@ -20,9 +20,9 @@ import { createSwappableComponent } from '@backstage/frontend-plugin-api'; export const ExampleSwappableComponent = createSwappableComponent({ name: 'example', - // This is a loader for loading the default implementation of the component when there's no overriden + // This is a loader for loading the default implementation of the component when there's no overriding // implementation created with `SwappableComponentBlueprint`. - // It can be sync like below, but is can also be async like `loader: () => import('./DefaultImplementation').then(m => m.DefaultImplementation)`. + // It can be sync like below, but it can also be async like `loader: () => import('./DefaultImplementation').then(m => m.DefaultImplementation)`. loader: () => (props: { name: string }) =>
Your name is {props.name}
, @@ -60,7 +60,7 @@ import appPlugin from '@backstage/plugin-app'; const app = createApp({ features: [ - // Using a module to provide the extenion to the app + // Using a module to provide the extension to the app createFrontendModule({ pluginId: 'app', extensions: [ @@ -74,7 +74,7 @@ const app = createApp({ }), ], }), - // Core components that already ship with the app plugin can be overriden using getExtension() + // Core components that already ship with the app plugin can be overridden using getExtension() appPlugin.withOverrides({ extensions: [ appPlugin.getExtension('component:app/core-progress').override({ @@ -94,9 +94,9 @@ const app = createApp({ Currently there are only three different built-in Swappable Components that you can replace the implementations of, and these live in `@backstage/frontend-plugin-api`. They are as follows: -- ` -- ` -- ` +- `` +- `` +- `` You can see more about these components at their [definition](https://github.com/backstage/backstage/blob/master/packages/frontend-plugin-api/src/components/DefaultSwappableComponents.tsx), and their default implementations are shipped inside the [`app-plugin`](https://github.com/backstage/backstage/blob/master/plugins/app/src/extensions/components.tsx). diff --git a/docs/golden-path/plugins/backend/003-persistence.md b/docs/golden-path/plugins/backend/003-persistence.md index 60d275d7ec..a164d89995 100644 --- a/docs/golden-path/plugins/backend/003-persistence.md +++ b/docs/golden-path/plugins/backend/003-persistence.md @@ -13,8 +13,323 @@ You may have noticed that your list of TODOs disappears after you restart your B SQLite is the default database for local development. It runs in memory (and can also run from a file on disk). It supports quick iteration cycles and can be easily deleted if anything goes wrong. +### What does our data look like at rest? + +Writing to a database requires a table, which requires us to chat quickly about what we want to store. Our TODO object with `title`, `id`, `createdBy` and `createdAt` keys is a good fit to map 1:1 with our database schema. + ## Adding the `databaseService` to your plugin - +### The plumbing + +To start, let's just plumb through the general `databaseService` usage we expect. + +First, add a new service dependency on `databaseService`, + +```diff file="src/services/TodoListService.ts" + +export const todoListServiceRef = createServiceRef>({ + id: 'todo.list', + defaultFactory: async service => + createServiceFactory({ + service, + deps: { + logger: coreServices.logger, + catalog: catalogServiceRef, ++ database: coreServices.database, + }, + async factory(deps) { + return TodoListService.create(deps); + }, + }), +}); +``` + +We then need to add it to our service, + +```diff file="src/services/TodoListService.ts" ++import type { Knex } from 'knex'; +import { + coreServices, + createServiceFactory, + createServiceRef, + LoggerService, ++ DatabaseService, +} from '@backstage/backend-plugin-api'; + +export class TodoListService { ++ readonly #database: Knex; + +- readonly #storedTodos = new Array(); + +- static create(options: { ++ static async create(options: { + logger: LoggerService; + catalog: typeof catalogServiceRef.T; ++ database: DatabaseService; + }) { + const knex = await options.database.getClient(); +- return new TodoListService(options.logger, options.catalog); ++ return new TodoListService(options.logger, options.catalog, knex); + } + + private constructor( + logger: LoggerService, + catalog: typeof catalogServiceRef.T, ++ database: Knex, + ) { + this.#logger = logger; + this.#catalog = catalog; ++ this.#database = database; + } +``` + +And with that, we have an isolated `knex` client to communicate with our database! + +### Creating your table + +Unfortunately, without tables in our database, our `knex` client is not doing much. We need to create a _migration_. Knex stores migrations as JavaScript/TypeScript files that get executed as part of a call to `knex.migrate.latest()`. By default, these are stored in a `migrations/` directory. + +Let's get started. First, we need to install `knex` as a dependency so both its CLI and imported `Knex` types are available, + +```bash +yarn workspace @internal/plugin-todo-backend add knex +``` + +Now, running this command will scaffold a file in that `migrations/` directory for us. + +```bash +yarn workspace @internal/plugin-todo-backend knex migrate:make init --migrations-directory ./migrations +``` + +This should spit out a message like + +```bash +Created Migration: ~/Projects/backstage/backstage/plugins/todo-backend/migrations/20260323130057_init.js +``` + +Let's open that file, + +```js +/** + * @param { import("knex").Knex } knex + * @returns { Promise } + */ +exports.up = async function up(knex) { + // await knex.schema... +}; + +/** + * @param { import("knex").Knex } knex + * @returns { Promise } + */ +exports.down = async function down(knex) { + // await knex.schema... +}; +``` + +You can see two functions, `up` and `down`. `up` is called to apply a migration and `down` is used to undo a previous migration. These should be reversible - if you call `up` and then `down` the database should generally be in the same state if those commands hadn't been run. + +Let's create our table, + +```diff +exports.up = async function up(knex) { ++ await knex.schema.createTable('todo', table => { ++ table.uuid('id').primary(); ++ table.string('created_by', 255).notNullable(); ++ table.string('title').notNullable(); ++ table.datetime('created_at').defaultTo(knex.fn.now()).notNullable(); + ++ table.index(['created_by'], 'todo_user_idx'); + }); +}; +``` + +You'll notice that we use `snake_case` instead of `camelCase` - that's how SQL is conventionally written. + +Let's make sure that we don't forget to add a `down` migration as well! + +```diff +/** + * @param {import('knex').Knex} knex + */ +exports.down = async function down(knex) { ++ await knex.schema.dropTable('todo'); +}; +``` + +Now, we need to actually tell our `knex` client to automatically apply these migrations. We'll add the `database` service to our plugin's `init` function, + +```diff file="src/plugin.ts" +import { + coreServices, + createBackendPlugin, ++ resolvePackagePath, +} from '@backstage/backend-plugin-api'; + +// ... + + deps: { + httpAuth: coreServices.httpAuth, + httpRouter: coreServices.httpRouter, ++ logger: coreServices.logger, ++ database: coreServices.database, + todoList: todoListServiceRef, + }, +- async init({ httpAuth, httpRouter, todoList }) { ++ async init({ httpAuth, logger, httpRouter, database, todoList }) { ++ const knex = await database.getClient(); ++ ++ if (!database.migrations?.skip) { ++ logger.info('Running database migrations...'); ++ ++ const migrationsDir = resolvePackagePath( ++ '@internal/plugin-todo-backend', ++ 'migrations', ++ ); ++ ++ await knex.migrate.latest({ ++ directory: migrationsDir, ++ }); ++ } + + httpRouter.use( + await createRouter({ + httpAuth, + todoList, + }), + ); +``` + +Walking through what we've written - + +1. `database.migrations?.skip` - convention for migrations to allow them to be skipped through config. +1. `const migrationsDir = resolvePackagePath` - ensure the correct migrations directory is passed regardless of environment. +1. `await knex.migrate.latest(` - actually run the migration, calls our `up` method we wrote above. + +We also need to do 1 more thing, + +```diff file="package.json" +"files": [ +- "dist" ++ "dist", ++ "migrations" + ], +``` + +This will make sure the migrations in our plugin work for all users. + +For those who want more details, the full [Knex migration docs](https://knexjs.org/guide/migrations.html#migration-cli) are very informative! + +### Defining our types + +Now that we have our table, we need to add types for it to protect against runtime incompatibilities. For now, these are hand written. + +```diff title="src/services/TodoListService.ts" ++export interface TodoDatabaseRow { ++ title: string; ++ id: string; ++ created_by: string; ++ created_at: string; ++} + +export interface TodoItem { + title: string; + id: string; + createdBy: string; + createdAt: string; +} +``` + +Notice the change to snake case as it has to match the database schema we have above. Now we need to transform `TodoItem` to `TodoDatabaseRow` for writes and `TodoDatabaseRow` to `TodoItem` for reads. + +```diff title="src/services/TodoListService.ts" + private constructor( + logger: LoggerService, + catalog: typeof catalogServiceRef.T, ++ database: Knex, + ) { + this.#logger = logger; + this.#catalog = catalog; ++ this.#database = database; + } + ++ private toDatabaseRow(todo: TodoItem): TodoDatabaseRow { ++ return { ++ id: todo.id, ++ title: todo.title, ++ created_by: todo.createdBy, ++ created_at: todo.createdAt, ++ }; ++ } + ++ private fromDatabaseRow(row: TodoDatabaseRow): TodoItem { ++ return { ++ id: row.id, ++ title: row.title, ++ createdBy: row.created_by, ++ createdAt: row.created_at, ++ }; ++ } +``` + +And that's it! You're now set up to actually read from and write to your database. + +### Writing to your table + +Creating your table was a solid chunk of work - thankfully, writing to it is going to be much easier! + +```diff title="src/services/TodoListService.ts" + + async createTodo( + // ... + const id = crypto.randomUUID(); + const createdBy = options.credentials.principal.userEntityRef; + const newTodo = { + title, + id, + createdBy, + createdAt: new Date().toISOString(), + }; + +- this.#storedTodos.push(newTodo); ++ await this.#database ++ .insert(this.toDatabaseRow(newTodo)) ++ .into('todo'); + + return newTodo; + } +``` + +We've basically just updated our service call to use `this.#database` instead of `this.#storedTodos`. + +### Reading from your table + +Now that we have things in our database, how do we actually get them back out again? + +```diff title="src/services/TodoListService.ts" + + async listTodos(): Promise<{ items: TodoItem[] }> { +- return { items: Array.from(this.#storedTodos) }; ++ const rows = await this.#database('todo').select(); ++ return { items: rows.map(row => this.fromDatabaseRow(row)) }; + } + + async getTodo(request: { id: string }): Promise { +- const todo = this.#storedTodos.find(item => item.id === request.id); ++ const item = await this.#database('todo').where({ id: request.id }).first(); +- if (!todo) { ++ if (!item) { + throw new NotFoundError(`No todo found with id '${request.id}'`); + } +- return todo; ++ return this.fromDatabaseRow(item); + } +``` + +And we're done! ## Testing your changes + +To validate this flow, let's use the same commands that we ran in [the last section of this guide](./002-poking-around.md#testing-locally). + +If everything is working correctly, you will see the same response that you did last time. diff --git a/docs/golden-path/plugins/backend/004-source-tracked.md b/docs/golden-path/plugins/backend/004-reading-from-source.md similarity index 93% rename from docs/golden-path/plugins/backend/004-source-tracked.md rename to docs/golden-path/plugins/backend/004-reading-from-source.md index 54013ccead..87ca4b210e 100644 --- a/docs/golden-path/plugins/backend/004-source-tracked.md +++ b/docs/golden-path/plugins/backend/004-reading-from-source.md @@ -1,5 +1,5 @@ --- -id: source-tracked +id: reading-from-source sidebar_label: 004 - Integrating with SCMs title: 004 - Git-tracked TODOs description: How to ingest TODOs from source code repositories into your plugin diff --git a/docs/integrations/aws-s3/discovery.md b/docs/integrations/aws-s3/discovery.md index 74e2fde6a5..c18f119444 100644 --- a/docs/integrations/aws-s3/discovery.md +++ b/docs/integrations/aws-s3/discovery.md @@ -31,6 +31,7 @@ catalog: bucketName: sample-bucket prefix: prefix/ # optional region: us-east-2 # optional, uses the default region otherwise + accountId: '123456789012' # optional, uses the main account otherwise schedule: # same options as in SchedulerServiceTaskScheduleDefinition # supports cron, ISO duration, "human duration" as used in code frequency: { minutes: 30 } @@ -51,6 +52,7 @@ catalog: bucketName: sample-bucket prefix: prefix/ # optional region: us-east-2 # optional, uses the default region otherwise + accountId: '123456789012' # optional, uses the main account otherwise schedule: # same options as in SchedulerServiceTaskScheduleDefinition # supports cron, ISO duration, "human duration" as used in code frequency: { minutes: 30 } diff --git a/docs/integrations/azure/org.md b/docs/integrations/azure/org.md index 3c82f6e2be..defe0aab41 100644 --- a/docs/integrations/azure/org.md +++ b/docs/integrations/azure/org.md @@ -50,6 +50,37 @@ backend.add(import('@backstage/plugin-catalog-backend-module-msgraph')); /* highlight-add-end */ ``` +## Incremental Ingestion for Large Tenants + +For very large Azure AD tenants where loading the full dataset into memory at once is not feasible, the `@backstage/plugin-catalog-backend-module-msgraph-incremental` package provides a memory-efficient alternative. It processes users and groups one page at a time and persists the `@odata.nextLink` cursor so ingestion resumes from the last completed page after a pod restart. + +```bash title="From your Backstage root directory" +yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-incremental-ingestion +yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-msgraph-incremental +``` + +```ts title="packages/backend/src/index.ts" +backend.add(import('@backstage/plugin-catalog-backend')); +/* highlight-add-start */ +backend.add( + import('@backstage/plugin-catalog-backend-module-incremental-ingestion'), +); +backend.add( + import('@backstage/plugin-catalog-backend-module-msgraph-incremental'), +); +/* highlight-add-end */ +``` + +It uses the same `catalog.providers.microsoftGraphOrg` configuration as the standard module. The following options are **not** supported by the incremental provider: `userGroupMember*` and `groupIncludeSubGroups`. Use `MicrosoftGraphOrgEntityProvider` if you require those. + +| | `MicrosoftGraphOrgEntityProvider` | Incremental provider | +| -------------------------- | --------------------------------- | -------------------- | +| Memory usage | Full dataset in RAM | One page at a time | +| Resume on restart | Starts from scratch | Resumes from cursor | +| `userGroupMember*` options | Supported | Not supported | +| `groupIncludeSubGroups` | Supported | Not supported | +| Suitable for large tenants | No | Yes | + ## Authenticating with Microsoft Graph ### Local Development diff --git a/docs/releases/v1.51.0-next.0-changelog.md b/docs/releases/v1.51.0-next.0-changelog.md new file mode 100644 index 0000000000..a538defb4f --- /dev/null +++ b/docs/releases/v1.51.0-next.0-changelog.md @@ -0,0 +1,2605 @@ +# Release v1.51.0-next.0 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.51.0-next.0](https://backstage.github.io/upgrade-helper/?to=1.51.0-next.0) + +## @backstage/backend-app-api@1.7.0-next.0 + +### Minor Changes + +- 3595c97: Added `ExtensionPointFactoryMiddleware` type and `createExtensionPointFactoryMiddleware` helper to reimplement extension point outputs at backend creation time. + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + +## @backstage/frontend-plugin-api@0.17.0-next.0 + +### Minor Changes + +- 8738203: **BREAKING**: Removed the deprecated property form of `PortableSchema.schema`. The `schema` member is now a plain method that must be called as `schema()` — direct property access like `schema.type` or `schema.properties` is no longer supported. + +### Patch Changes + +- cad156e: Replaced old config schema values from existing extensions and blueprints. +- 72a552f: Updated error messages and deprecation warnings to clarify that the `zod/v4` subpath export from the Zod v3 package is not supported by `configSchema`, since it does not include JSON Schema conversion. The `zod` dependency has been bumped to `^4.0.0`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @backstage/ui@0.15.0-next.0 + +### Minor Changes + +- a281469: Add support for flex item props (`grow`, `shrink`, and `basis`) to `Box`, `Card`, `Grid`, and `Flex` itself. + + **Affected components:** Box, Card, Grid, Flex + +### Patch Changes + +- 3846774: Added missing dependencies that were previously only available transitively. + +- e8a1a35: 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 + +- e2d9831: Tightened React Aria dependency version ranges from `^` to `~` to prevent unintended minor version upgrades. + +- a42766e: Fixed dark mode background for Dialog component by correcting the theme attribute selector from `data-theme` to `data-theme-mode`. + + **Affected components:** Dialog + +- c6fc76f: Fixed an issue where the active tab indicator would disappear shortly after page load for uncontrolled Tabs. + + **Affected components:** Tabs + +- d1be10c: Updated React Aria dependencies to v1.17.0 and migrated imports from individual `@react-aria/*` and `@react-stately/*` packages to the monopackages (`react-aria`, `react-stately`). This fixes a type resolution error for `@react-types/table` that occurred in new app installations. + +- 401916d: Added new `DateRangePicker` component — combines two date fields and a calendar popover for selecting a date range, built on React Aria with full keyboard and screen reader accessibility. Uses BUI design tokens throughout, including auto-incremented backgrounds via the bg consumer pattern. + +- Updated dependencies + - @backstage/version-bridge@1.0.12 + +## @backstage/app-defaults@1.7.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/backend-defaults@0.17.1-next.0 + +### Patch Changes + +- 3595c97: Exported `defaultServiceFactories` to allow use with `createSpecializedBackend` for advanced configuration like `extensionPointFactoryMiddleware`. +- 89d3248: Fixed scheduler `sleep` firing immediately for durations longer than ~24.8 days, caused by Node.js `setTimeout` overflowing its 32-bit millisecond limit. +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-app-api@1.7.0-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/config-loader@1.10.11-next.0 + - @backstage/integration-aws-node@0.1.22-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/backend-dev-utils@0.1.7 + - @backstage/types@1.2.2 + +## @backstage/backend-dynamic-feature-service@0.8.2-next.0 + +### Patch Changes + +- 41070b8: Upgraded `@module-federation/enhanced`, `@module-federation/runtime`, and `@module-federation/sdk` from `^0.21.6` to `^2.3.3` to address known vulnerabilities. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/plugin-catalog-backend@3.6.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.9-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/config-loader@1.10.11-next.0 + - @backstage/plugin-events-backend@0.6.2-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.45-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/backend-openapi-utils@0.6.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/backend-plugin-api@1.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/types@1.2.2 + +## @backstage/backend-test-utils@1.11.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-app-api@1.7.0-next.0 + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/types@1.2.2 + +## @backstage/catalog-client@1.15.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + +## @backstage/catalog-model@1.8.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/cli@0.36.2-next.0 + +### Patch Changes + +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-module-build@0.1.3-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/cli-defaults@0.1.2-next.0 + - @backstage/cli-module-test-jest@0.1.2-next.0 + - @backstage/eslint-plugin@0.2.3 + +## @backstage/cli-common@0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + +## @backstage/cli-defaults@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-module-build@0.1.3-next.0 + - @backstage/cli-module-actions@0.1.1-next.0 + - @backstage/cli-module-auth@0.1.2-next.0 + - @backstage/cli-module-migrate@0.1.2-next.0 + - @backstage/cli-module-new@0.1.3-next.0 + - @backstage/cli-module-config@0.1.2-next.0 + - @backstage/cli-module-github@0.1.2-next.0 + - @backstage/cli-module-info@0.1.2-next.0 + - @backstage/cli-module-lint@0.1.2-next.0 + - @backstage/cli-module-maintenance@0.1.2-next.0 + - @backstage/cli-module-test-jest@0.1.2-next.0 + - @backstage/cli-module-translations@0.1.2-next.0 + +## @backstage/cli-module-actions@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-node@0.3.2-next.0 + +## @backstage/cli-module-auth@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-node@0.3.2-next.0 + +## @backstage/cli-module-build@0.1.3-next.0 + +### Patch Changes + +- ed4ee6f: Fixed config path resolution for the embedded-postgres database client detection to resolve paths relative to the target package directory rather than the workspace root. +- 41070b8: Upgraded `@module-federation/enhanced`, `@module-federation/runtime`, and `@module-federation/sdk` from `^0.21.6` to `^2.3.3` to address known vulnerabilities. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/module-federation-common@0.1.4-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/config-loader@1.10.11-next.0 + +## @backstage/cli-module-config@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/config-loader@1.10.11-next.0 + - @backstage/types@1.2.2 + +## @backstage/cli-module-github@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + +## @backstage/cli-module-info@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + +## @backstage/cli-module-lint@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + +## @backstage/cli-module-maintenance@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + +## @backstage/cli-module-migrate@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/release-manifests@0.0.13 + +## @backstage/cli-module-new@0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + +## @backstage/cli-module-test-jest@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + +## @backstage/cli-module-translations@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + +## @backstage/cli-node@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/types@1.2.2 + +## @backstage/codemods@0.1.57-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + +## @backstage/config@1.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/config-loader@1.10.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + +## @backstage/core-app-api@1.20.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.15.0-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @backstage/core-compat-api@0.5.11-next.0 + +### Patch Changes + +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/plugin-app-react@0.2.3-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @backstage/core-components@0.18.10-next.0 + +### Patch Changes + +- 3846774: Added missing dependencies that were previously only available transitively. +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/version-bridge@1.0.12 + +## @backstage/core-plugin-api@1.12.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @backstage/create-app@0.8.3-next.0 + +### Patch Changes + +- 927c003: Replaced internal error utilities with shared ones from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + +## @backstage/dev-utils@1.1.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/app-defaults@1.7.8-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + +## @backstage/errors@1.3.1-next.0 + +### Patch Changes + +- 8741e5a: Added explicit `name` property to `ServiceUnavailableError` for consistency with all other error classes, making it resilient to minification. +- Updated dependencies + - @backstage/types@1.2.2 + +## @backstage/filter-predicates@0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + +## @backstage/frontend-app-api@0.16.3-next.0 + +### Patch Changes + +- f79eaf2: Internal cleanup of routing utilities. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/frontend-defaults@0.5.2-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @backstage/frontend-defaults@0.5.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-app@0.4.6-next.0 + - @backstage/frontend-app-api@0.16.3-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/config@1.3.8-next.0 + +## @backstage/frontend-dev-utils@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-app@0.4.6-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/frontend-defaults@0.5.2-next.0 + +## @backstage/frontend-dynamic-feature-loader@0.1.12-next.0 + +### Patch Changes + +- 41070b8: Upgraded `@module-federation/enhanced`, `@module-federation/runtime`, and `@module-federation/sdk` from `^0.21.6` to `^2.3.3` to address known vulnerabilities. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/module-federation-common@0.1.4-next.0 + - @backstage/config@1.3.8-next.0 + +## @backstage/frontend-test-utils@0.5.3-next.0 + +### Patch Changes + +- 0c298f7: Removed internal `mockWithApiFactory` helper in favor of using `attachMockApiFactory` directly. +- 9279ea8: Added explicit type annotations to `.map()` callback parameters in `renderInTestApp` to avoid implicit `any` errors with newer TypeScript versions. +- Updated dependencies + - @backstage/plugin-app@0.4.6-next.0 + - @backstage/frontend-app-api@0.16.3-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-app-react@0.2.3-next.0 + - @backstage/test-utils@1.7.18-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/integration@2.0.2-next.0 + +### Patch Changes + +- b62781f: Moved `registerMswTestHooks` to test files. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + +## @backstage/integration-aws-node@0.1.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + +## @backstage/integration-react@1.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + +## @backstage/module-federation-common@0.1.4-next.0 + +### Patch Changes + +- 41070b8: Upgraded `@module-federation/enhanced`, `@module-federation/runtime`, and `@module-federation/sdk` from `^0.21.6` to `^2.3.3` to address known vulnerabilities. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + +## @backstage/repo-tools@0.17.2-next.0 + +### Patch Changes + +- 927c003: Replaced internal error utilities with shared ones from `@backstage/cli-common`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/config-loader@1.10.11-next.0 + +## @techdocs/cli@1.10.8-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-techdocs-node@1.14.6-next.0 + +## @backstage/test-utils@1.7.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/theme@0.7.3 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/plugin-api-docs@0.14.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-catalog@2.0.5-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/plugin-app@0.4.6-next.0 + +### Patch Changes + +- d1be10c: Migrated React Aria imports from individual packages (`@react-aria/toast`, `@react-aria/button`, `@react-stately/toast`) to the monopackages (`react-aria`, `react-stately`). +- e2d9831: Tightened React Aria dependency version ranges from `^` to `~` to prevent unintended minor version upgrades. +- cad156e: Replaced old config schema values from existing extensions and blueprints. +- 085133f: The `zod` dependency has been bumped from `^3.25.76 || ^4.0.0` to `^4.0.0`, since `configSchema` requires the full Zod v4 package for JSON Schema support. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/plugin-app-react@0.2.3-next.0 + - @backstage/theme@0.7.3 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/plugin-app-backend@0.5.14-next.0 + +### Patch Changes + +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/config-loader@1.10.11-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.45-next.0 + +## @backstage/plugin-app-node@0.1.45-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config-loader@1.10.11-next.0 + +## @backstage/plugin-app-react@0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + +## @backstage/plugin-app-visualizer@0.2.4-next.0 + +### Patch Changes + +- e2d9831: Tightened React Aria dependency version ranges from `^` to `~` to prevent unintended minor version upgrades. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + +## @backstage/plugin-auth@0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/theme@0.7.3 + +## @backstage/plugin-auth-backend@0.28.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.4.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-auth-backend@0.28.1-next.0 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-github-provider@0.5.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-google-provider@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-guest-provider@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.4.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.16-next.0 + +### Patch Changes + +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-auth-backend@0.28.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-okta-provider@0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-auth-backend-module-openshift-provider@0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.5.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + +## @backstage/plugin-auth-node@0.7.1-next.0 + +### Patch Changes + +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-react@0.1.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + +## @backstage/plugin-bitbucket-cloud-common@0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.2-next.0 + +## @backstage/plugin-catalog@2.0.5-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- cad156e: Replaced old config schema values from existing extensions and blueprints. +- 085133f: The `zod` dependency has been bumped from `^3.25.76 || ^4.0.0` to `^4.0.0`, since `configSchema` requires the full Zod v4 package for JSON Schema support. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/core-compat-api@0.5.11-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/plugin-search-react@1.11.4-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-scaffolder-common@2.1.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-catalog-backend@3.6.1-next.0 + +### Patch Changes + +- b33f845: Fixed several database migration `down` functions that were not properly reversible, causing the SQL report to show warnings: + + - `20241003170511_alter_target_in_locations.js`: both `up` and `down` now include `.notNullable()` when altering the `locations.target` column, preventing the `NOT NULL` constraint from being accidentally dropped when widening the column type from `varchar(255)` to `text`. + - `20220116144621_remove_legacy.js`: the `down` function now properly recreates the three dropped legacy tables (`entities`, `entities_search`, `entities_relations`) with correct columns and indices. + - `20210302150147_refresh_state.js`: the `down` function now drops dependent tables in the correct order (avoiding a FK constraint violation) and fixes a typo where the table was referred to as `references` instead of `refresh_state_references`. + - `20201005122705_add_entity_full_name.js`: the `down` function now drops the `full_name` column from `entities` (not `entities_search`), and restores the `entities_unique_name` index with the correct column order `(kind, name, namespace)`. + - `20200702153613_entities.js`: the `down` function now uses `table.integer('generation')` instead of `table.string('generation')`, restoring the correct column type. + +- cf195de: Fixed a performance regression in the `/entity-facets` endpoint when filters or permission conditions are applied, by routing the EXISTS-based filter through `final_entities` instead of correlating against the much larger `search` table. + +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-openapi-utils@0.6.9-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.4.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/integration-aws-node@0.1.22-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-kubernetes-common@0.9.12-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.3.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-openapi-utils@0.6.9-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.10-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.12-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.13.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-backend-module-github@0.13.2-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.8.3-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.8.3-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.12-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/plugin-catalog-backend@3.6.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-backend-module-ldap@0.12.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-logs@0.1.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.6.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.9.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-scaffolder-common@2.1.1-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.6.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.15-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + +## @backstage/plugin-catalog-common@1.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-catalog-graph@0.6.4-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- cad156e: Replaced old config schema values from existing extensions and blueprints. +- 085133f: The `zod` dependency has been bumped from `^3.25.76 || ^4.0.0` to `^4.0.0`, since `configSchema` requires the full Zod v4 package for JSON Schema support. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-import@0.13.13-next.0 + +### Patch Changes + +- 39eb61b: Internal refactor +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/plugin-catalog-node@2.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/backend-test-utils@1.11.3-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-catalog-react@2.1.5-next.0 + +### Patch Changes + +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- cad156e: Replaced old config schema values from existing extensions and blueprints. +- 085133f: The `zod` dependency has been bumped from `^3.25.76 || ^4.0.0` to `^4.0.0`, since `configSchema` requires the full Zod v4 package for JSON Schema support. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/frontend-test-utils@0.5.3-next.0 + - @backstage/core-compat-api@0.5.11-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/core-compat-api@0.5.11-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.15-next.0 + +## @backstage/plugin-catalog-unprocessed-entities-common@0.0.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + +## @backstage/plugin-config-schema@0.1.80-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-devtools@0.1.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/core-compat-api@0.5.11-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-devtools-common@0.1.25-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/plugin-devtools-backend@0.5.17-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/config-loader@1.10.11-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-devtools-common@0.1.25-next.0 + +## @backstage/plugin-devtools-common@0.1.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-devtools-react@0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + +## @backstage/plugin-events-backend@0.6.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-openapi-utils@0.6.9-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-aws-sqs@0.4.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-azure@0.2.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-server@0.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + +## @backstage/plugin-events-backend-module-gerrit@0.2.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + +## @backstage/plugin-events-backend-module-github@0.4.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-gitlab@0.3.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + +## @backstage/plugin-events-backend-module-google-pubsub@0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-kafka@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-test-utils@0.1.55-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.22-next.0 + +## @backstage/plugin-events-node@0.4.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-gateway-backend@1.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-home@0.9.5-next.0 + +### Patch Changes + +- 419141e: Fixed widgets not being movable or resizable after saved edits. Previously, entering edit mode didn't restore `isDraggable` and `isResizable`. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/core-compat-api@0.5.11-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-home-react@0.1.38-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + +## @backstage/plugin-home-react@0.1.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/core-compat-api@0.5.11-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + +## @backstage/plugin-kubernetes@0.12.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-kubernetes-react@0.5.19-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-kubernetes-common@0.9.12-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/plugin-kubernetes-backend@0.21.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-kubernetes-node@0.4.4-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/integration-aws-node@0.1.22-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.12-next.0 + +## @backstage/plugin-kubernetes-cluster@0.0.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/plugin-kubernetes-react@0.5.19-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-kubernetes-common@0.9.12-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/plugin-kubernetes-common@0.9.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-kubernetes-node@0.4.4-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.12-next.0 + +## @backstage/plugin-kubernetes-react@0.5.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.12-next.0 + +## @backstage/plugin-mcp-actions-backend@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-mui-to-bui@0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.15.0-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + +## @backstage/plugin-notifications@0.5.17-next.0 + +### Patch Changes + +- 3846774: Added missing dependencies that were previously only available transitively. +- e2d9831: Tightened React Aria dependency version ranges from `^` to `~` to prevent unintended minor version upgrades. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-notifications-common@0.2.3-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/plugin-signals-react@0.0.22-next.0 + +## @backstage/plugin-notifications-backend@0.6.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-notifications-common@0.2.3-next.0 + - @backstage/plugin-notifications-node@0.2.26-next.0 + - @backstage/plugin-signals-node@0.2.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-notifications-backend-module-email@0.3.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-notifications-common@0.2.3-next.0 + - @backstage/plugin-notifications-node@0.2.26-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/integration-aws-node@0.1.22-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-notifications-backend-module-slack@0.4.2-next.0 + +### Patch Changes + +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- f399a7a: Added scope-based message update support. When a notification is re-sent with the same `scope` and `notification.updated` is set, the processor now calls `chat.update()` on the existing Slack message instead of sending a duplicate via `chat.postMessage()`. Message timestamps are persisted in a new `slack_message_timestamps` database table with automatic daily cleanup. The processor gracefully degrades to the previous behavior when no database is provided. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-notifications-common@0.2.3-next.0 + - @backstage/plugin-notifications-node@0.2.26-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-notifications-common@0.2.3-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-notifications-node@0.2.26-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/plugin-notifications-common@0.2.3-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-org@0.7.4-next.0 + +### Patch Changes + +- cad156e: Replaced old config schema values from existing extensions and blueprints. +- 085133f: The `zod` dependency has been bumped from `^3.25.76 || ^4.0.0` to `^4.0.0`, since `configSchema` requires the full Zod v4 package for JSON Schema support. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + +## @backstage/plugin-org-react@0.1.50-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + +## @backstage/plugin-permission-backend@0.7.12-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + +## @backstage/plugin-permission-common@0.9.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-permission-node@0.10.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + +## @backstage/plugin-permission-react@0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + +## @backstage/plugin-proxy-backend@0.6.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-proxy-node@0.1.15-next.0 + +## @backstage/plugin-proxy-node@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @backstage/plugin-scaffolder@1.36.3-next.0 + +### Patch Changes + +- 415e30b: Simplified the `OwnerEntityColumn` in the task list to rely on `EntityRefLink` and the entity presentation API instead of manually fetching entities from the catalog. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/plugin-scaffolder-react@1.20.2-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-scaffolder-common@2.1.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-scaffolder-backend@3.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-openapi-utils@0.6.9-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/plugin-scaffolder-common@2.1.1-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.10-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.23-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.9-next.0 + +### Patch Changes + +- 3846774: Added missing dependencies that were previously only available transitively. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-notifications-common@0.2.3-next.0 + - @backstage/plugin-notifications-node@0.2.26-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.22-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node-test-utils@0.3.11-next.0 + +## @backstage/plugin-scaffolder-common@2.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-node@0.13.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/backend-test-utils@1.11.3-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/plugin-scaffolder-common@2.1.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/backend-test-utils@1.11.3-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-react@1.20.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/frontend-test-utils@0.5.3-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-scaffolder-common@2.1.1-next.0 + - @backstage/theme@0.7.3 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-permission-react@0.5.1-next.0 + +## @backstage/plugin-search@1.7.4-next.0 + +### Patch Changes + +- cad156e: Replaced old config schema values from existing extensions and blueprints. +- 085133f: The `zod` dependency has been bumped from `^3.25.76 || ^4.0.0` to `^4.0.0`, since `configSchema` requires the full Zod v4 package for JSON Schema support. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-search-react@1.11.4-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-search-backend@2.1.2-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-openapi-utils@0.6.9-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-search-backend-module-catalog@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.8.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/integration-aws-node@0.1.22-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-search-backend-module-explore@0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-search-backend-module-pg@0.5.55-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-search-backend-module-techdocs@0.4.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/plugin-techdocs-node@1.14.6-next.0 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-search-backend-node@1.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-search-common@1.2.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-search-react@1.11.4-next.0 + +### Patch Changes + +- cad156e: Replaced old config schema values from existing extensions and blueprints. +- 085133f: The `zod` dependency has been bumped from `^3.25.76 || ^4.0.0` to `^4.0.0`, since `configSchema` requires the full Zod v4 package for JSON Schema support. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-search-common@1.2.24-next.0 + +## @backstage/plugin-signals@0.0.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.22-next.0 + +## @backstage/plugin-signals-backend@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-signals-node@0.2.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-signals-node@0.2.1-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-signals-react@0.0.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-techdocs@1.17.6-next.0 + +### Patch Changes + +- 8d1e093: Made the TechDocs sidebar positioning at tablet breakpoints configurable via CSS custom properties, allowing apps with custom sidebar widths to override the defaults. The available properties are `--techdocs-sidebar-closed-offset-pinned`, `--techdocs-sidebar-closed-offset-collapsed`, and `--techdocs-sidebar-open-translate`. +- cad156e: Replaced old config schema values from existing extensions and blueprints. +- 085133f: The `zod` dependency has been bumped from `^3.25.76 || ^4.0.0` to `^4.0.0`, since `configSchema` requires the full Zod v4 package for JSON Schema support. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/plugin-search-react@1.11.4-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/plugin-auth-react@0.1.27-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/plugin-search-common@1.2.24-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-techdocs-addons-test-utils@2.0.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.17.6-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/plugin-catalog@2.0.5-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/plugin-search-react@1.11.4-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/test-utils@1.7.18-next.0 + +## @backstage/plugin-techdocs-backend@2.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-catalog-node@2.2.1-next.0 + - @backstage/plugin-techdocs-node@1.14.6-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + +## @backstage/plugin-techdocs-node@1.14.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/integration-aws-node@0.1.22-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-techdocs-react@1.3.11-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-user-settings@0.9.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.22-next.0 + - @backstage/plugin-user-settings-common@0.1.0 + +## @backstage/plugin-user-settings-backend@0.4.3-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/plugin-signals-node@0.2.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-user-settings-common@0.1.0 + +## example-app@0.0.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-notifications@0.5.17-next.0 + - @backstage/plugin-app@0.4.6-next.0 + - @backstage/plugin-app-visualizer@0.2.4-next.0 + - @backstage/frontend-app-api@0.16.3-next.0 + - @backstage/plugin-home@0.9.5-next.0 + - @backstage/plugin-techdocs@1.17.6-next.0 + - @backstage/plugin-scaffolder@1.36.3-next.0 + - @backstage/cli@0.36.2-next.0 + - @backstage/core-compat-api@0.5.11-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-catalog@2.0.5-next.0 + - @backstage/plugin-catalog-graph@0.6.4-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/plugin-catalog-import@0.13.13-next.0 + - @backstage/plugin-search-react@1.11.4-next.0 + - @backstage/plugin-search@1.7.4-next.0 + - @backstage/plugin-org@0.7.4-next.0 + - @backstage/app-defaults@1.7.8-next.0 + - @backstage/frontend-defaults@0.5.2-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/plugin-api-docs@0.14.1-next.0 + - @backstage/plugin-auth-react@0.1.27-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.30-next.0 + - @backstage/plugin-devtools@0.1.39-next.0 + - @backstage/plugin-home-react@0.1.38-next.0 + - @backstage/plugin-kubernetes@0.12.19-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.37-next.0 + - @backstage/plugin-scaffolder-react@1.20.2-next.0 + - @backstage/plugin-signals@0.0.31-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.36-next.0 + - @backstage/plugin-user-settings@0.9.3-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/plugin-auth@0.1.8-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-app-react@0.2.3-next.0 + - @backstage/theme@0.7.3 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## app-example-plugin@0.0.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + +## example-app-legacy@0.2.121-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-notifications@0.5.17-next.0 + - @backstage/frontend-app-api@0.16.3-next.0 + - @backstage/plugin-home@0.9.5-next.0 + - @backstage/plugin-techdocs@1.17.6-next.0 + - @backstage/plugin-scaffolder@1.36.3-next.0 + - @backstage/cli@0.36.2-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/plugin-catalog@2.0.5-next.0 + - @backstage/plugin-catalog-graph@0.6.4-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/plugin-catalog-import@0.13.13-next.0 + - @backstage/plugin-search-react@1.11.4-next.0 + - @backstage/plugin-search@1.7.4-next.0 + - @backstage/plugin-org@0.7.4-next.0 + - @backstage/app-defaults@1.7.8-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/plugin-api-docs@0.14.1-next.0 + - @backstage/plugin-auth-react@0.1.27-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.30-next.0 + - @backstage/plugin-devtools@0.1.39-next.0 + - @backstage/plugin-home-react@0.1.38-next.0 + - @backstage/plugin-kubernetes@0.12.19-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.37-next.0 + - @backstage/plugin-scaffolder-react@1.20.2-next.0 + - @backstage/plugin-signals@0.0.31-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.36-next.0 + - @backstage/plugin-user-settings@0.9.3-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/plugin-mui-to-bui@0.2.7-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + +## example-backend@0.0.50-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.9.9-next.0 + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/plugin-catalog-backend@3.6.1-next.0 + - @backstage/plugin-app-backend@0.5.14-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/plugin-devtools-backend@0.5.17-next.0 + - @backstage/plugin-permission-backend@0.7.12-next.0 + - @backstage/plugin-search-backend@2.1.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-auth-backend@0.28.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.19-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.14-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.11-next.0 + - @backstage/plugin-events-backend@0.6.2-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.2.3-next.0 + - @backstage/plugin-kubernetes-backend@0.21.4-next.0 + - @backstage/plugin-mcp-actions-backend@0.1.13-next.0 + - @backstage/plugin-notifications-backend@0.6.5-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/plugin-proxy-backend@0.6.13-next.0 + - @backstage/plugin-scaffolder-backend@3.4.1-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.15-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/plugin-techdocs-backend@2.1.8-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.5.3-next.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.7-next.0 + - @backstage/plugin-signals-backend@0.3.15-next.0 + - @backstage/plugin-catalog-backend-module-logs@0.1.22-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.22-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.20-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.19-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.22-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.8.3-next.0 + - @backstage/plugin-search-backend-module-explore@0.3.14-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.14-next.0 + +## @internal/cli@0.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-node@0.3.2-next.0 + +## e2e-test@0.2.40-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/create-app@0.8.3-next.0 + - @backstage/cli-common@0.2.2-next.0 + +## @internal/frontend@0.0.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @internal/scaffolder@0.0.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-scaffolder-react@1.20.2-next.0 + +## techdocs-cli-embedded-app@0.2.120-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-techdocs@1.17.6-next.0 + - @backstage/cli@0.36.2-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-catalog@2.0.5-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/frontend-defaults@0.5.2-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-app-react@0.2.3-next.0 + - @backstage/test-utils@1.7.18-next.0 + - @backstage/theme@0.7.3 + +## yarn-plugin-backstage@0.0.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/release-manifests@0.0.13 + +## @internal/plugin-todo-list@1.0.51-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + +## @internal/plugin-todo-list-backend@1.0.50-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + +## @internal/plugin-todo-list-common@1.0.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.9-next.0 diff --git a/docs/releases/v1.51.0-next.1-changelog.md b/docs/releases/v1.51.0-next.1-changelog.md new file mode 100644 index 0000000000..1c2ba38026 --- /dev/null +++ b/docs/releases/v1.51.0-next.1-changelog.md @@ -0,0 +1,4473 @@ +# Release v1.51.0-next.1 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.51.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.51.0-next.1) + +## @backstage/eslint-plugin@0.3.0-next.0 + +### Minor Changes + +- ab1cdbb: 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`. + +## @backstage/ui@0.15.0-next.1 + +### Minor Changes + +- 5351d8a: Added a `sticky` prop to the `Header` component. When `true`, the title-and-actions bar stays fixed to the top of its scroll container while the rest of the header (tags, description, metadata) scrolls away. The sticky bar background color automatically matches the container surface using the bg-consumer system. + + **BREAKING**: Removed the main header class from the `Header` component. Custom styles that target this class should be updated to target the component sections that remain. + + **Affected components:** Header + +### Patch Changes + +- e7fc79f: Added support for grouping options into sections in the Select component. You can now pass section objects with a `title` and a nested `options` array alongside (or instead of) regular options to render grouped dropdowns with section headers. + + **Affected components:** Select + +- 76635ae: Disabled `Card` scroll shadow in browsers that don't support `animation-timeline: scroll()`. Prevents the shadow from being always visible over the `CardBody` when there's nothing to scroll or the body is not scrolled. + + **Affected components:** Card + +- de75f7c: Fixed `CardBody` showing an unwanted scrollbar when constrained below the scroll shadow height. + + **Affected components:** Card + +- c96e2b3: Added `description`, `tags`, and `metadata` props to the `Header` component. The `description` prop accepts a markdown string with support for inline links. The `tags` prop renders a row of text or link items above the title. The `metadata` prop renders key-value pairs below the description. The `breadcrumbs` prop has been deprecated and will be removed in a future release. + + **Affected components:** Header + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. + +- 23ee789: Added invalid-state styling for Checkbox and corresponding Storybook variants for verification. + + **Affected components:** Checkbox, CheckboxGroup + +- df705bb: Fixed external URLs in BUI link components being rewritten as in-app paths when the app is served under a non-root base path. Absolute URLs (`http://`, `https://`, `//`, `mailto:`, `tel:`) are now passed through unchanged. Internal `href` values are resolved against the current `basename` exactly once, which also fixes a latent issue where internal link clicks under a non-root base path could navigate to a URL with the `basename` prefix doubled. + + **Affected components:** ButtonLink, Card, Link, Menu, Tab, Table, Tag + +## @backstage/plugin-home@0.9.6-next.0 + +# @backstage/plugin-home + +## 0.9.5-next.0 + +### Patch Changes + +- 419141e: Fixed widgets not being movable or resizable after saved edits. Previously, entering edit mode didn't restore `isDraggable` and `isResizable`. +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/core-compat-api@0.5.11-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-home-react@0.1.38-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/catalog-client@1.15.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + +## 0.9.4 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.3 + - @backstage/catalog-model@1.8.0 + - @backstage/plugin-catalog-react@2.1.2 + - @backstage/core-app-api@1.20.0 + - @backstage/frontend-plugin-api@0.16.0 + - @backstage/core-components@0.18.9 + - @backstage/core-compat-api@0.5.10 + - @backstage/catalog-client@1.15.0 + - @backstage/config@1.3.7 + - @backstage/core-plugin-api@1.12.5 + - @backstage/plugin-home-react@0.1.37 + +## 0.9.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.3-next.0 + - @backstage/core-app-api@1.20.0-next.2 + - @backstage/core-components@0.18.9-next.1 + - @backstage/plugin-catalog-react@2.1.2-next.2 + - @backstage/catalog-client@1.14.1-next.0 + - @backstage/catalog-model@1.7.8-next.0 + - @backstage/config@1.3.7-next.0 + - @backstage/core-compat-api@0.5.10-next.2 + - @backstage/core-plugin-api@1.12.5-next.2 + - @backstage/frontend-plugin-api@0.16.0-next.2 + +## 0.9.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.20.0-next.1 + - @backstage/plugin-catalog-react@2.1.2-next.1 + - @backstage/frontend-plugin-api@0.16.0-next.1 + - @backstage/core-compat-api@0.5.10-next.1 + - @backstage/core-components@0.18.9-next.0 + - @backstage/core-plugin-api@1.12.5-next.1 + - @backstage/plugin-home-react@0.1.37-next.1 + +## 0.9.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.1-next.0 + - @backstage/core-components@0.18.9-next.0 + - @backstage/frontend-plugin-api@0.15.2-next.0 + - @backstage/core-compat-api@0.5.10-next.0 + - @backstage/core-app-api@1.19.7-next.0 + - @backstage/plugin-home-react@0.1.37-next.0 + - @backstage/core-plugin-api@1.12.5-next.0 + - @backstage/catalog-client@1.14.0 + - @backstage/catalog-model@1.7.7 + - @backstage/config@1.3.6 + - @backstage/theme@0.7.2 + +## 0.9.3 + +### Patch Changes + +- 538c985: Updated installation documentation to use feature discovery as the default. +- 0be2541: Promoted the plugin's translation ref to the stable package entry point. It was previously only available through the alpha entry point. +- a49a40d: Updated dependency `zod` to `^3.25.76 || ^4.0.0` & migrated to `/v3` or `/v4` imports. +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0 + - @backstage/core-compat-api@0.5.9 + - @backstage/core-plugin-api@1.12.4 + - @backstage/core-components@0.18.8 + - @backstage/frontend-plugin-api@0.15.0 + - @backstage/catalog-client@1.14.0 + - @backstage/core-app-api@1.19.6 + - @backstage/plugin-home-react@0.1.36 + - @backstage/catalog-model@1.7.7 + +## 0.9.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.5.9-next.2 + - @backstage/core-app-api@1.19.6-next.1 + - @backstage/frontend-plugin-api@0.15.0-next.1 + - @backstage/core-plugin-api@1.12.4-next.1 + - @backstage/catalog-client@1.14.0-next.2 + - @backstage/plugin-catalog-react@2.1.0-next.2 + - @backstage/core-components@0.18.8-next.1 + - @backstage/plugin-home-react@0.1.36-next.1 + +## 0.9.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-home-react@0.1.36-next.0 + +## 0.9.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-home-react@0.1.36-next.0 + +## 0.9.2 + +### Patch Changes + +- 018ca87: Added `title` and `icon` to the plugin definition for the new frontend system. +- 90956a6: Support new frontend system in the homepage plugin +- a7e0d50: Updated `react-router-dom` peer dependency to `^6.30.2` and explicitly disabled v7 future flags to suppress deprecation warnings. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/plugin-catalog-react@2.0.0 + - @backstage/core-components@0.18.7 + - @backstage/core-app-api@1.19.5 + - @backstage/core-compat-api@0.5.8 + - @backstage/theme@0.7.2 + - @backstage/frontend-plugin-api@0.14.0 + - @backstage/catalog-client@1.13.0 + - @backstage/core-plugin-api@1.12.3 + - @backstage/plugin-home-react@0.1.35 + +## 0.9.2-next.2 + +### Patch Changes + +- 90956a6: Support new frontend system in the homepage plugin +- a7e0d50: Prepare for React Router v7 migration by updating to v6.30.2 across all NFS packages and enabling v7 future flags. Convert routes from splat paths to parent/child structure with Outlet components. +- Updated dependencies + - @backstage/plugin-catalog-react@2.0.0-next.2 + - @backstage/core-app-api@1.19.5-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/plugin-home-react@0.1.35-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-compat-api@0.5.8-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/theme@0.7.2-next.1 + +## 0.9.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## 0.9.1-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/theme@0.7.1 + - @backstage/plugin-home-react@0.1.35-next.0 + +## 0.9.0 + +### Minor Changes + +- e091a83: Widget configurations are now only saved to storage when the Save button is explicitly clicked. Added a Cancel button that allows users to discard unsaved changes and revert to the last saved state. + +### Patch Changes + +- bdda543: Updated WidgetOverlay color to use `alpha(theme.palette.background.paper, 0.93)` for better theme alignment instead of hardcoded RGBA +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-home-react@0.1.34 + +## 0.9.0-next.2 + +### Minor Changes + +- e091a83: Widget configurations are now only saved to storage when the Save button is explicitly clicked. Added a Cancel button that allows users to discard unsaved changes and revert to the last saved state. + +## 0.8.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.1 + - @backstage/plugin-home-react@0.1.34-next.0 + +## 0.8.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## 0.8.15 + +### Patch Changes + +- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system. +- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`. + Updated dependency `@rjsf/core` to `5.24.13`. + Updated dependency `@rjsf/material-ui` to `5.24.13`. + Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. +- Updated dependencies + - @backstage/core-app-api@1.19.3 + - @backstage/frontend-plugin-api@0.13.2 + - @backstage/core-components@0.18.4 + - @backstage/plugin-catalog-react@1.21.4 + - @backstage/core-plugin-api@1.12.1 + - @backstage/plugin-home-react@0.1.33 + - @backstage/theme@0.7.1 + +## 0.8.15-next.1 + +### Patch Changes + +- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`. + Updated dependency `@rjsf/core` to `5.24.13`. + Updated dependency `@rjsf/material-ui` to `5.24.13`. + Updated dependency `@rjsf/validator-ajv8` to `5.24.13`. +- Updated dependencies + - @backstage/core-app-api@1.19.3-next.1 + - @backstage/frontend-plugin-api@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/plugin-home-react@0.1.33-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/theme@0.7.1-next.0 + +## 0.8.15-next.0 + +### Patch Changes + +- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.0 + - @backstage/core-app-api@1.19.3-next.0 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/plugin-catalog-react@1.21.4-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/plugin-home-react@0.1.33-next.0 + - @backstage/core-components@0.18.4-next.0 + - @backstage/config@1.3.6 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + +## 0.8.14 + +### Patch Changes + +- 2ac5d29: Allow customization of `VisitList` by adding optional `enrichVisit`, `transformPathname`, `canSave` functions to `VisitsStorageApi`, along with `VisitDisplayProvider` for colors, labels +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.0 + - @backstage/core-compat-api@0.5.4 + - @backstage/plugin-catalog-react@1.21.3 + - @backstage/core-components@0.18.3 + - @backstage/core-plugin-api@1.12.0 + - @backstage/core-app-api@1.19.2 + - @backstage/config@1.3.6 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-home-react@0.1.32 + - @backstage/catalog-client@1.12.1 + +## 0.8.14-next.1 + +### Patch Changes + +- 2ac5d29: Allow customization of VisitList by adding optional enrichVisit, transformPathname, canSave functions to VisitsStorageApi, along with VisitDisplayProvider for colors, labels +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.3-next.2 + - @backstage/frontend-plugin-api@0.12.2-next.2 + - @backstage/core-components@0.18.3-next.2 + +## 0.8.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.3-next.0 + - @backstage/core-app-api@1.19.2-next.0 + - @backstage/core-plugin-api@1.11.2-next.0 + - @backstage/config@1.3.6-next.0 + - @backstage/core-components@0.18.3-next.0 + - @backstage/catalog-model@1.7.6-next.0 + - @backstage/frontend-plugin-api@0.12.2-next.0 + - @backstage/catalog-client@1.12.1-next.0 + - @backstage/core-compat-api@0.5.4-next.0 + - @backstage/theme@0.7.0 + - @backstage/plugin-home-react@0.1.32-next.0 + +## 0.8.13 + +### Patch Changes + +- e7d59d3: fix(home): correct `clearAll` logic to properly handle `deletable` flag +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2 + - @backstage/core-components@0.18.2 + - @backstage/frontend-plugin-api@0.12.1 + - @backstage/config@1.3.5 + - @backstage/theme@0.7.0 + - @backstage/core-compat-api@0.5.3 + - @backstage/core-app-api@1.19.1 + - @backstage/core-plugin-api@1.11.1 + - @backstage/plugin-home-react@0.1.31 + +## 0.8.13-next.3 + +### Patch Changes + +- e7d59d3: fix(home): correct `clearAll` logic to properly handle `deletable` flag +- Updated dependencies + - @backstage/core-components@0.18.2-next.3 + - @backstage/frontend-plugin-api@0.12.1-next.2 + +## 0.8.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.2 + - @backstage/theme@0.6.9-next.0 + +## 0.8.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-home-react@0.1.31-next.1 + - @backstage/catalog-client@1.12.0 + +## 0.8.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-home-react@0.1.31-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + +## 0.8.12 + +### Patch Changes + +- 929c55a: Fixed race condition in CustomHomepageGrid by waiting for storage to load before rendering custom layout to prevent + rendering of the default content. +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.0 + - @backstage/frontend-plugin-api@0.12.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/catalog-client@1.12.0 + - @backstage/core-components@0.18.0 + - @backstage/core-compat-api@0.5.2 + - @backstage/core-app-api@1.19.0 + - @backstage/plugin-home-react@0.1.30 + +## 0.8.12-next.2 + +### Patch Changes + +- 929c55a: Fixed race condition in CustomHomepageGrid by waiting for storage to load before rendering custom layout to prevent + rendering of the default content. +- Updated dependencies + - @backstage/catalog-client@1.12.0-next.0 + - @backstage/plugin-catalog-react@1.21.0-next.2 + - @backstage/core-components@0.17.6-next.1 + - @backstage/core-compat-api@0.5.2-next.2 + +## 0.8.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.20.2-next.1 + - @backstage/frontend-plugin-api@0.11.1-next.0 + - @backstage/core-components@0.17.6-next.0 + - @backstage/core-compat-api@0.5.2-next.1 + - @backstage/plugin-home-react@0.1.30-next.0 + +## 0.8.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.5.2-next.0 + - @backstage/plugin-catalog-react@1.20.2-next.0 + - @backstage/catalog-client@1.11.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.18.0 + - @backstage/core-components@0.17.5 + - @backstage/core-plugin-api@1.10.9 + - @backstage/frontend-plugin-api@0.11.0 + - @backstage/theme@0.6.8 + - @backstage/plugin-home-react@0.1.29 + +## 0.8.11 + +### Patch Changes + +- e4ddf22: Internal update to align with new blueprint parameter naming in the new frontend system. +- f16d380: Add the missing Visits API to the alpha plugin, fixing a crash due to the API not being installed. +- f2f133c: Internal update to use the new variant of `ApiBlueprint`. +- 121899a: **BREAKING ALPHA**: The `app-root-element` extension now only accepts `JSX.Element` in its `element` param, meaning overrides need to be updated. +- 166dfd7: Fixed bug in CustomHomepageGrid where `clearAll` did not respect the `deletable` flag on widgets +- Updated dependencies + - @backstage/core-components@0.17.5 + - @backstage/frontend-plugin-api@0.11.0 + - @backstage/core-compat-api@0.5.0 + - @backstage/plugin-catalog-react@1.20.0 + - @backstage/theme@0.6.8 + - @backstage/catalog-client@1.11.0 + - @backstage/plugin-home-react@0.1.29 + +## 0.8.11-next.2 + +### Patch Changes + +- e4ddf22: Internal update to align with new blueprint parameter naming in the new frontend system. +- 121899a: **BREAKING ALPHA**: The `app-root-element` extension now only accepts `JSX.Element` in its `element` param, meaning overrides need to be updated. +- Updated dependencies + - @backstage/frontend-plugin-api@0.11.0-next.1 + - @backstage/core-compat-api@0.5.0-next.2 + - @backstage/plugin-catalog-react@1.20.0-next.2 + - @backstage/core-components@0.17.5-next.1 + - @backstage/catalog-client@1.11.0-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.18.0 + - @backstage/core-plugin-api@1.10.9 + - @backstage/theme@0.6.8-next.0 + - @backstage/plugin-home-react@0.1.29-next.0 + +## 0.8.11-next.1 + +### Patch Changes + +- f16d380: Add the missing Visits API to the alpha plugin, fixing a crash due to the API not being installed. +- f2f133c: Internal update to use the new variant of `ApiBlueprint`. +- Updated dependencies + - @backstage/core-compat-api@0.4.5-next.1 + - @backstage/plugin-catalog-react@1.20.0-next.1 + - @backstage/frontend-plugin-api@0.11.0-next.0 + - @backstage/theme@0.6.8-next.0 + - @backstage/catalog-client@1.11.0-next.0 + - @backstage/plugin-home-react@0.1.29-next.0 + - @backstage/core-components@0.17.5-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.18.0 + - @backstage/core-plugin-api@1.10.9 + +## 0.8.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.19.2-next.0 + - @backstage/core-compat-api@0.4.5-next.0 + - @backstage/frontend-plugin-api@0.10.4 + +## 0.8.10 + +### Patch Changes + +- d52d67f: Added a New Frontend System App Root Element for the `` component +- Updated dependencies + - @backstage/plugin-catalog-react@1.19.1 + - @backstage/config@1.3.3 + - @backstage/catalog-model@1.7.5 + - @backstage/catalog-client@1.10.2 + - @backstage/core-components@0.17.4 + - @backstage/core-plugin-api@1.10.9 + - @backstage/theme@0.6.7 + - @backstage/core-app-api@1.18.0 + - @backstage/core-compat-api@0.4.4 + - @backstage/frontend-plugin-api@0.10.4 + - @backstage/plugin-home-react@0.1.28 + +## 0.8.10-next.2 + +### Patch Changes + +- d52d67f: Added a New Frontend System App Root Element for the `` component +- Updated dependencies + - @backstage/theme@0.6.7-next.1 + - @backstage/core-app-api@1.18.0-next.1 + - @backstage/core-components@0.17.4-next.2 + - @backstage/core-compat-api@0.4.4-next.1 + - @backstage/core-plugin-api@1.10.9-next.0 + - @backstage/plugin-catalog-react@1.19.1-next.1 + +## 0.8.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3-next.0 + - @backstage/catalog-model@1.7.5-next.0 + - @backstage/plugin-catalog-react@1.19.1-next.1 + - @backstage/catalog-client@1.10.2-next.0 + - @backstage/core-app-api@1.17.2-next.0 + - @backstage/core-components@0.17.4-next.1 + - @backstage/core-plugin-api@1.10.9-next.0 + - @backstage/core-compat-api@0.4.4-next.1 + - @backstage/frontend-plugin-api@0.10.4-next.1 + - @backstage/plugin-home-react@0.1.28-next.1 + +## 0.8.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.6.7-next.0 + - @backstage/plugin-catalog-react@1.19.1-next.0 + - @backstage/core-components@0.17.4-next.0 + - @backstage/catalog-client@1.10.1 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.17.1 + - @backstage/core-compat-api@0.4.4-next.0 + - @backstage/core-plugin-api@1.10.8 + - @backstage/frontend-plugin-api@0.10.4-next.0 + - @backstage/plugin-home-react@0.1.28-next.0 + +## 0.8.9 + +### Patch Changes + +- 18c64e9: Added the `info.packageJson` option to the plugin instance for the new frontend system. +- 0ebad54: Fixed the `WelcomeTitle` to properly default to the previous value of `inherit` +- cef60db: Home plugin support i18n +- Updated dependencies + - @backstage/core-components@0.17.3 + - @backstage/catalog-client@1.10.1 + - @backstage/core-plugin-api@1.10.8 + - @backstage/plugin-home-react@0.1.27 + - @backstage/frontend-plugin-api@0.10.3 + - @backstage/plugin-catalog-react@1.19.0 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.17.1 + - @backstage/core-compat-api@0.4.3 + - @backstage/theme@0.6.6 + +## 0.8.9-next.2 + +### Patch Changes + +- 0ebad54: Fixed the `WelcomeTitle` to properly default to the previous value of `inherit` +- Updated dependencies + - @backstage/core-components@0.17.3-next.0 + - @backstage/plugin-catalog-react@1.19.0-next.2 + - @backstage/frontend-plugin-api@0.10.3-next.1 + - @backstage/plugin-home-react@0.1.27-next.0 + - @backstage/catalog-client@1.10.1-next.0 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.17.0 + - @backstage/core-compat-api@0.4.3-next.2 + - @backstage/core-plugin-api@1.10.7 + - @backstage/theme@0.6.6 + +## 0.8.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.10.1-next.0 + - @backstage/plugin-catalog-react@1.18.1-next.1 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.17.0 + - @backstage/core-compat-api@0.4.3-next.1 + - @backstage/core-components@0.17.2 + - @backstage/core-plugin-api@1.10.7 + - @backstage/frontend-plugin-api@0.10.3-next.0 + - @backstage/theme@0.6.6 + - @backstage/plugin-home-react@0.1.26 + +## 0.8.9-next.0 + +### Patch Changes + +- 18c64e9: Added the `info.packageJson` option to the plugin instance for the new frontend system. +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.3-next.0 + - @backstage/core-compat-api@0.4.3-next.0 + - @backstage/plugin-catalog-react@1.18.1-next.0 + +## 0.8.8 + +### Patch Changes + +- f7ca0fe: Added the Catalog presentation API to the HomePageRecentlyVisited and HomePageTopVisited components + +- fb58f20: Internal update to use the new `pluginId` option of `createFrontendPlugin`. + +- eddd96c: Added optional title prop to `customHomePageGrid` + +- 16eb4bf: Export ContentModal from `@backstage/plugin-home-react` so people can use this in other scenarios. + Renamed `CatalogReactComponentsNameToClassKey` to `PluginHomeComponentsNameToClassKey` in `overridableComponents.ts` + + Made QuickStartCard `docsLinkTitle` prop more flexible to allow for any React.JSX.Element instead of just a string. + Added QuickStartCard prop `additionalContent` which can eventually replace the prop `video`. + +- 2c1761f: Added a `variant` prop to the `WelcomeTitle` component making it work with the Customizable Home page feature. Adding it like this `` to the list of items under `CustomHomepageGrid` will allow it to render with a size that works well. + +- 195323f: Export root page route from the home plugin to enable adding links/nav to it from outside the plugin + +- 72d019d: Removed various typos + +- d710d74: docs: Update default for `preventCollision` prop + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.2 + - @backstage/theme@0.6.6 + - @backstage/core-app-api@1.17.0 + - @backstage/core-components@0.17.2 + - @backstage/catalog-model@1.7.4 + - @backstage/core-compat-api@0.4.2 + - @backstage/plugin-home-react@0.1.26 + - @backstage/plugin-catalog-react@1.18.0 + - @backstage/core-plugin-api@1.10.7 + - @backstage/catalog-client@1.10.0 + - @backstage/config@1.3.2 + +## 0.8.8-next.3 + +### Patch Changes + +- f7ca0fe: Added the Catalog presentation API to the HomePageRecentlyVisited and HomePageTopVisited components + +- eddd96c: Added optional title prop to `customHomePageGrid` + +- 16eb4bf: Export ContentModal from `@backstage/plugin-home-react` so people can use this in other scenarios. + Renamed `CatalogReactComponentsNameToClassKey` to `PluginHomeComponentsNameToClassKey` in `overridableComponents.ts` + + Made QuickStartCard `docsLinkTitle` prop more flexible to allow for any React.JSX.Element instead of just a string. + Added QuickStartCard prop `additionalContent` which can eventually replace the prop `video`. + +- 195323f: Export root page route from the home plugin to enable adding links/nav to it from outside the plugin + +- d710d74: docs: Update default for `preventCollision` prop + +- Updated dependencies + - @backstage/core-app-api@1.17.0-next.1 + - @backstage/plugin-home-react@0.1.26-next.2 + - @backstage/core-compat-api@0.4.2-next.3 + - @backstage/core-components@0.17.2-next.1 + - @backstage/core-plugin-api@1.10.7-next.0 + - @backstage/plugin-catalog-react@1.18.0-next.3 + - @backstage/catalog-client@1.10.0-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/frontend-plugin-api@0.10.2-next.1 + - @backstage/theme@0.6.6-next.0 + +## 0.8.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.16.2-next.0 + - @backstage/core-plugin-api@1.10.7-next.0 + - @backstage/config@1.3.2 + - @backstage/core-compat-api@0.4.2-next.2 + - @backstage/core-components@0.17.2-next.1 + - @backstage/frontend-plugin-api@0.10.2-next.1 + - @backstage/plugin-catalog-react@1.18.0-next.2 + - @backstage/plugin-home-react@0.1.26-next.1 + - @backstage/catalog-client@1.10.0-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/theme@0.6.6-next.0 + +## 0.8.8-next.1 + +### Patch Changes + +- fb58f20: Internal update to use the new `pluginId` option of `createFrontendPlugin`. +- 72d019d: Removed various typos +- Updated dependencies + - @backstage/theme@0.6.6-next.0 + - @backstage/core-components@0.17.2-next.0 + - @backstage/frontend-plugin-api@0.10.2-next.0 + - @backstage/core-compat-api@0.4.2-next.1 + - @backstage/plugin-catalog-react@1.18.0-next.1 + - @backstage/plugin-home-react@0.1.26-next.0 + - @backstage/catalog-client@1.10.0-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.1 + - @backstage/core-plugin-api@1.10.6 + +## 0.8.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.4.2-next.0 + - @backstage/plugin-catalog-react@1.18.0-next.0 + - @backstage/catalog-client@1.10.0-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.1 + - @backstage/core-components@0.17.1 + - @backstage/core-plugin-api@1.10.6 + - @backstage/frontend-plugin-api@0.10.1 + - @backstage/theme@0.6.5 + - @backstage/plugin-home-react@0.1.25 + +## 0.8.7 + +### Patch Changes + +- a47fd39: Removes instances of default React imports, a necessary update for the upcoming React 19 migration. + + + +- Updated dependencies + - @backstage/plugin-catalog-react@1.17.0 + - @backstage/frontend-plugin-api@0.10.1 + - @backstage/core-compat-api@0.4.1 + - @backstage/core-components@0.17.1 + - @backstage/core-plugin-api@1.10.6 + - @backstage/core-app-api@1.16.1 + - @backstage/plugin-home-react@0.1.25 + - @backstage/theme@0.6.5 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + +## 0.8.7-next.2 + +### Patch Changes + +- a47fd39: Removes instances of default React imports, a necessary update for the upcoming React 19 migration. + + + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.1 + - @backstage/core-compat-api@0.4.1-next.2 + - @backstage/core-components@0.17.1-next.1 + - @backstage/core-plugin-api@1.10.6-next.0 + - @backstage/core-app-api@1.16.1-next.0 + - @backstage/plugin-catalog-react@1.17.0-next.2 + - @backstage/plugin-home-react@0.1.25-next.2 + - @backstage/theme@0.6.5-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + +## 0.8.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-home-react@0.1.25-next.1 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/theme@0.6.4 + +## 0.8.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/plugin-home-react@0.1.25-next.0 + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.16.0 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/theme@0.6.4 + +## 0.8.6 + +### Patch Changes + +- 2d11521: The starred entities component uses the entity title or display name if it exists +- Updated dependencies + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/core-app-api@1.16.0 + - @backstage/plugin-catalog-react@1.16.0 + - @backstage/core-compat-api@0.4.0 + - @backstage/plugin-home-react@0.1.24 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/theme@0.6.4 + +## 0.8.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.0-next.2 + - @backstage/core-app-api@1.16.0-next.0 + - @backstage/plugin-catalog-react@1.16.0-next.2 + - @backstage/core-compat-api@0.4.0-next.2 + - @backstage/core-components@0.16.5-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-plugin-api@1.10.4 + - @backstage/theme@0.6.4 + - @backstage/plugin-home-react@0.1.24-next.1 + +## 0.8.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.5-next.0 + - @backstage/plugin-home-react@0.1.24-next.0 + - @backstage/plugin-catalog-react@1.16.0-next.1 + - @backstage/core-compat-api@0.3.7-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.15.5 + - @backstage/core-plugin-api@1.10.4 + - @backstage/frontend-plugin-api@0.9.6-next.1 + - @backstage/theme@0.6.4 + +## 0.8.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.16.0-next.0 + - @backstage/frontend-plugin-api@0.9.6-next.0 + - @backstage/core-compat-api@0.3.7-next.0 + +## 0.8.5 + +### Patch Changes + +- aff6b47: feat: add cancel button for WidgetSettingsOverlay + +- 8e86f96: Enable collision prevention by default in custom home page. + + This change ensures that items in the home page will not collide with each other + making the user experience better. + +- 58ec9e7: Removed older versions of React packages as a preparatory step for upgrading to React 19. This commit does not introduce any functional changes, but removes dependencies on previous React versions, allowing for a cleaner upgrade path in subsequent commits. + +- Updated dependencies + - @backstage/core-components@0.16.4 + - @backstage/plugin-catalog-react@1.15.2 + - @backstage/frontend-plugin-api@0.9.5 + - @backstage/core-compat-api@0.3.6 + - @backstage/core-plugin-api@1.10.4 + - @backstage/core-app-api@1.15.5 + - @backstage/plugin-home-react@0.1.23 + - @backstage/theme@0.6.4 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + +## 0.8.5-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.5-next.3 + - @backstage/core-compat-api@0.3.6-next.3 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.15.5-next.0 + - @backstage/core-components@0.16.4-next.1 + - @backstage/core-plugin-api@1.10.4-next.0 + - @backstage/theme@0.6.4-next.0 + - @backstage/plugin-catalog-react@1.15.2-next.3 + - @backstage/plugin-home-react@0.1.23-next.1 + +## 0.8.5-next.2 + +### Patch Changes + +- aff6b47: feat: add cancel button for WidgetSettingsOverlay +- Updated dependencies + - @backstage/core-components@0.16.4-next.1 + - @backstage/plugin-catalog-react@1.15.2-next.2 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.15.5-next.0 + - @backstage/core-compat-api@0.3.6-next.2 + - @backstage/core-plugin-api@1.10.4-next.0 + - @backstage/frontend-plugin-api@0.9.5-next.2 + - @backstage/theme@0.6.4-next.0 + - @backstage/plugin-home-react@0.1.23-next.1 + +## 0.8.5-next.1 + +### Patch Changes + +- 8e86f96: Enable collision prevention by default in custom home page. + + This change ensures that items in the home page will not collide with each other + making the user experience better. + +- 58ec9e7: Removed older versions of React packages as a preparatory step for upgrading to React 19. This commit does not introduce any functional changes, but removes dependencies on previous React versions, allowing for a cleaner upgrade path in subsequent commits. + +- Updated dependencies + - @backstage/core-components@0.16.4-next.0 + - @backstage/frontend-plugin-api@0.9.5-next.1 + - @backstage/core-compat-api@0.3.6-next.1 + - @backstage/core-plugin-api@1.10.4-next.0 + - @backstage/core-app-api@1.15.5-next.0 + - @backstage/plugin-catalog-react@1.15.2-next.1 + - @backstage/plugin-home-react@0.1.23-next.0 + - @backstage/theme@0.6.4-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + +## 0.8.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.5-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.15.4 + - @backstage/core-compat-api@0.3.6-next.0 + - @backstage/core-components@0.16.3 + - @backstage/core-plugin-api@1.10.3 + - @backstage/theme@0.6.3 + - @backstage/plugin-catalog-react@1.15.2-next.0 + - @backstage/plugin-home-react@0.1.22 + +## 0.8.4 + +### Patch Changes + +- 7932f1e: Exported `QuickStartCard` component. +- d8f9079: Updated dependency `@rjsf/utils` to `5.23.2`. + Updated dependency `@rjsf/core` to `5.23.2`. + Updated dependency `@rjsf/material-ui` to `5.23.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1 + - @backstage/frontend-plugin-api@0.9.4 + - @backstage/core-plugin-api@1.10.3 + - @backstage/core-components@0.16.3 + - @backstage/plugin-home-react@0.1.22 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.15.4 + - @backstage/core-compat-api@0.3.5 + - @backstage/theme@0.6.3 + +## 0.8.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.4-next.0 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-compat-api@0.3.5-next.0 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/plugin-home-react@0.1.22-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/catalog-client@1.9.1-next.0 + - @backstage/theme@0.6.3 + +## 0.8.4-next.1 + +### Patch Changes + +- d8f9079: Updated dependency `@rjsf/utils` to `5.23.2`. + Updated dependency `@rjsf/core` to `5.23.2`. + Updated dependency `@rjsf/material-ui` to `5.23.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.2`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-home-react@0.1.22-next.0 + - @backstage/core-compat-api@0.3.4 + +## 0.8.4-next.0 + +### Patch Changes + +- 7932f1e: Exported `QuickStartCard` component. +- Updated dependencies + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-app-api@1.15.3 + - @backstage/core-compat-api@0.3.4 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-home-react@0.1.21 + +## 0.8.3 + +### Patch Changes + +- 7248f3b: Added a new Quick Start Card to `plugin-home`, which can display basic info to get users the info they need to onboard to the Catalog. + + import { QuickStartCard } from '@backstage/plugin-home'; + + } + cardDescription="Backstage system model will help you create new entities" + video={ + + } + downloadImage={ + + } + /> + + See the [storybook examples](https://backstage.io/storybook/?path=/story/plugins-home-components-quickstartcard--default) + +- 9951ba4: Updated dependency `@rjsf/utils` to `5.23.1`. + Updated dependency `@rjsf/core` to `5.23.1`. + Updated dependency `@rjsf/material-ui` to `5.23.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.1`. + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/core-app-api@1.15.3 + - @backstage/catalog-client@1.9.0 + - @backstage/plugin-home-react@0.1.21 + - @backstage/core-compat-api@0.3.4 + - @backstage/frontend-plugin-api@0.9.3 + - @backstage/theme@0.6.3 + - @backstage/core-components@0.16.2 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + +## 0.8.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.3.4-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/core-app-api@1.15.3-next.1 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.2 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-home-react@0.1.21-next.2 + +## 0.8.3-next.1 + +### Patch Changes + +- 7248f3b: Added a new Quick Start Card to `plugin-home`, which can display basic info to get users the info they need to onboard to the Catalog. + + import { QuickStartCard } from '@backstage/plugin-home'; + + } + cardDescription="Backstage system model will help you create new entities" + video={ + + } + downloadImage={ + + } + /> + + See the [storybook examples](https://backstage.io/storybook/?path=/story/plugins-home-components-quickstartcard--default) + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.3-next.1 + - @backstage/catalog-client@1.9.0-next.1 + - @backstage/core-components@0.16.2-next.1 + - @backstage/catalog-model@1.7.1 + - @backstage/config@1.3.0 + - @backstage/core-app-api@1.15.3-next.0 + - @backstage/core-compat-api@0.3.4-next.1 + - @backstage/core-plugin-api@1.10.1 + - @backstage/frontend-plugin-api@0.9.3-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-home-react@0.1.21-next.1 + +## 0.8.3-next.0 + +### Patch Changes + +- 9951ba4: Updated dependency `@rjsf/utils` to `5.23.1`. + Updated dependency `@rjsf/core` to `5.23.1`. + Updated dependency `@rjsf/material-ui` to `5.23.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.23.1`. +- Updated dependencies + - @backstage/core-app-api@1.15.3-next.0 + - @backstage/plugin-catalog-react@1.14.3-next.0 + - @backstage/plugin-home-react@0.1.21-next.0 + - @backstage/frontend-plugin-api@0.9.3-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/catalog-client@1.8.1-next.0 + - @backstage/catalog-model@1.7.1 + - @backstage/config@1.3.0 + - @backstage/core-compat-api@0.3.4-next.0 + - @backstage/core-components@0.16.2-next.0 + - @backstage/core-plugin-api@1.10.1 + +## 0.8.1 + +### Patch Changes + +- 8b1b2cf: Improve Starred Entities UI to reduce whitespace and provide more context on the entities: + + - Use the Entity Presentation API (via ``) to display the entity's name + - Component's `kind` and `spec.type` are displayed as a secondary text + - List items are condensed to reduce unnecessary spacing + +- Updated dependencies + - @backstage/catalog-client@1.8.0 + - @backstage/config@1.3.0 + - @backstage/theme@0.6.1 + - @backstage/plugin-catalog-react@1.14.1 + - @backstage/core-components@0.16.0 + - @backstage/core-app-api@1.15.2 + - @backstage/catalog-model@1.7.1 + - @backstage/core-compat-api@0.3.2 + - @backstage/core-plugin-api@1.10.1 + - @backstage/frontend-plugin-api@0.9.1 + - @backstage/plugin-home-react@0.1.19 + +## 0.8.1-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.0-next.2 + - @backstage/plugin-catalog-react@1.14.1-next.3 + - @backstage/core-compat-api@0.3.2-next.2 + - @backstage/catalog-client@1.8.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.15.1 + - @backstage/core-plugin-api@1.10.0 + - @backstage/frontend-plugin-api@0.9.1-next.2 + - @backstage/theme@0.6.1-next.0 + - @backstage/plugin-home-react@0.1.19-next.2 + +## 0.8.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.8.0-next.1 + - @backstage/plugin-catalog-react@1.14.1-next.2 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.15.1 + - @backstage/core-compat-api@0.3.2-next.1 + - @backstage/core-components@0.16.0-next.1 + - @backstage/core-plugin-api@1.10.0 + - @backstage/frontend-plugin-api@0.9.1-next.1 + - @backstage/theme@0.6.1-next.0 + - @backstage/plugin-home-react@0.1.19-next.1 + +## 0.8.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.6.1-next.0 + - @backstage/catalog-client@1.8.0-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.15.1 + - @backstage/core-compat-api@0.3.2-next.1 + - @backstage/core-components@0.16.0-next.1 + - @backstage/core-plugin-api@1.10.0 + - @backstage/frontend-plugin-api@0.9.1-next.1 + - @backstage/plugin-catalog-react@1.14.1-next.1 + - @backstage/plugin-home-react@0.1.19-next.1 + +## 0.8.1-next.0 + +### Patch Changes + +- 8b1b2cf: Improve Starred Entities UI to reduce whitespace and provide more context on the entities: + + - Use the Entity Presentation API (via ``) to display the entity's name + - Component's `kind` and `spec.type` are displayed as a secondary text + - List items are condensed to reduce unnecessary spacing + +- Updated dependencies + - @backstage/core-components@0.16.0-next.0 + - @backstage/catalog-client@1.8.0-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.15.1 + - @backstage/core-compat-api@0.3.2-next.0 + - @backstage/core-plugin-api@1.10.0 + - @backstage/frontend-plugin-api@0.9.1-next.0 + - @backstage/theme@0.6.0 + - @backstage/plugin-catalog-react@1.14.1-next.0 + - @backstage/plugin-home-react@0.1.19-next.0 + +## 0.8.0 + +### Minor Changes + +- 9893bb5: **BREAKING** Implement usage of unused `limit` query parameter in visits API `.list()` function + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- e698470: Updated dependency `@rjsf/utils` to `5.21.2`. + Updated dependency `@rjsf/core` to `5.21.2`. + Updated dependency `@rjsf/material-ui` to `5.21.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.21.2`. +- Updated dependencies + - @backstage/core-components@0.15.1 + - @backstage/frontend-plugin-api@0.9.0 + - @backstage/core-compat-api@0.3.1 + - @backstage/core-plugin-api@1.10.0 + - @backstage/core-app-api@1.15.1 + - @backstage/plugin-catalog-react@1.14.0 + - @backstage/plugin-home-react@0.1.18 + - @backstage/theme@0.6.0 + - @backstage/catalog-client@1.7.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + +## 0.8.0-next.2 + +### Minor Changes + +- 9893bb5: **BREAKING** Implement usage of unused `limit` query parameter in visits API `.list()` function + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.14.0-next.2 + - @backstage/theme@0.6.0-next.1 + - @backstage/catalog-client@1.7.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/core-compat-api@0.3.1-next.2 + - @backstage/core-components@0.15.1-next.2 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.2 + - @backstage/plugin-home-react@0.1.18-next.2 + +## 0.7.12-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/frontend-plugin-api@0.9.0-next.1 + - @backstage/core-compat-api@0.3.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-home-react@0.1.18-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + +## 0.7.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.0-next.0 + - @backstage/core-compat-api@0.3.1-next.0 + - @backstage/core-components@0.15.1-next.0 + - @backstage/core-plugin-api@1.10.0-next.0 + - @backstage/plugin-catalog-react@1.13.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.15.1-next.0 + - @backstage/theme@0.5.7 + - @backstage/plugin-home-react@0.1.18-next.0 + +## 0.7.10 + +### Patch Changes + +- c891b69: Add `FavoriteToggle` in `core-components` to standardise favorite marking +- fec8b57: Updated exports to use the new type parameters for extensions and extension blueprints. +- 836127c: Updated dependency `@testing-library/react` to `^16.0.0`. +- 0a50d44: Updated dependency `@rjsf/utils` to `5.21.1`. + Updated dependency `@rjsf/core` to `5.21.1`. + Updated dependency `@rjsf/material-ui` to `5.21.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.21.1`. +- fa9d8da: Updated dependency `@rjsf/utils` to `5.20.1`. + Updated dependency `@rjsf/core` to `5.20.1`. + Updated dependency `@rjsf/material-ui` to `5.20.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.20.1`. +- a159180: Added missing items to `overridableComponents` +- Updated dependencies + - @backstage/core-components@0.15.0 + - @backstage/plugin-catalog-react@1.13.0 + - @backstage/frontend-plugin-api@0.8.0 + - @backstage/core-app-api@1.15.0 + - @backstage/core-compat-api@0.3.0 + - @backstage/catalog-model@1.7.0 + - @backstage/catalog-client@1.7.0 + - @backstage/core-plugin-api@1.9.4 + - @backstage/theme@0.5.7 + - @backstage/plugin-home-react@0.1.17 + - @backstage/config@1.2.0 + +## 0.7.10-next.2 + +### Patch Changes + +- c891b69: Add `FavoriteToggle` in `core-components` to standardise favorite marking +- 836127c: Updated dependency `@testing-library/react` to `^16.0.0`. +- fa9d8da: Updated dependency `@rjsf/utils` to `5.20.1`. + Updated dependency `@rjsf/core` to `5.20.1`. + Updated dependency `@rjsf/material-ui` to `5.20.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.20.1`. +- Updated dependencies + - @backstage/core-components@0.14.11-next.1 + - @backstage/plugin-catalog-react@1.13.0-next.2 + - @backstage/core-app-api@1.14.3-next.0 + - @backstage/catalog-client@1.7.0-next.1 + - @backstage/core-compat-api@0.3.0-next.2 + - @backstage/core-plugin-api@1.9.4-next.0 + - @backstage/frontend-plugin-api@0.8.0-next.2 + - @backstage/theme@0.5.7-next.0 + - @backstage/plugin-home-react@0.1.17-next.1 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + +## 0.7.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.8.0-next.1 + - @backstage/core-compat-api@0.3.0-next.1 + - @backstage/catalog-client@1.6.7-next.0 + - @backstage/core-components@0.14.11-next.0 + - @backstage/plugin-catalog-react@1.12.4-next.1 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.14.2 + - @backstage/core-plugin-api@1.9.3 + - @backstage/theme@0.5.6 + - @backstage/plugin-home-react@0.1.17-next.0 + +## 0.7.10-next.0 + +### Patch Changes + +- fec8b57: Updated exports to use the new type parameters for extensions and extension blueprints. +- Updated dependencies + - @backstage/frontend-plugin-api@0.8.0-next.0 + - @backstage/core-compat-api@0.2.9-next.0 + - @backstage/plugin-catalog-react@1.12.4-next.0 + - @backstage/catalog-client@1.6.6 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.14.2 + - @backstage/core-components@0.14.10 + - @backstage/core-plugin-api@1.9.3 + - @backstage/theme@0.5.6 + - @backstage/plugin-home-react@0.1.16 + +## 0.7.9 + +### Patch Changes + +- 31bfc44: Updated alpha definitions of extension data references. +- fe1fbb2: Migrating usages of the deprecated `createExtension` `v1` format to the newer `v2` format, and old `create*Extension` extension creators to blueprints. +- fdcc059: Fixed a bug on the WelcomeTitle component where the welcome message wasn't correct when the language was set to Spanish +- Updated dependencies + - @backstage/frontend-plugin-api@0.7.0 + - @backstage/plugin-catalog-react@1.12.3 + - @backstage/core-components@0.14.10 + - @backstage/core-compat-api@0.2.8 + - @backstage/core-app-api@1.14.2 + - @backstage/catalog-model@1.6.0 + - @backstage/catalog-client@1.6.6 + - @backstage/config@1.2.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/theme@0.5.6 + - @backstage/plugin-home-react@0.1.16 + +## 0.7.9-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.7.0-next.3 + - @backstage/catalog-model@1.6.0-next.0 + - @backstage/core-compat-api@0.2.8-next.3 + - @backstage/plugin-catalog-react@1.12.3-next.3 + - @backstage/catalog-client@1.6.6-next.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.14.2-next.0 + - @backstage/core-components@0.14.10-next.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/theme@0.5.6 + - @backstage/plugin-home-react@0.1.16-next.0 + +## 0.7.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.7.0-next.2 + - @backstage/core-compat-api@0.2.8-next.2 + - @backstage/plugin-catalog-react@1.12.3-next.2 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.14.2-next.0 + - @backstage/core-components@0.14.10-next.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/theme@0.5.6 + - @backstage/plugin-home-react@0.1.16-next.0 + +## 0.7.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.3-next.1 + - @backstage/frontend-plugin-api@0.6.8-next.1 + - @backstage/core-compat-api@0.2.8-next.1 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.14.2-next.0 + - @backstage/core-components@0.14.10-next.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/theme@0.5.6 + - @backstage/plugin-home-react@0.1.16-next.0 + +## 0.7.8-next.0 + +### Patch Changes + +- 31bfc44: Updated alpha definitions of extension data references. +- fdcc059: Fixed a bug on the WelcomeTitle component where the welcome message wasn't correct when the language was set to Spanish +- Updated dependencies + - @backstage/frontend-plugin-api@0.6.8-next.0 + - @backstage/plugin-catalog-react@1.12.3-next.0 + - @backstage/core-components@0.14.10-next.0 + - @backstage/core-app-api@1.14.1-next.0 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/core-compat-api@0.2.8-next.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/theme@0.5.6 + - @backstage/plugin-home-react@0.1.16-next.0 + +## 0.7.7 + +### Patch Changes + +- cc81579: Updated dependency `@rjsf/utils` to `5.18.5`. + Updated dependency `@rjsf/core` to `5.18.5`. + Updated dependency `@rjsf/material-ui` to `5.18.5`. + Updated dependency `@rjsf/validator-ajv8` to `5.18.5`. +- Updated dependencies + - @backstage/core-components@0.14.9 + - @backstage/core-app-api@1.14.0 + - @backstage/plugin-catalog-react@1.12.2 + - @backstage/plugin-home-react@0.1.15 + - @backstage/frontend-plugin-api@0.6.7 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/core-compat-api@0.2.7 + - @backstage/core-plugin-api@1.9.3 + - @backstage/theme@0.5.6 + +## 0.7.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.9-next.1 + - @backstage/frontend-plugin-api@0.6.7-next.1 + - @backstage/plugin-catalog-react@1.12.2-next.2 + - @backstage/plugin-home-react@0.1.15-next.2 + - @backstage/core-compat-api@0.2.7-next.1 + +## 0.7.7-next.1 + +### Patch Changes + +- cc81579: Updated dependency `@rjsf/utils` to `5.18.5`. + Updated dependency `@rjsf/core` to `5.18.5`. + Updated dependency `@rjsf/material-ui` to `5.18.5`. + Updated dependency `@rjsf/validator-ajv8` to `5.18.5`. +- Updated dependencies + - @backstage/core-app-api@1.13.1-next.1 + - @backstage/plugin-catalog-react@1.12.2-next.1 + - @backstage/plugin-home-react@0.1.15-next.1 + - @backstage/core-compat-api@0.2.7-next.0 + - @backstage/core-components@0.14.9-next.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/frontend-plugin-api@0.6.7-next.0 + - @backstage/theme@0.5.6 + +## 0.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.9-next.0 + - @backstage/core-app-api@1.13.0-next.0 + - @backstage/plugin-catalog-react@1.12.2-next.0 + - @backstage/frontend-plugin-api@0.6.7-next.0 + - @backstage/plugin-home-react@0.1.15-next.0 + - @backstage/core-compat-api@0.2.7-next.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/theme@0.5.6 + +## 0.7.5 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- 6cb4886: Updated dependency `@rjsf/utils` to `5.18.4`. + Updated dependency `@rjsf/core` to `5.18.4`. + Updated dependency `@rjsf/material-ui` to `5.18.4`. + Updated dependency `@rjsf/validator-ajv8` to `5.18.4`. +- Updated dependencies + - @backstage/core-components@0.14.8 + - @backstage/core-compat-api@0.2.6 + - @backstage/core-plugin-api@1.9.3 + - @backstage/theme@0.5.6 + - @backstage/plugin-catalog-react@1.12.1 + - @backstage/plugin-home-react@0.1.14 + - @backstage/core-app-api@1.12.6 + - @backstage/frontend-plugin-api@0.6.6 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + +## 0.7.5-next.2 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/core-components@0.14.8-next.2 + - @backstage/plugin-catalog-react@1.12.1-next.2 + - @backstage/plugin-home-react@0.1.14-next.2 + - @backstage/frontend-plugin-api@0.6.6-next.2 + - @backstage/core-compat-api@0.2.6-next.2 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.12.6-next.0 + - @backstage/core-plugin-api@1.9.3-next.0 + - @backstage/theme@0.5.6-next.0 + +## 0.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.8-next.1 + - @backstage/core-compat-api@0.2.6-next.1 + - @backstage/core-plugin-api@1.9.3-next.0 + - @backstage/core-app-api@1.12.6-next.0 + - @backstage/frontend-plugin-api@0.6.6-next.1 + - @backstage/plugin-catalog-react@1.12.1-next.1 + - @backstage/plugin-home-react@0.1.14-next.1 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/theme@0.5.6-next.0 + +## 0.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.5.6-next.0 + - @backstage/core-components@0.14.8-next.0 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.12.5 + - @backstage/core-compat-api@0.2.6-next.0 + - @backstage/core-plugin-api@1.9.2 + - @backstage/frontend-plugin-api@0.6.6-next.0 + - @backstage/plugin-catalog-react@1.12.1-next.0 + - @backstage/plugin-home-react@0.1.14-next.0 + +## 0.7.4 + +### Patch Changes + +- 2196d3e: Use relative time when displaying visits from the same day +- 0040ec2: Updated dependency `@rjsf/utils` to `5.18.2`. + Updated dependency `@rjsf/core` to `5.18.2`. + Updated dependency `@rjsf/material-ui` to `5.18.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.18.2`. +- Updated dependencies + - @backstage/core-compat-api@0.2.5 + - @backstage/core-components@0.14.7 + - @backstage/catalog-model@1.5.0 + - @backstage/plugin-catalog-react@1.12.0 + - @backstage/theme@0.5.4 + - @backstage/plugin-home-react@0.1.13 + - @backstage/core-app-api@1.12.5 + - @backstage/catalog-client@1.6.5 + - @backstage/frontend-plugin-api@0.6.5 + +## 0.7.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + +## 0.7.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.6-next.1 + - @backstage/plugin-catalog-react@1.11.4-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-home-react@0.1.13-next.1 + - @backstage/core-compat-api@0.2.5-next.1 + +## 0.7.4-next.0 + +### Patch Changes + +- 2196d3e: Use relative time when displaying visits from the same day +- 0040ec2: Updated dependency `@rjsf/utils` to `5.18.2`. + Updated dependency `@rjsf/core` to `5.18.2`. + Updated dependency `@rjsf/material-ui` to `5.18.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.18.2`. +- Updated dependencies + - @backstage/core-compat-api@0.2.5-next.0 + - @backstage/catalog-model@1.5.0-next.0 + - @backstage/theme@0.5.4-next.0 + - @backstage/core-components@0.14.5-next.0 + - @backstage/plugin-home-react@0.1.13-next.0 + - @backstage/catalog-client@1.6.5-next.0 + - @backstage/plugin-catalog-react@1.11.4-next.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.12.4 + - @backstage/core-plugin-api@1.9.2 + - @backstage/frontend-plugin-api@0.6.5-next.0 + +## 0.7.3 + +### Patch Changes + +- abfbcfc: Updated dependency `@testing-library/react` to `^15.0.0`. +- cb1e3b0: Updated dependency `@testing-library/dom` to `^10.0.0`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.11.3 + - @backstage/plugin-home-react@0.1.12 + - @backstage/core-compat-api@0.2.4 + - @backstage/core-components@0.14.4 + - @backstage/core-app-api@1.12.4 + - @backstage/core-plugin-api@1.9.2 + - @backstage/frontend-plugin-api@0.6.4 + - @backstage/theme@0.5.3 + - @backstage/catalog-client@1.6.4 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + +## 0.7.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.12.4-next.0 + - @backstage/catalog-client@1.6.4-next.0 + - @backstage/frontend-plugin-api@0.6.4-next.1 + - @backstage/core-compat-api@0.2.4-next.1 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/core-components@0.14.4-next.0 + - @backstage/core-plugin-api@1.9.1 + - @backstage/theme@0.5.2 + - @backstage/plugin-catalog-react@1.11.3-next.1 + - @backstage/plugin-home-react@0.1.12-next.0 + +## 0.7.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.4-next.0 + - @backstage/catalog-client@1.6.3 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.12.3 + - @backstage/core-compat-api@0.2.4-next.0 + - @backstage/core-plugin-api@1.9.1 + - @backstage/frontend-plugin-api@0.6.4-next.0 + - @backstage/theme@0.5.2 + - @backstage/plugin-catalog-react@1.11.3-next.0 + - @backstage/plugin-home-react@0.1.12-next.0 + +## 0.7.2 + +### Patch Changes + +- e8f026a: Use ESM exports of react-use library +- Updated dependencies + - @backstage/catalog-client@1.6.3 + - @backstage/core-components@0.14.3 + - @backstage/core-app-api@1.12.3 + - @backstage/plugin-catalog-react@1.11.2 + - @backstage/frontend-plugin-api@0.6.3 + - @backstage/plugin-home-react@0.1.11 + - @backstage/core-compat-api@0.2.3 + - @backstage/core-plugin-api@1.9.1 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/theme@0.5.2 + +## 0.7.1 + +### Patch Changes + +- e8f026a: Use ESM exports of react-use library +- Updated dependencies + - @backstage/catalog-client@1.6.2 + - @backstage/core-components@0.14.2 + - @backstage/core-app-api@1.12.2 + - @backstage/plugin-catalog-react@1.11.1 + - @backstage/frontend-plugin-api@0.6.2 + - @backstage/plugin-home-react@0.1.10 + - @backstage/core-compat-api@0.2.2 + - @backstage/core-plugin-api@1.9.1 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/theme@0.5.2 + +## 0.7.0 + +### Minor Changes + +- 8807d2a: Resolved styling inconsistencies and title visibility issues in Top Visited and Recently Visited cards + +### Patch Changes + +- 0cecb09: Updated dependency `@rjsf/utils` to `5.17.1`. + Updated dependency `@rjsf/core` to `5.17.1`. + Updated dependency `@rjsf/material-ui` to `5.17.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.17.1`. +- 2e17681: Added the `no-top-level-material-ui-4-imports` ESLint rule to aid with the migration to Material UI v5 +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/core-components@0.14.1 + - @backstage/theme@0.5.2 + - @backstage/plugin-catalog-react@1.11.0 + - @backstage/catalog-client@1.6.1 + - @backstage/plugin-home-react@0.1.9 + - @backstage/catalog-model@1.4.5 + - @backstage/core-app-api@1.12.1 + - @backstage/core-compat-api@0.2.1 + - @backstage/core-plugin-api@1.9.1 + - @backstage/frontend-plugin-api@0.6.1 + +## 0.7.0-next.2 + +### Minor Changes + +- 8807d2a: Resolved styling inconsistencies and title visibility issues in Top Visited and Recently Visited cards + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.1-next.2 + - @backstage/plugin-catalog-react@1.11.0-next.2 + - @backstage/catalog-client@1.6.1-next.1 + - @backstage/frontend-plugin-api@0.6.1-next.2 + - @backstage/plugin-home-react@0.1.9-next.2 + - @backstage/core-compat-api@0.2.1-next.2 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/config@1.2.0-next.1 + - @backstage/core-app-api@1.12.1-next.1 + - @backstage/core-plugin-api@1.9.1-next.1 + - @backstage/theme@0.5.2-next.0 + +## 0.6.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/core-components@0.14.1-next.1 + - @backstage/plugin-catalog-react@1.10.1-next.1 + - @backstage/core-app-api@1.12.1-next.1 + - @backstage/core-plugin-api@1.9.1-next.1 + - @backstage/frontend-plugin-api@0.6.1-next.1 + - @backstage/plugin-home-react@0.1.9-next.1 + - @backstage/catalog-client@1.6.1-next.0 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/core-compat-api@0.2.1-next.1 + - @backstage/theme@0.5.2-next.0 + +## 0.6.3-next.0 + +### Patch Changes + +- 0cecb09: Updated dependency `@rjsf/utils` to `5.17.1`. + Updated dependency `@rjsf/core` to `5.17.1`. + Updated dependency `@rjsf/material-ui` to `5.17.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.17.1`. +- Updated dependencies + - @backstage/theme@0.5.2-next.0 + - @backstage/core-components@0.14.1-next.0 + - @backstage/plugin-catalog-react@1.10.1-next.0 + - @backstage/plugin-home-react@0.1.9-next.0 + - @backstage/catalog-client@1.6.1-next.0 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/config@1.1.2-next.0 + - @backstage/core-plugin-api@1.9.1-next.0 + - @backstage/frontend-plugin-api@0.6.1-next.0 + - @backstage/core-app-api@1.12.1-next.0 + - @backstage/core-compat-api@0.2.1-next.0 + +## 0.6.2 + +### Patch Changes + +- 9aac2b0: Use `--cwd` as the first `yarn` argument +- dc7ae8b: Use EntityDisplayName JSX element entity information directly for FeaturedDocsCard. +- 8fe56a8: Widen `@types/react` dependency range to include version 18. +- e6f0831: Updated dependency `@rjsf/utils` to `5.17.0`. + Updated dependency `@rjsf/core` to `5.17.0`. + Updated dependency `@rjsf/material-ui` to `5.17.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.17.0`. +- 6a74ffd: Updated dependency `@rjsf/utils` to `5.16.1`. + Updated dependency `@rjsf/core` to `5.16.1`. + Updated dependency `@rjsf/material-ui` to `5.16.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.16.1`. +- e9cdfd3: Fix typo in VisitsStorageApi +- 384c132: Added filter support for HomePageVisitedByType in order to enable filtering entities from the list +- Updated dependencies + - @backstage/frontend-plugin-api@0.6.0 + - @backstage/core-compat-api@0.2.0 + - @backstage/plugin-catalog-react@1.10.0 + - @backstage/core-components@0.14.0 + - @backstage/core-app-api@1.12.0 + - @backstage/catalog-model@1.4.4 + - @backstage/theme@0.5.1 + - @backstage/core-plugin-api@1.9.0 + - @backstage/catalog-client@1.6.0 + - @backstage/plugin-home-react@0.1.8 + - @backstage/config@1.1.1 + +## 0.6.2-next.3 + +### Patch Changes + +- e6f0831: Updated dependency `@rjsf/utils` to `5.17.0`. + Updated dependency `@rjsf/core` to `5.17.0`. + Updated dependency `@rjsf/material-ui` to `5.17.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.17.0`. +- Updated dependencies + - @backstage/theme@0.5.1-next.1 + - @backstage/core-components@0.14.0-next.2 + - @backstage/plugin-catalog-react@1.10.0-next.3 + - @backstage/plugin-home-react@0.1.8-next.3 + - @backstage/catalog-client@1.6.0-next.1 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.12.0-next.1 + - @backstage/core-compat-api@0.2.0-next.3 + - @backstage/core-plugin-api@1.9.0-next.1 + - @backstage/frontend-plugin-api@0.6.0-next.3 + +## 0.6.2-next.2 + +### Patch Changes + +- 9aac2b0: Use `--cwd` as the first `yarn` argument +- dc7ae8b: Use EntityDisplayName JSX element entity information directly for FeaturedDocsCard. +- 8fe56a8: Widen `@types/react` dependency range to include version 18. +- Updated dependencies + - @backstage/core-components@0.14.0-next.1 + - @backstage/core-app-api@1.12.0-next.1 + - @backstage/core-plugin-api@1.9.0-next.1 + - @backstage/frontend-plugin-api@0.6.0-next.2 + - @backstage/plugin-catalog-react@1.10.0-next.2 + - @backstage/theme@0.5.1-next.0 + - @backstage/plugin-home-react@0.1.8-next.2 + - @backstage/core-compat-api@0.2.0-next.2 + - @backstage/config@1.1.1 + - @backstage/catalog-client@1.6.0-next.1 + - @backstage/catalog-model@1.4.4-next.0 + +## 0.6.2-next.1 + +### Patch Changes + +- 384c132: Added filter support for HomePageVisitedByType in order to enable filtering entities from the list +- Updated dependencies + - @backstage/frontend-plugin-api@0.6.0-next.1 + - @backstage/core-compat-api@0.2.0-next.1 + - @backstage/core-components@0.14.0-next.0 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/catalog-client@1.6.0-next.1 + - @backstage/core-plugin-api@1.8.3-next.0 + - @backstage/core-app-api@1.11.4-next.0 + - @backstage/plugin-catalog-react@1.9.4-next.1 + - @backstage/plugin-home-react@0.1.8-next.1 + - @backstage/config@1.1.1 + - @backstage/theme@0.5.0 + +## 0.6.2-next.0 + +### Patch Changes + +- 6a74ffd: Updated dependency `@rjsf/utils` to `5.16.1`. + Updated dependency `@rjsf/core` to `5.16.1`. + Updated dependency `@rjsf/material-ui` to `5.16.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.16.1`. +- e9cdfd3: Fix typo in VisitsStorageApi +- Updated dependencies + - @backstage/core-compat-api@0.1.2-next.0 + - @backstage/plugin-catalog-react@1.9.4-next.0 + - @backstage/frontend-plugin-api@0.5.1-next.0 + - @backstage/catalog-client@1.6.0-next.0 + - @backstage/plugin-home-react@0.1.8-next.0 + - @backstage/core-components@0.13.10 + - @backstage/catalog-model@1.4.3 + - @backstage/core-app-api@1.11.3 + - @backstage/core-plugin-api@1.8.2 + - @backstage/theme@0.5.0 + +## 0.6.1 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-compat-api@0.1.1 + - @backstage/frontend-plugin-api@0.5.0 + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-home-react@0.1.7 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/catalog-model@1.4.3 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + +## 0.6.1-next.2 + +### Patch Changes + +- 98ac5ab: Updated dependency `@rjsf/utils` to `5.15.1`. + Updated dependency `@rjsf/core` to `5.15.1`. + Updated dependency `@rjsf/material-ui` to `5.15.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.1`. +- Updated dependencies + - @backstage/core-compat-api@0.1.1-next.2 + - @backstage/frontend-plugin-api@0.4.1-next.2 + - @backstage/plugin-home-react@0.1.7-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + +## 0.6.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2-next.0 + - @backstage/core-components@0.13.10-next.1 + - @backstage/core-app-api@1.11.3-next.0 + - @backstage/core-compat-api@0.1.1-next.1 + - @backstage/frontend-plugin-api@0.4.1-next.1 + - @backstage/plugin-catalog-react@1.9.3-next.1 + - @backstage/plugin-home-react@0.1.7-next.1 + - @backstage/catalog-client@1.5.2-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/theme@0.5.0 + +## 0.6.1-next.0 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10-next.0 + - @backstage/catalog-client@1.5.2-next.0 + - @backstage/frontend-plugin-api@0.4.1-next.0 + - @backstage/plugin-catalog-react@1.9.3-next.0 + - @backstage/plugin-home-react@0.1.7-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/core-app-api@1.11.2 + - @backstage/core-compat-api@0.1.1-next.0 + - @backstage/core-plugin-api@1.8.1 + - @backstage/theme@0.5.0 + +## 0.6.0 + +### Minor Changes + +- 5a317f5: Added view of entities grouped by kind to make it easier to distinguish entities with different kind but same name + +### Patch Changes + +- 2633d64: Change user settings backend plugin id and fix when using user setting backend home page first will cause edit page loop render +- a1227cc: Wrap `/alpha` export extension elements in backwards compatibility wrapper. +- 5814122: Updated `/alpha` exports to fit new naming patterns. +- 8f5d6c1: Updates to the `/alpha` exports to match the extension input wrapping change. +- 2b72591: Updated dependency `@rjsf/utils` to `5.14.3`. + Updated dependency `@rjsf/core` to `5.14.3`. + Updated dependency `@rjsf/material-ui` to `5.14.3`. + Updated dependency `@rjsf/validator-ajv8` to `5.14.3`. +- 6cd12f2: Updated dependency `@rjsf/utils` to `5.14.1`. + Updated dependency `@rjsf/core` to `5.14.1`. + Updated dependency `@rjsf/material-ui` to `5.14.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.14.1`. +- 64301d3: Updated dependency `@rjsf/utils` to `5.15.0`. + Updated dependency `@rjsf/core` to `5.15.0`. + Updated dependency `@rjsf/material-ui` to `5.15.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.0`. +- 63c494e: Updated dependency `@rjsf/utils` to `5.14.2`. + Updated dependency `@rjsf/core` to `5.14.2`. + Updated dependency `@rjsf/material-ui` to `5.14.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.14.2`. +- 36c94b8: Refactor of the alpha exports due to API change in how extension IDs are constructed. +- 54cef27: StarredEntities component calls `getEntitiesByRefs` instead of `getEntities` to improve performance since we have the `entityRefs` +- c8908d4: Use new option from RJSF 5.15 +- 0cbb03b: Fixing regular expression ReDoS with zod packages. Upgrading to latest. ref: +- Updated dependencies + - @backstage/core-compat-api@0.1.0 + - @backstage/core-plugin-api@1.8.1 + - @backstage/frontend-plugin-api@0.4.0 + - @backstage/plugin-catalog-react@1.9.2 + - @backstage/core-components@0.13.9 + - @backstage/theme@0.5.0 + - @backstage/catalog-client@1.5.0 + - @backstage/core-app-api@1.11.2 + - @backstage/plugin-home-react@0.1.6 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 0.6.0-next.3 + +### Patch Changes + +- 2633d64: Change user settings backend plugin id and fix when using user setting backend home page first will cause edit page loop render +- 64301d3: Updated dependency `@rjsf/utils` to `5.15.0`. + Updated dependency `@rjsf/core` to `5.15.0`. + Updated dependency `@rjsf/material-ui` to `5.15.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.15.0`. +- 54cef27: StarredEntities component calls `getEntitiesByRefs` instead of `getEntities` to improve performance since we have the `entityRefs` +- c8908d4: Use new option from RJSF 5.15 +- Updated dependencies + - @backstage/plugin-home-react@0.1.6-next.3 + - @backstage/core-components@0.13.9-next.3 + - @backstage/catalog-client@1.5.0-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.2-next.1 + - @backstage/core-compat-api@0.1.0-next.3 + - @backstage/core-plugin-api@1.8.1-next.1 + - @backstage/frontend-plugin-api@0.4.0-next.3 + - @backstage/theme@0.5.0-next.1 + - @backstage/types@1.1.1 + - @backstage/plugin-catalog-react@1.9.2-next.3 + +## 0.6.0-next.2 + +### Patch Changes + +- a1227cc: Wrap `/alpha` export extension elements in backwards compatibility wrapper. +- 8f5d6c1: Updates to the `/alpha` exports to match the extension input wrapping change. +- 36c94b8: Refactor of the alpha exports due to API change in how extension IDs are constructed. +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.0-next.2 + - @backstage/theme@0.5.0-next.1 + - @backstage/core-compat-api@0.1.0-next.2 + - @backstage/plugin-catalog-react@1.9.2-next.2 + - @backstage/catalog-client@1.5.0-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.2-next.1 + - @backstage/core-components@0.13.9-next.2 + - @backstage/core-plugin-api@1.8.1-next.1 + - @backstage/types@1.1.1 + - @backstage/plugin-home-react@0.1.6-next.2 + +## 0.6.0-next.1 + +### Minor Changes + +- 5a317f59c0: Added view of entities grouped by kind to make it easier to distinguish entities with different kind but same name + +### Patch Changes + +- 2b725913c1: Updated dependency `@rjsf/utils` to `5.14.3`. + Updated dependency `@rjsf/core` to `5.14.3`. + Updated dependency `@rjsf/material-ui` to `5.14.3`. + Updated dependency `@rjsf/validator-ajv8` to `5.14.3`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.4.0-next.1 + - @backstage/core-components@0.13.9-next.1 + - @backstage/core-plugin-api@1.8.1-next.1 + - @backstage/plugin-catalog-react@1.9.2-next.1 + - @backstage/catalog-client@1.5.0-next.0 + - @backstage/core-app-api@1.11.2-next.1 + - @backstage/plugin-home-react@0.1.6-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/theme@0.5.0-next.0 + - @backstage/types@1.1.1 + +## 0.5.12-next.0 + +### Patch Changes + +- 6cd12f277b: Updated dependency `@rjsf/utils` to `5.14.1`. + Updated dependency `@rjsf/core` to `5.14.1`. + Updated dependency `@rjsf/material-ui` to `5.14.1`. + Updated dependency `@rjsf/validator-ajv8` to `5.14.1`. +- 63c494ef22: Updated dependency `@rjsf/utils` to `5.14.2`. + Updated dependency `@rjsf/core` to `5.14.2`. + Updated dependency `@rjsf/material-ui` to `5.14.2`. + Updated dependency `@rjsf/validator-ajv8` to `5.14.2`. +- Updated dependencies + - @backstage/core-plugin-api@1.8.1-next.0 + - @backstage/plugin-catalog-react@1.9.2-next.0 + - @backstage/core-components@0.13.9-next.0 + - @backstage/plugin-home-react@0.1.6-next.0 + - @backstage/theme@0.5.0-next.0 + - @backstage/frontend-plugin-api@0.3.1-next.0 + - @backstage/core-app-api@1.11.2-next.0 + - @backstage/catalog-client@1.4.6 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 0.5.10 + +### Patch Changes + +- d86b2acec4: Fix bug where `retrieveAll` method wasn't fetching visits + +- 3fdffbb699: Remove the duplicate versions of `@rjsf/*` as they're no longer needed + +- 6c2b872153: Add official support for React 18. + +- 5b364984bf: Added experimental support for declarative integration via the `/alpha` subpath. + +- c838da0edd: Updated dependency `@rjsf/utils` to `5.13.6`. + Updated dependency `@rjsf/core` to `5.13.6`. + Updated dependency `@rjsf/material-ui` to `5.13.6`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.6`. + +- cc0e8d0b51: Temporarily pin the `react-grid-layout` sub-dependency to version `1.3.4` while the horizontal resizing of the latest version is not fixed. For more details, see [#20712](https://github.com/backstage/backstage/issues/20712). + +- 302316d231: Added a new Featured Docs component to `plugin-home`, which can display any entity given a filter. + + import { FeaturedDocsCard } from '@backstage/plugin-home'; + + + + See the [storybook examples](https://backstage.io/storybook/?path=/story/plugins-home-components-featureddocs--default) + +- Updated dependencies + - @backstage/plugin-catalog-react@1.9.0 + - @backstage/core-components@0.13.8 + - @backstage/frontend-plugin-api@0.3.0 + - @backstage/core-plugin-api@1.8.0 + - @backstage/core-app-api@1.11.1 + - @backstage/plugin-home-react@0.1.5 + - @backstage/theme@0.4.4 + - @backstage/catalog-client@1.4.6 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 0.5.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.8-next.2 + - @backstage/frontend-plugin-api@0.3.0-next.2 + - @backstage/plugin-catalog-react@1.9.0-next.2 + - @backstage/plugin-home-react@0.1.5-next.2 + +## 0.5.10-next.1 + +### Patch Changes + +- d86b2acec4: Fix bug where `retrieveAll` method wasn't fetching visits +- Updated dependencies + - @backstage/frontend-plugin-api@0.3.0-next.1 + - @backstage/plugin-catalog-react@1.9.0-next.1 + - @backstage/core-components@0.13.8-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.1-next.0 + - @backstage/core-plugin-api@1.8.0-next.0 + - @backstage/theme@0.4.4-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-home-react@0.1.5-next.1 + +## 0.5.10-next.0 + +### Patch Changes + +- 3fdffbb699: Remove the duplicate versions of `@rjsf/*` as they're no longer needed +- 6c2b872153: Add official support for React 18. +- 5b364984bf: Added experimental support for declarative integration via the `/alpha` subpath. +- cc0e8d0b51: Temporarily pin the `react-grid-layout` sub-dependency to version `1.3.4` while the horizontal resizing of the latest version is not fixed. For more details, see [#20712](https://github.com/backstage/backstage/issues/20712). +- Updated dependencies + - @backstage/core-components@0.13.7-next.0 + - @backstage/frontend-plugin-api@0.3.0-next.0 + - @backstage/plugin-catalog-react@1.9.0-next.0 + - @backstage/core-plugin-api@1.8.0-next.0 + - @backstage/core-app-api@1.11.1-next.0 + - @backstage/plugin-home-react@0.1.5-next.0 + - @backstage/theme@0.4.4-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 0.5.9 + +### Patch Changes + +- f997f771da: Adds Top/Recently Visited components to homepage +- 9a1fce352e: Updated dependency `@testing-library/jest-dom` to `^6.0.0`. +- f95af4e540: Updated dependency `@testing-library/dom` to `^9.0.0`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5 + - @backstage/core-app-api@1.11.0 + - @backstage/core-plugin-api@1.7.0 + - @backstage/core-components@0.13.6 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-home-react@0.1.4 + - @backstage/theme@0.4.3 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.11.0-next.2 + - @backstage/core-components@0.13.6-next.2 + - @backstage/core-plugin-api@1.7.0-next.1 + - @backstage/catalog-model@1.4.3-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.2 + - @backstage/theme@0.4.3-next.0 + - @backstage/config@1.1.1-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-home-react@0.1.4-next.2 + +## 0.5.9-next.1 + +### Patch Changes + +- f997f771da: Adds Top/Recently Visited components to homepage +- Updated dependencies + - @backstage/core-components@0.13.6-next.1 + - @backstage/core-app-api@1.10.1-next.1 + - @backstage/plugin-catalog-react@1.8.5-next.1 + - @backstage/plugin-home-react@0.1.4-next.1 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/types@1.1.1 + +## 0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-home-react@0.1.4-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + +## 0.5.8 + +### Patch Changes + +- 2bc96ce69eea: Fixed a bug where customizable home page cards would render missing their normal borders. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 98bb77c1f0b8: Align zod dependency to align with other packages. +- 8cec7664e146: Removed `@types/node` dependency +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- 1853ffa09b50: Allow specifying static widgets to custom home page +- Updated dependencies + - @backstage/plugin-home-react@0.1.3 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/config@1.1.0 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/theme@0.4.2 + +## 0.5.8-next.3 + +### Patch Changes + +- 2bc96ce69eea: Fixed a bug where customizable home page cards would render missing their normal borders. +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- b16c341ced45: Updated dependency `@rjsf/utils` to `5.13.0`. + Updated dependency `@rjsf/core-v5` to `npm:@rjsf/core@5.13.0`. + Updated dependency `@rjsf/material-ui-v5` to `npm:@rjsf/material-ui@5.13.0`. + Updated dependency `@rjsf/validator-ajv8` to `5.13.0`. +- Updated dependencies + - @backstage/catalog-model@1.4.2-next.2 + - @backstage/config@1.1.0-next.2 + - @backstage/core-components@0.13.5-next.3 + - @backstage/core-plugin-api@1.6.0-next.3 + - @backstage/plugin-catalog-react@1.8.4-next.3 + - @backstage/plugin-home-react@0.1.3-next.3 + - @backstage/theme@0.4.2-next.0 + +## 0.5.8-next.2 + +### Patch Changes + +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5-next.2 + - @backstage/core-plugin-api@1.6.0-next.2 + - @backstage/plugin-home-react@0.1.3-next.2 + - @backstage/config@1.1.0-next.1 + - @backstage/plugin-catalog-react@1.8.4-next.2 + - @backstage/catalog-model@1.4.2-next.1 + - @backstage/theme@0.4.1 + +## 0.5.8-next.1 + +### Patch Changes + +- 98bb77c1f0b8: Align zod dependency to align with other packages. +- 1853ffa09b50: Allow specifying static widgets to custom home page +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.4-next.1 + - @backstage/core-components@0.13.5-next.1 + - @backstage/config@1.1.0-next.0 + - @backstage/plugin-home-react@0.1.3-next.1 + - @backstage/catalog-model@1.4.2-next.0 + - @backstage/core-plugin-api@1.6.0-next.1 + - @backstage/theme@0.4.1 + +## 0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home-react@0.1.3-next.0 + - @backstage/core-plugin-api@1.6.0-next.0 + - @backstage/core-components@0.13.5-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.3-next.0 + +## 0.5.5 + +### Patch Changes + +- a559ff68de7e: Now, user can provide a language (optional) as input to receive a greeting in that specific language. Example: `` +- 6743d3917a52: Make sure the widget name is never empty in the `AddWidgetDialog`. If the title was set to "", the entry would contain an empty string. Use the name as a fallback +- Updated dependencies + - @backstage/plugin-home-react@0.1.2 + - @backstage/core-components@0.13.4 + - @backstage/plugin-catalog-react@1.8.1 + - @backstage/core-plugin-api@1.5.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/theme@0.4.1 + +## 0.5.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.1-next.1 + - @backstage/plugin-home-react@0.1.2-next.0 + +## 0.5.5-next.0 + +### Patch Changes + +- a559ff68de7e: Now, user can provide a language (optional) as input to receive a greeting in that specific language. Example: `` +- 6743d3917a52: Make sure the widget name is never empty in the `AddWidgetDialog`. If the title was set to "", the entry would contain an empty string. Use the name as a fallback +- Updated dependencies + - @backstage/plugin-home-react@0.1.2-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/theme@0.4.1 + +## 0.5.4 + +### Patch Changes + +- 88c62048fcbd: fix: update plugin home dependency for `@rjsf/material-ui` to `@rjsf/material-ui-v5` +- 0b89ca8ce24a: Add possibility to customize the settings widget for different + properties by using the `uiSchema` provided by the json-schema. + More information here: +- b8ebd3d2e4e5: Fix missing column breakpoints in `CustomHompageGrid` +- Updated dependencies + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.0 + - @backstage/core-components@0.13.3 + - @backstage/plugin-home-react@0.1.1 + - @backstage/core-plugin-api@1.5.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + +## 0.5.4-next.2 + +### Patch Changes + +- 0b89ca8ce24a: Add possibility to customize the settings widget for different + properties by using the `uiSchema` provided by the json-schema. + More information here: +- Updated dependencies + - @backstage/plugin-catalog-react@1.8.0-next.2 + - @backstage/plugin-home-react@0.1.1-next.2 + - @backstage/theme@0.4.1-next.1 + - @backstage/core-plugin-api@1.5.3-next.1 + - @backstage/core-components@0.13.3-next.2 + - @backstage/catalog-model@1.4.1-next.0 + - @backstage/config@1.0.8 + +## 0.5.4-next.1 + +### Patch Changes + +- b8ebd3d2e4e5: Fix missing column breakpoints in `CustomHompageGrid` +- Updated dependencies + - @backstage/theme@0.4.1-next.0 + - @backstage/core-components@0.13.3-next.1 + - @backstage/core-plugin-api@1.5.3-next.0 + - @backstage/plugin-catalog-react@1.7.1-next.1 + - @backstage/plugin-home-react@0.1.1-next.1 + - @backstage/config@1.0.8 + +## 0.5.4-next.0 + +### Patch Changes + +- 88c62048fcbd: fix: update plugin home dependency for `@rjsf/material-ui` to `@rjsf/material-ui-v5` +- Updated dependencies + - @backstage/core-components@0.13.3-next.0 + - @backstage/catalog-model@1.4.1-next.0 + - @backstage/config@1.0.8 + - @backstage/core-plugin-api@1.5.2 + - @backstage/theme@0.4.0 + - @backstage/plugin-catalog-react@1.7.1-next.0 + - @backstage/plugin-home-react@0.1.1-next.0 + +## 0.5.3 + +### Patch Changes + +- d1cfb4e4c4cd: Update set up documentation to export homepage as element instead of React component. +- 2e4940e1a8f8: Allow more customization for the CustomHomepageGrid +- 2ff94da135a4: bump `rjsf` dependencies to 5.7.3 +- 41e8037a8a6d: Extract new plugin-home-react package and deprecate createCardExtension in plugin-home +- Updated dependencies + - @backstage/core-plugin-api@1.5.2 + - @backstage/core-components@0.13.2 + - @backstage/theme@0.4.0 + - @backstage/plugin-catalog-react@1.7.0 + - @backstage/catalog-model@1.4.0 + - @backstage/plugin-home-react@0.1.0 + - @backstage/config@1.0.8 + +## 0.5.3-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.3 + - @backstage/catalog-model@1.4.0-next.1 + - @backstage/config@1.0.7 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.3 + - @backstage/plugin-home-react@0.1.0-next.3 + +## 0.5.3-next.2 + +### Patch Changes + +- 2ff94da135a4: bump `rjsf` dependencies to 5.7.3 +- Updated dependencies + - @backstage/theme@0.4.0-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.2 + - @backstage/core-components@0.13.2-next.2 + - @backstage/plugin-home-react@0.1.0-next.2 + - @backstage/config@1.0.7 + - @backstage/core-plugin-api@1.5.2-next.0 + +## 0.5.3-next.1 + +### Patch Changes + +- d1cfb4e4c4cd: Update set up documentation to export homepage as element instead of React component. +- 2e4940e1a8f8: Allow more customization for the CustomHomepageGrid +- Updated dependencies + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-home-react@0.1.0-next.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + +## 0.5.3-next.0 + +### Patch Changes + +- 41e8037a8a6d: Extract new plugin-home-react package and deprecate createCardExtension in plugin-home +- Updated dependencies + - @backstage/plugin-catalog-react@1.7.0-next.0 + - @backstage/plugin-home-react@0.1.0-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/config@1.0.7 + - @backstage/core-components@0.13.2-next.0 + - @backstage/core-plugin-api@1.5.1 + - @backstage/catalog-model@1.3.0 + +## 0.5.2 + +### Patch Changes + +- acca8966465: Remove object-hash dependency +- 957cd9b8958: Use the semantic time tag for rendering world clocks on homepage headers. +- 0e19e7b0f3a: Bump to using the later v5 versions of `@rjsf/*` +- 5272cfabc3b: Add missing @rjsf/core dependency +- Updated dependencies + - @backstage/theme@0.3.0 + - @backstage/plugin-catalog-react@1.6.0 + - @backstage/core-components@0.13.1 + - @backstage/catalog-model@1.3.0 + - @backstage/config@1.0.7 + - @backstage/core-plugin-api@1.5.1 + +## 0.5.2-next.2 + +### Patch Changes + +- acca8966465: Remove object-hash dependency +- Updated dependencies + - @backstage/theme@0.3.0-next.0 + - @backstage/core-components@0.13.1-next.1 + - @backstage/plugin-catalog-react@1.6.0-next.2 + - @backstage/config@1.0.7 + - @backstage/core-plugin-api@1.5.1 + +## 0.5.2-next.1 + +### Patch Changes + +- 0e19e7b0f3a: Bump to using the later v5 versions of `@rjsf/*` +- Updated dependencies + - @backstage/core-components@0.13.1-next.0 + - @backstage/core-plugin-api@1.5.1 + - @backstage/plugin-catalog-react@1.6.0-next.1 + - @backstage/config@1.0.7 + +## 0.5.1-next.0 + +### Patch Changes + +- 5272cfabc3b: Add missing @rjsf/core dependency +- Updated dependencies + - @backstage/plugin-catalog-react@1.6.0-next.0 + - @backstage/core-components@0.13.0 + - @backstage/core-plugin-api@1.5.1 + - @backstage/catalog-model@1.3.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19 + +## 0.5.0 + +### Minor Changes + +- 760f521b979: Add support for customizable homepage. + + Allows customizing homepage components, their placement, size and + individual settings. For maximum size and settings, the existing home + components should add necessary data attributes to their components. + + See `plugins/home/README.md` for more information how to configure + the customizable homepage. + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.13.0 + - @backstage/plugin-catalog-react@1.5.0 + - @backstage/theme@0.2.19 + - @backstage/core-plugin-api@1.5.1 + - @backstage/catalog-model@1.3.0 + - @backstage/config@1.0.7 + +## 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 + +## 0.4.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19-next.0 + +## 0.4.33-next.1 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## 0.4.33-next.0 + +### Patch Changes + +- 8e00acb28db: Small tweaks to remove warnings in the console during development (mainly focusing on techdocs) +- Updated dependencies + - @backstage/core-components@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## 0.4.32 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## 0.4.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## 0.4.32-next.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5-next.1 + - @backstage/core-plugin-api@1.4.1-next.1 + - @backstage/config@1.0.7-next.0 + - @backstage/theme@0.2.18-next.0 + - @backstage/plugin-catalog-react@1.4.0-next.1 + - @backstage/catalog-model@1.2.1-next.1 + +## 0.4.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.0-next.0 + - @backstage/core-plugin-api@1.4.1-next.0 + - @backstage/catalog-model@1.2.1-next.0 + - @backstage/config@1.0.6 + - @backstage/core-components@0.12.5-next.0 + - @backstage/theme@0.2.17 + +## 0.4.31 + +### Patch Changes + +- c51efce2a0: Update docs to always use `yarn add --cwd` for app & backend +- 3d1d867d42: Fixed regression that caused the `WelcomeTitle` to not be the right size when passed to the `title` property of the `
` component. A Storybook entry was also added for the `WelcomeTitle` +- c553a625d2: remove unused plugin-stack-overflow dependency +- Updated dependencies + - @backstage/core-components@0.12.4 + - @backstage/catalog-model@1.2.0 + - @backstage/theme@0.2.17 + - @backstage/core-plugin-api@1.4.0 + - @backstage/plugin-catalog-react@1.3.0 + - @backstage/config@1.0.6 + +## 0.4.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## 0.4.31-next.1 + +### Patch Changes + +- 3d1d867d42: Fixed regression that caused the `WelcomeTitle` to not be the right size when passed to the `title` property of the `
` component. A Storybook entry was also added for the `WelcomeTitle` +- c553a625d2: remove unused plugin-stack-overflow dependency +- Updated dependencies + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## 0.4.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-stack-overflow@0.1.11-next.0 + +## 0.4.30 + +### Patch Changes + +- 27a5e90e97: Small updates to some paragraph components to ensure theme typography properties are inherited correctly. +- 80ce4e8c29: Small updates to some components to ensure theme typography properties are inherited correctly. +- Updated dependencies + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/plugin-stack-overflow@0.1.10 + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/theme@0.2.16 + +## 0.4.30-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/core-components@0.12.3-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-stack-overflow@0.1.10-next.2 + +## 0.4.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-stack-overflow@0.1.10-next.1 + +## 0.4.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-catalog-react@1.2.4-next.0 + - @backstage/core-components@0.12.3-next.0 + - @backstage/config@1.0.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-stack-overflow@0.1.10-next.0 + +## 0.4.29 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/plugin-catalog-react@1.2.3 + - @backstage/plugin-stack-overflow@0.1.9 + +## 0.4.28 + +### Patch Changes + +- 2e701b3796: Internal refactor to use `react-router-dom` rather than `react-router`. +- edf2404e9f: Adjusted the description's empty state on the starred entities table, +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.2.0 + - @backstage/core-components@0.12.1 + - @backstage/plugin-catalog-react@1.2.2 + - @backstage/plugin-stack-overflow@0.1.8 + - @backstage/catalog-model@1.1.4 + - @backstage/config@1.0.5 + - @backstage/theme@0.2.16 + +## 0.4.28-next.4 + +### Patch Changes + +- 2e701b3796: Internal refactor to use `react-router-dom` rather than `react-router`. +- Updated dependencies + - @backstage/core-components@0.12.1-next.4 + - @backstage/plugin-catalog-react@1.2.2-next.4 + - @backstage/plugin-stack-overflow@0.1.8-next.4 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/core-plugin-api@1.2.0-next.2 + - @backstage/theme@0.2.16 + +## 0.4.28-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.1-next.3 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/core-plugin-api@1.2.0-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.2-next.3 + - @backstage/plugin-stack-overflow@0.1.8-next.3 + +## 0.4.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.2.0-next.2 + - @backstage/core-components@0.12.1-next.2 + - @backstage/plugin-catalog-react@1.2.2-next.2 + - @backstage/plugin-stack-overflow@0.1.8-next.2 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/theme@0.2.16 + +## 0.4.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.1-next.1 + - @backstage/plugin-stack-overflow@0.1.8-next.1 + - @backstage/core-plugin-api@1.1.1-next.1 + - @backstage/plugin-catalog-react@1.2.2-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/theme@0.2.16 + +## 0.4.28-next.0 + +### Patch Changes + +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/core-components@0.12.1-next.0 + - @backstage/core-plugin-api@1.1.1-next.0 + - @backstage/plugin-stack-overflow@0.1.8-next.0 + - @backstage/plugin-catalog-react@1.2.2-next.0 + - @backstage/catalog-model@1.1.4-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/theme@0.2.16 + +## 0.4.27 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.2.1 + - @backstage/core-components@0.12.0 + - @backstage/core-plugin-api@1.1.0 + - @backstage/plugin-stack-overflow@0.1.7 + - @backstage/catalog-model@1.1.3 + - @backstage/config@1.0.4 + - @backstage/theme@0.2.16 + +## 0.4.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.0-next.1 + - @backstage/catalog-model@1.1.3-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/core-plugin-api@1.1.0-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.2.1-next.1 + - @backstage/plugin-stack-overflow@0.1.7-next.1 + +## 0.4.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.2.1-next.0 + - @backstage/core-components@0.12.0-next.0 + - @backstage/core-plugin-api@1.1.0-next.0 + - @backstage/catalog-model@1.1.3-next.0 + - @backstage/plugin-stack-overflow@0.1.7-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/theme@0.2.16 + +## 0.4.26 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.2 + - @backstage/plugin-catalog-react@1.2.0 + - @backstage/core-components@0.11.2 + - @backstage/plugin-stack-overflow@0.1.6 + - @backstage/core-plugin-api@1.0.7 + - @backstage/config@1.0.3 + - @backstage/theme@0.2.16 + +## 0.4.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.2.0-next.2 + - @backstage/catalog-model@1.1.2-next.2 + - @backstage/config@1.0.3-next.2 + - @backstage/core-components@0.11.2-next.2 + - @backstage/core-plugin-api@1.0.7-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-stack-overflow@0.1.6-next.2 + +## 0.4.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.2.0-next.1 + - @backstage/core-components@0.11.2-next.1 + - @backstage/core-plugin-api@1.0.7-next.1 + - @backstage/plugin-stack-overflow@0.1.6-next.1 + - @backstage/catalog-model@1.1.2-next.1 + - @backstage/config@1.0.3-next.1 + - @backstage/theme@0.2.16 + +## 0.4.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.2-next.0 + - @backstage/core-components@0.11.2-next.0 + - @backstage/plugin-catalog-react@1.1.5-next.0 + - @backstage/plugin-stack-overflow@0.1.6-next.0 + - @backstage/config@1.0.3-next.0 + - @backstage/core-plugin-api@1.0.7-next.0 + - @backstage/theme@0.2.16 + +## 0.4.25 + +### Patch Changes + +- 817f3196f6: Updated React Router dependencies to be peer dependencies. +- 7d47def9c4: Removed dependency on `@types/jest`. +- d669d89206: Minor API signatures cleanup +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- Updated dependencies + - @backstage/core-components@0.11.1 + - @backstage/core-plugin-api@1.0.6 + - @backstage/plugin-catalog-react@1.1.4 + - @backstage/catalog-model@1.1.1 + - @backstage/config@1.0.2 + - @backstage/plugin-stack-overflow@0.1.5 + +## 0.4.25-next.3 + +### Patch Changes + +- 7d47def9c4: Removed dependency on `@types/jest`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.1.4-next.2 + - @backstage/catalog-model@1.1.1-next.0 + - @backstage/config@1.0.2-next.0 + - @backstage/core-components@0.11.1-next.3 + - @backstage/core-plugin-api@1.0.6-next.3 + - @backstage/plugin-stack-overflow@0.1.5-next.3 + +## 0.4.25-next.2 + +### Patch Changes + +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- Updated dependencies + - @backstage/core-components@0.11.1-next.2 + - @backstage/core-plugin-api@1.0.6-next.2 + - @backstage/plugin-stack-overflow@0.1.5-next.2 + +## 0.4.25-next.1 + +### Patch Changes + +- 817f3196f6: Updated React Router dependencies to be peer dependencies. +- d669d89206: Minor API signatures cleanup +- Updated dependencies + - @backstage/core-components@0.11.1-next.1 + - @backstage/core-plugin-api@1.0.6-next.1 + - @backstage/plugin-catalog-react@1.1.4-next.1 + - @backstage/plugin-stack-overflow@0.1.5-next.1 + +## 0.4.25-next.0 + +### Patch Changes + +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.0.6-next.0 + - @backstage/core-components@0.11.1-next.0 + - @backstage/plugin-stack-overflow@0.1.5-next.0 + - @backstage/plugin-catalog-react@1.1.4-next.0 + +## 0.4.24 + +### Patch Changes + +- df7b9158b8: Add wrap-around for the listing of tools to prevent increasing width with name length. +- Updated dependencies + - @backstage/core-components@0.11.0 + - @backstage/core-plugin-api@1.0.5 + - @backstage/plugin-catalog-react@1.1.3 + - @backstage/plugin-stack-overflow@0.1.4 + +## 0.4.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.1.3-next.2 + - @backstage/core-components@0.11.0-next.2 + - @backstage/plugin-stack-overflow@0.1.4-next.1 + +## 0.4.24-next.1 + +### Patch Changes + +- df7b9158b8: Add wrap-around for the listing of tools to prevent increasing width with name length. +- Updated dependencies + - @backstage/core-components@0.10.1-next.1 + - @backstage/plugin-catalog-react@1.1.3-next.1 + +## 0.4.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.0.5-next.0 + - @backstage/plugin-catalog-react@1.1.3-next.0 + - @backstage/core-components@0.10.1-next.0 + - @backstage/plugin-stack-overflow@0.1.4-next.0 + +## 0.4.23 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. + +- 8006d0f9bf: Updated dependency `msw` to `^0.44.0`. + +- a46e317a75: Added support for customizing the time format used in the `HeaderWorldClock` component + + Here's an example of how this can be used in the `HomePage.tsx` found in `\packages\app\src\components\home` to change the clock to be in the 24hr time format: + + ```diff + +const timeFormat: Intl.DateTimeFormatOptions = { + + hour: '2-digit', + + minute: '2-digit', + + hour12: false, + +}; + + export const homePage = ( + +
} pageTitleOverride="Home"> + + +
+ + + + + + ``` + +- Updated dependencies + - @backstage/core-components@0.10.0 + - @backstage/catalog-model@1.1.0 + - @backstage/core-plugin-api@1.0.4 + - @backstage/plugin-stack-overflow@0.1.3 + - @backstage/plugin-catalog-react@1.1.2 + - @backstage/theme@0.2.16 + +## 0.4.23-next.3 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.0.4-next.0 + - @backstage/core-components@0.10.0-next.3 + - @backstage/plugin-stack-overflow@0.1.3-next.3 + - @backstage/catalog-model@1.1.0-next.3 + - @backstage/plugin-catalog-react@1.1.2-next.3 + +## 0.4.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.10.0-next.2 + - @backstage/catalog-model@1.1.0-next.2 + - @backstage/theme@0.2.16-next.1 + - @backstage/plugin-catalog-react@1.1.2-next.2 + - @backstage/plugin-stack-overflow@0.1.3-next.2 + +## 0.4.23-next.1 + +### Patch Changes + +- a46e317a75: Added support for customizing the time format used in the `HeaderWorldClock` component + + Here's an example of how this can be used in the `HomePage.tsx` found in `\packages\app\src\components\home` to change the clock to be in the 24hr time format: + + ```diff + +const timeFormat: Intl.DateTimeFormatOptions = { + + hour: '2-digit', + + minute: '2-digit', + + hour12: false, + +}; + + export const homePage = ( + +
} pageTitleOverride="Home"> + + +
+ + + + + + ``` + +- Updated dependencies + - @backstage/core-components@0.9.6-next.1 + - @backstage/catalog-model@1.1.0-next.1 + - @backstage/plugin-stack-overflow@0.1.3-next.1 + - @backstage/theme@0.2.16-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.1 + +## 0.4.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-stack-overflow@0.1.3-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## 0.4.22 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.1.1 + - @backstage/core-components@0.9.5 + - @backstage/core-plugin-api@1.0.3 + - @backstage/plugin-stack-overflow@0.1.2 + - @backstage/catalog-model@1.0.3 + +## 0.4.22-next.1 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- Updated dependencies + - @backstage/core-components@0.9.5-next.1 + - @backstage/core-plugin-api@1.0.3-next.0 + - @backstage/plugin-stack-overflow@0.1.2-next.1 + - @backstage/catalog-model@1.0.3-next.0 + - @backstage/plugin-catalog-react@1.1.1-next.1 + +## 0.4.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.1.1-next.0 + - @backstage/core-components@0.9.5-next.0 + - @backstage/plugin-stack-overflow@0.1.2-next.0 + +## 0.4.21 + +### Patch Changes + +- 2b733d9d39: star icons now have the same yellow color as the other star icons when a entity is favourite +- 69093c5f91: Display entity titles in `StarredEntities` home page card (if defined) and don't show entities which no longer exist +- Updated dependencies + - @backstage/core-components@0.9.4 + - @backstage/core-plugin-api@1.0.2 + - @backstage/plugin-catalog-react@1.1.0 + - @backstage/config@1.0.1 + - @backstage/catalog-model@1.0.2 + - @backstage/plugin-stack-overflow@0.1.1 + +## 0.4.21-next.3 + +### Patch Changes + +- 69093c5f91: Display entity titles in `StarredEntities` home page card (if defined) and don't show entities which no longer exist +- Updated dependencies + - @backstage/core-components@0.9.4-next.2 + +## 0.4.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/plugin-stack-overflow@0.1.1-next.2 + +## 0.4.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.0 + - @backstage/core-plugin-api@1.0.2-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.1 + - @backstage/plugin-stack-overflow@0.1.1-next.1 + +## 0.4.21-next.0 + +### Patch Changes + +- 2b733d9d39: star icons now have the same yellow color as the other star icons when a entity is favourite +- Updated dependencies + - @backstage/plugin-catalog-react@1.1.0-next.0 + - @backstage/plugin-stack-overflow@0.1.1-next.0 + +## 0.4.20 + +### Patch Changes + +- ab230a433f: Export template logos `TemplateBackstageLogo` and `TemplateBackstageLogoIcon` from package. + +- 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0 + +- ac323de4ad: - Adds new `HomePageStackOverflowQuestions` component which renders a list of stack overflow questions on your homepage. + + - Exports `ComponentRenderer` type. + +- 230ad0826f: Bump to using `@types/node` v16 + +- 9b58775849: Updated the dependency on `@backstage/config` to `^1.0.0`. + +- 99063c39ae: Minor API report cleanup + +- Updated dependencies + - @backstage/plugin-catalog-react@1.0.1 + - @backstage/catalog-model@1.0.1 + - @backstage/core-components@0.9.3 + - @backstage/core-plugin-api@1.0.1 + - @backstage/plugin-stack-overflow@0.1.0 + +## 0.4.20-next.3 + +### Patch Changes + +- ab230a433f: Export template logos `TemplateBackstageLogo` and `TemplateBackstageLogoIcon` from package. +- 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0 +- 230ad0826f: Bump to using `@types/node` v16 +- 9b58775849: Updated the dependency on `@backstage/config` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.9.3-next.2 + - @backstage/core-plugin-api@1.0.1-next.0 + - @backstage/plugin-catalog-react@1.0.1-next.3 + - @backstage/plugin-stack-overflow@0.1.0-next.1 + +## 0.4.20-next.2 + +### Patch Changes + +- 99063c39ae: Minor API report cleanup +- Updated dependencies + - @backstage/core-components@0.9.3-next.1 + - @backstage/plugin-catalog-react@1.0.1-next.2 + - @backstage/catalog-model@1.0.1-next.1 + +## 0.4.20-next.1 + +### Patch Changes + +- ac323de4ad: - Adds new `HomePageStackOverflowQuestions` component which renders a list of stack overflow questions on your homepage. + + - Exports `ComponentRenderer` type. + +- Updated dependencies + - @backstage/plugin-catalog-react@1.0.1-next.1 + - @backstage/plugin-stack-overflow@0.1.0-next.0 + +## 0.4.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.0.1-next.0 + - @backstage/plugin-search@0.7.5-next.0 + - @backstage/plugin-catalog-react@1.0.1-next.0 + - @backstage/core-components@0.9.3-next.0 + +## 0.4.19 + +### Patch Changes + +- a422d7ce5e: chore(deps): bump `@testing-library/react` from 11.2.6 to 12.1.3 +- Updated dependencies + - @backstage/core-components@0.9.2 + - @backstage/core-plugin-api@1.0.0 + - @backstage/plugin-catalog-react@1.0.0 + - @backstage/plugin-search@0.7.4 + - @backstage/catalog-model@1.0.0 + +## 0.4.18 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@0.9.0 + - @backstage/core-components@0.9.1 + - @backstage/catalog-model@0.13.0 + - @backstage/plugin-search@0.7.3 + +## 0.4.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@0.9.0-next.0 + - @backstage/core-components@0.9.1-next.0 + - @backstage/catalog-model@0.13.0-next.0 + - @backstage/plugin-search@0.7.3-next.0 + +## 0.4.17 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@0.12.0 + - @backstage/core-components@0.9.0 + - @backstage/plugin-search@0.7.2 + - @backstage/plugin-catalog-react@0.8.0 + - @backstage/core-plugin-api@0.8.0 + +## 0.4.16 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.10 + - @backstage/plugin-catalog-react@0.7.0 + - @backstage/catalog-model@0.11.0 + - @backstage/core-plugin-api@0.7.0 + - @backstage/plugin-search@0.7.1 + +## 0.4.15 + +### Patch Changes + +- 1ed305728b: Bump `node-fetch` to version 2.6.7 and `cross-fetch` to version 3.1.5 + +- c77c5c7eb6: Added `backstage.role` to `package.json` + +- 651b919dbb: Add Renderer support for the HomePageToolkit component. + + Previously `` would + result in the error `can't access property "map", props.tools is undefined`. + This change adds a context that can pass props down to the HomePageToolkit. + Also introduced is an `expanded` prop on the `ComponentAccordion` to setting + the default expanded state. See `In Accordian` story for details. + +- Updated dependencies + - @backstage/core-components@0.8.9 + - @backstage/core-plugin-api@0.6.1 + - @backstage/plugin-catalog-react@0.6.15 + - @backstage/plugin-search@0.7.0 + - @backstage/catalog-model@0.10.0 + - @backstage/theme@0.2.15 + +## 0.4.14 + +### Patch Changes + +- a4a777441d: Adds new StarredEntities component responsible for rendering a list of starred entities on the home page +- Updated dependencies + - @backstage/core-components@0.8.8 + - @backstage/plugin-search@0.6.2 + - @backstage/plugin-catalog-react@0.6.14 + +## 0.4.14-next.0 + +### Patch Changes + +- a4a777441d: Adds new StarredEntities component responsible for rendering a list of starred entities on the home page +- Updated dependencies + - @backstage/core-components@0.8.8-next.0 + - @backstage/plugin-search@0.6.2-next.0 + - @backstage/plugin-catalog-react@0.6.14-next.0 + +## 0.4.13 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.7 + - @backstage/plugin-search@0.6.1 + +## 0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.7-next.0 + - @backstage/plugin-search@0.6.1-next.0 + +## 0.4.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.6 + - @backstage/plugin-search@0.6.0 + +## 0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.5 + - @backstage/plugin-search@0.5.6 + - @backstage/core-plugin-api@0.6.0 + +## 0.4.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.5-next.0 + - @backstage/core-plugin-api@0.6.0-next.0 + - @backstage/plugin-search@0.5.6-next.0 + +## 0.4.10 + +### Patch Changes + +- bdf1419d20: Adds two new home components - CompanyLogo and Toolkit. +- Updated dependencies + - @backstage/core-components@0.8.4 + - @backstage/core-plugin-api@0.5.0 + - @backstage/plugin-search@0.5.5 + +## 0.4.9 + +### Patch Changes + +- 4ce51ab0f1: Internal refactor of the `react-use` imports to use `react-use/lib/*` instead. +- Updated dependencies + - @backstage/core-plugin-api@0.4.1 + - @backstage/core-components@0.8.3 + +## 0.4.8 + +### Patch Changes + +- 6d36220ef2: Fix undefined identity bug in `WelcomeTitle` caused by using deprecated methods of the IdentityApi +- Updated dependencies + - @backstage/core-plugin-api@0.4.0 + - @backstage/core-components@0.8.2 + +## 0.4.7 + +### Patch Changes + +- cd450844f6: Moved React dependencies to `peerDependencies` and allow both React v16 and v17 to be used. +- Updated dependencies + - @backstage/core-components@0.8.0 + - @backstage/core-plugin-api@0.3.0 + +## 0.4.6 + +### Patch Changes + +- a125278b81: Refactor out the deprecated path and icon from RouteRefs +- Updated dependencies + - @backstage/core-components@0.7.4 + - @backstage/core-plugin-api@0.2.0 + +## 0.4.5 + +### Patch Changes + +- 4a336fd292: Add name option to `createCardExtension` to remove deprecation warnings for extensions without name. Name will be required for extensions in a future release of `core-plugin-api` and therefore also in `createCardExtension`. +- Updated dependencies + - @backstage/core-components@0.7.3 + - @backstage/theme@0.2.13 + - @backstage/core-plugin-api@0.1.13 + +## 0.4.4 + +### Patch Changes + +- ef5bf4235a: Adds a `` component that shows a playful greeting on the home page. + To use it, pass it to the home page header: + + ```typescript + +
} pageTitleOverride="Home"> + +
+ … +
+ ``` + +- 87b2d5ad88: Fix `` to display only the selected tab, not the other way around. + +- 2435d7a49b: Added HeaderWorldClock to the Home plugin which is a copy of the HomepageTimer from core-components that has been updated to use props over static config from app-config.yaml. To use HeaderWorldClock you'll need to create an array of ClockConfig like this: + + ```ts + const clockConfigs: ClockConfig[] = [ + { + label: 'NYC', + timeZone: 'America/New_York', + }, + { + label: 'UTC', + timeZone: 'UTC', + }, + { + label: 'STO', + timeZone: 'Europe/Stockholm', + }, + { + label: 'TYO', + timeZone: 'Asia/Tokyo', + }, + ]; + ``` + + Then you can pass `clockConfigs` into the HeaderWorldClock like this: + + ```ts + +
+ +
+ ... +
+ ``` + +- Updated dependencies + - @backstage/core-components@0.7.0 + - @backstage/theme@0.2.11 + +## 0.4.3 + +### Patch Changes + +- ca0559444c: Avoid usage of `.to*Case()`, preferring `.toLocale*Case('en-US')` instead. +- 81a41ec249: Added a `name` key to all extensions in order to improve Analytics API metadata. +- Updated dependencies + - @backstage/core-components@0.6.1 + - @backstage/core-plugin-api@0.1.10 + +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@0.1.9 + - @backstage/core-components@0.6.0 + +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.5.0 + +## 0.4.0 + +### Minor Changes + +- bcf312fa52: The homepage `
` is now part of the composable canvas (allowing you to add the , for example). + + You will need to wrap your existing composed `` component in ``, `
`, and `` components, like this: + + ```diff + // app/src/components/home/HomePage.tsx + + + import { Content, Header, Page, HomePageTimer } from '@backstage/core-components'; + + export const HomePage = () => ( + + + +
+ + + +
+ + + + + + + // ... + + + +
+ ); + ``` + +### Patch Changes + +- 9f1362dcc1: Upgrade `@material-ui/lab` to `4.0.0-alpha.57`. +- 1da51fec2b: Adjust dependencies to `@types/react` and `react-router` to follow the pattern + used by all other Backstage packages. +- Updated dependencies + - @backstage/core-components@0.4.2 + - @backstage/core-plugin-api@0.1.8 + +## 0.3.0 + +### Minor Changes + +- 7f00902d9: Rename RandomJokeHomePageComponent to HomePageRandomJoke to fit convention, and update example app accordingly. + **NOTE**: If you're using the RandomJoke component in your instance, it now has to be renamed to `HomePageRandomJoke` + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.4.1 + - @backstage/core-plugin-api@0.1.7 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.4.0 + +## 0.2.0 + +### Minor Changes + +- 2b7d3455b: Create the `Home` plugin which exports some basic functionality that's used to compose a homepage. An example of a composed homepage is added to the example app. + + This change also introduces the `createCardExtension` which creates a lazy loaded card that is intended to be used for homepage components. + + Adoption of this homepage requires setup similar to what can be found in the example app. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.3.2 + - @backstage/theme@0.2.10 + +## @backstage/plugin-scaffolder-backend@3.5.0-next.1 + +### Minor Changes + +- 77bee9f: Updated the `list-scaffolder-tasks` action to support the new "status" filter parameter, allowing the action to return tasks matching a specific status. +- 07e08be: Added `always()` and `failure()` status check functions for scaffolder steps. These functions can be used in the if field of a step to control execution after failures. `always()` ensures a step runs regardless of previous step outcomes, while `failure()` runs a step only when a previous step has failed. + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + - @backstage/plugin-scaffolder-node@0.13.3-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## @backstage/backend-defaults@0.17.1-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/cli-node@0.3.2-next.1 + - @backstage/plugin-auth-node@0.7.1-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## @backstage/backend-test-utils@1.11.3-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/backend-defaults@0.17.1-next.1 + - @backstage/plugin-auth-node@0.7.1-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## @backstage/catalog-model@1.8.1-next.1 + +### Patch Changes + +- ab1cdbb: Removed a handful of internal imports that referenced the package by its own name. Value imports were switched to relative paths, and type-only imports to `import type`. These self-referential imports could trigger circular initialization errors in bundled ESM and when the package was loaded via `jest.requireActual` — most visibly `Cannot access '_AppRootElementBlueprintesm' before initialization` from `@backstage/frontend-plugin-api`. There are no user-facing API changes. + +## @backstage/cli@0.36.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/eslint-plugin@0.3.0-next.0 + - @backstage/cli-node@0.3.2-next.1 + +## @backstage/cli-module-new@0.1.3-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/cli-node@0.3.2-next.1 + +## @backstage/cli-node@0.3.2-next.1 + +### Patch Changes + +- 357d639: Fixed a bug in `PackageGraph.listChangedPackages` where removed dependencies were not detected during lockfile analysis. The dependency graph from the previous lockfile was not being merged, causing transitive dependency removals to be missed. + +## @backstage/core-plugin-api@1.12.6-next.1 + +### Patch Changes + +- ab1cdbb: Removed a handful of internal imports that referenced the package by its own name. Value imports were switched to relative paths, and type-only imports to `import type`. These self-referential imports could trigger circular initialization errors in bundled ESM and when the package was loaded via `jest.requireActual` — most visibly `Cannot access '_AppRootElementBlueprintesm' before initialization` from `@backstage/frontend-plugin-api`. There are no user-facing API changes. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.1 + +## @backstage/create-app@0.8.3-next.1 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/frontend-app-api@0.16.3-next.1 + +### Patch Changes + +- b6ca666: Invalid feature flag declarations no longer crash the app during bootstrap. They are now reported through the error collector and skipped, letting the rest of the app load normally. +- Updated dependencies + - @backstage/frontend-defaults@0.5.2-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + +## @backstage/frontend-defaults@0.5.2-next.1 + +### Patch Changes + +- 482cc59: Invalid feature flag declarations are now treated as warnings rather than errors, letting the app load normally. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/frontend-app-api@0.16.3-next.1 + - @backstage/plugin-app@0.4.6-next.1 + +## @backstage/frontend-plugin-api@0.17.0-next.1 + +### Patch Changes + +- ab1cdbb: Removed a handful of internal imports that referenced the package by its own name. Value imports were switched to relative paths, and type-only imports to `import type`. These self-referential imports could trigger circular initialization errors in bundled ESM and when the package was loaded via `jest.requireActual` — most visibly `Cannot access '_AppRootElementBlueprintesm' before initialization` from `@backstage/frontend-plugin-api`. There are no user-facing API changes. + +## @backstage/frontend-test-utils@0.5.3-next.1 + +### Patch Changes + +- fa363f9: Added support for `ExternalRouteRef` in the `mountedRoutes` option of `renderInTestApp` and `renderTestApp`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + - @backstage/frontend-app-api@0.16.3-next.1 + - @backstage/plugin-app@0.4.6-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## @backstage/plugin-api-docs@0.14.1-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- Updated dependencies + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + - @backstage/plugin-catalog-react@2.1.5-next.1 + +## @backstage/plugin-app@0.4.6-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- Updated dependencies + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + +## @backstage/plugin-app-visualizer@0.2.4-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- Updated dependencies + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + +## @backstage/plugin-auth@0.1.8-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- Updated dependencies + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + +## @backstage/plugin-auth-backend@0.28.1-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + - @backstage/plugin-auth-node@0.7.1-next.1 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.15-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/plugin-auth-node@0.7.1-next.1 + +## @backstage/plugin-auth-node@0.7.1-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + +## @backstage/plugin-catalog-backend@3.6.2-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## @backstage/plugin-catalog-backend-module-aws@0.4.23-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.12-next.1 + - @backstage/backend-defaults@0.17.1-next.1 + +## @backstage/plugin-catalog-backend-module-azure@0.3.17-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.14-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.11-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.11-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.14-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.12-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-catalog-backend-module-github@0.13.2-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.8.3-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + - @backstage/backend-defaults@0.17.1-next.1 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.12-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + - @backstage/backend-defaults@0.17.1-next.1 + - @backstage/plugin-catalog-backend@3.6.2-next.1 + +## @backstage/plugin-catalog-backend-module-ldap@0.12.5-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-catalog-backend-module-msgraph@0.9.3-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.22-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-catalog-graph@0.6.4-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- Updated dependencies + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + - @backstage/plugin-catalog-react@2.1.5-next.1 + +## @backstage/plugin-catalog-import@0.13.13-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + - @backstage/plugin-catalog-react@2.1.5-next.1 + +## @backstage/plugin-catalog-node@2.2.1-next.1 + +### Patch Changes + +- ab1cdbb: Removed a handful of internal imports that referenced the package by its own name. Value imports were switched to relative paths, and type-only imports to `import type`. These self-referential imports could trigger circular initialization errors in bundled ESM and when the package was loaded via `jest.requireActual` — most visibly `Cannot access '_AppRootElementBlueprintesm' before initialization` from `@backstage/frontend-plugin-api`. There are no user-facing API changes. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/backend-test-utils@1.11.3-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## @backstage/plugin-catalog-react@2.1.5-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- Updated dependencies + - @backstage/frontend-test-utils@0.5.3-next.1 + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## @backstage/plugin-devtools@0.1.39-next.1 + +### Patch Changes + +- b15ef55: Scheduled Tasks page now refreshes its table automatically after a task is triggered or cancelled, so the updated status is visible without reloading the browser. +- Updated dependencies + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + +## @backstage/plugin-kubernetes-common@0.9.12-next.1 + +### Patch Changes + +- ab1cdbb: Removed a handful of internal imports that referenced the package by its own name. Value imports were switched to relative paths, and type-only imports to `import type`. These self-referential imports could trigger circular initialization errors in bundled ESM and when the package was loaded via `jest.requireActual` — most visibly `Cannot access '_AppRootElementBlueprintesm' before initialization` from `@backstage/frontend-plugin-api`. There are no user-facing API changes. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## @backstage/plugin-kubernetes-node@0.4.4-next.1 + +### Patch Changes + +- ab1cdbb: Removed a handful of internal imports that referenced the package by its own name. Value imports were switched to relative paths, and type-only imports to `import type`. These self-referential imports could trigger circular initialization errors in bundled ESM and when the package was loaded via `jest.requireActual` — most visibly `Cannot access '_AppRootElementBlueprintesm' before initialization` from `@backstage/frontend-plugin-api`. There are no user-facing API changes. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.12-next.1 + +## @backstage/plugin-notifications@0.5.17-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- 03311e3: The notification description used in the notifications table is now a swappable component, so that apps can replace its rendering with a custom implementation. +- Updated dependencies + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + +## @backstage/plugin-notifications-backend@0.6.5-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/plugin-catalog-node@2.2.1-next.1 + +## @backstage/plugin-org@0.7.4-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- Updated dependencies + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + - @backstage/plugin-catalog-react@2.1.5-next.1 + +## @backstage/plugin-permission-common@0.9.9-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. + +## @backstage/plugin-scaffolder@1.36.3-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- Updated dependencies + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + - @backstage/plugin-catalog-react@2.1.5-next.1 + +## @backstage/plugin-scaffolder-node@0.13.3-next.1 + +### Patch Changes + +- 77bee9f: Added optional `status` filter to `ScaffolderService.listTasks`, allowing callers to retrieve tasks matching a specific status. +- Updated dependencies + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/backend-test-utils@1.11.3-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## @backstage/plugin-search-backend-module-elasticsearch@1.8.3-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/plugin-search-backend-node@1.4.4-next.1 + +## @backstage/plugin-search-backend-module-pg@0.5.55-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/plugin-search-backend-node@1.4.4-next.1 + +## @backstage/plugin-search-backend-node@1.4.4-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/plugin-permission-common@0.9.9-next.1 + +## @backstage/plugin-search-react@1.11.4-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + +## @backstage/plugin-signals@0.0.31-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + +## @backstage/plugin-signals-backend@0.3.15-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. + +## @backstage/plugin-techdocs@1.17.6-next.1 + +### Patch Changes + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- Updated dependencies + - @backstage/ui@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + - @backstage/plugin-catalog-react@2.1.5-next.1 + - @backstage/plugin-search-react@1.11.4-next.1 + +## example-backend@0.0.50-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@3.5.0-next.1 + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/backend-defaults@0.17.1-next.1 + - @backstage/plugin-auth-backend@0.28.1-next.1 + - @backstage/plugin-auth-node@0.7.1-next.1 + - @backstage/plugin-catalog-backend@3.6.2-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.14-next.1 + - @backstage/plugin-notifications-backend@0.6.5-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.8.3-next.1 + - @backstage/plugin-search-backend-node@1.4.4-next.1 + - @backstage/plugin-signals-backend@0.3.15-next.1 diff --git a/docs/releases/v1.51.0-next.2-changelog.md b/docs/releases/v1.51.0-next.2-changelog.md new file mode 100644 index 0000000000..71d9b60a4f --- /dev/null +++ b/docs/releases/v1.51.0-next.2-changelog.md @@ -0,0 +1,1656 @@ +# Release v1.51.0-next.2 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.51.0-next.2](https://backstage.github.io/upgrade-helper/?to=1.51.0-next.2) + +## @techdocs/cli@1.11.0-next.1 + +### Minor Changes + +- 329f592: Add support for disabling external font downloads via techdocs-cli `techdocs-cli generate --disableExternalFonts`, useful for air-gapped Backstage instances. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.15.0-next.1 + +## @backstage/plugin-catalog-backend-module-msgraph-incremental@0.1.0-next.0 + +### Minor Changes + +- f1279ea: Introduces a cursor-based incremental ingestion provider for Microsoft Graph that processes users and groups one page at a time. Unlike `MicrosoftGraphOrgEntityProvider`, this module never holds the full dataset in memory — each burst processes a single page (up to 999 users or 100 groups). The `@odata.nextLink` cursor is persisted so a pod restart resumes from the last completed page rather than starting over. + +## @backstage/plugin-catalog-unprocessed-entities@0.2.31-next.0 + +# @backstage/plugin-catalog-unprocessed-entities + +## 0.2.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/core-compat-api@0.5.11-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.15-next.0 + +## 0.2.29 + +### Patch Changes + +- 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`: + + ```yaml + app: + extensions: + - page:catalog-unprocessed-entities + ``` + +- Updated dependencies + - @backstage/ui@0.14.0 + - @backstage/errors@1.3.0 + - @backstage/frontend-plugin-api@0.16.0 + - @backstage/core-components@0.18.9 + - @backstage/core-compat-api@0.5.10 + - @backstage/core-plugin-api@1.12.5 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.14 + +## 0.2.29-next.2 + +### Patch Changes + +- 482ceed: Migrated from `assertError` to `toError` for error handling. +- Updated dependencies + - @backstage/ui@0.14.0-next.2 + - @backstage/errors@1.3.0-next.0 + - @backstage/core-components@0.18.9-next.1 + - @backstage/core-compat-api@0.5.10-next.2 + - @backstage/core-plugin-api@1.12.5-next.2 + - @backstage/frontend-plugin-api@0.16.0-next.2 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.14-next.0 + +## 0.2.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.14.0-next.1 + - @backstage/frontend-plugin-api@0.16.0-next.1 + - @backstage/core-compat-api@0.5.10-next.1 + - @backstage/core-components@0.18.9-next.0 + - @backstage/core-plugin-api@1.12.5-next.1 + +## 0.2.29-next.0 + +### Patch Changes + +- 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`: + + ```yaml + app: + extensions: + - page:catalog-unprocessed-entities + ``` + +- Updated dependencies + - @backstage/ui@0.14.0-next.0 + - @backstage/core-components@0.18.9-next.0 + - @backstage/frontend-plugin-api@0.15.2-next.0 + - @backstage/core-compat-api@0.5.10-next.0 + - @backstage/core-plugin-api@1.12.5-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.13 + +## 0.2.27 + +### Patch Changes + +- 538c985: Updated installation documentation to use feature discovery as the default. +- aa29b50: New frontend system pages now use the default plugin header together with `HeaderPage` instead of the legacy core page header pattern. +- 3f36ce1: Updated alpha plugin icons to follow the new frontend icon sizing rules when rendered in plugin and navigation surfaces. +- f4a1edd: Removed the deprecated `DevToolsContentBlueprint` from `@backstage/plugin-devtools-react`. DevTools pages in the new frontend system now use `SubPageBlueprint` tabs instead, and the catalog unprocessed entities alpha extension now attaches to DevTools as a subpage. +- Updated dependencies + - @backstage/ui@0.13.0 + - @backstage/core-compat-api@0.5.9 + - @backstage/core-plugin-api@1.12.4 + - @backstage/core-components@0.18.8 + - @backstage/frontend-plugin-api@0.15.0 + +## 0.2.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.5.9-next.2 + - @backstage/frontend-plugin-api@0.15.0-next.1 + - @backstage/core-plugin-api@1.12.4-next.1 + - @backstage/core-components@0.18.8-next.1 + - @backstage/plugin-devtools-react@0.1.2-next.1 + +## 0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.13 + - @backstage/plugin-devtools-react@0.1.2-next.0 + +## 0.2.26 + +### Patch Changes + +- 018ca87: Added `title` and `icon` to the plugin definition for the new frontend system. +- a7e0d50: Updated `react-router-dom` peer dependency to `^6.30.2` and explicitly disabled v7 future flags to suppress deprecation warnings. +- Updated dependencies + - @backstage/core-components@0.18.7 + - @backstage/core-compat-api@0.5.8 + - @backstage/frontend-plugin-api@0.14.0 + - @backstage/plugin-devtools-react@0.1.1 + - @backstage/core-plugin-api@1.12.3 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.13 + +## 0.2.26-next.1 + +### Patch Changes + +- a7e0d50: Prepare for React Router v7 migration by updating to v6.30.2 across all NFS packages and enabling v7 future flags. Convert routes from splat paths to parent/child structure with Outlet components. +- Updated dependencies + - @backstage/plugin-devtools-react@0.1.1-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-compat-api@0.5.8-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## 0.2.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/core-compat-api@0.5.7-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.13-next.0 + - @backstage/plugin-devtools-react@0.1.1-next.0 + +## 0.2.25 + +### Patch Changes + +- be6cef5: Add support for adding `unprocessed-entities` and other tabs to `devtools` when using the New Frontend system +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-devtools-react@0.1.0 + - @backstage/core-compat-api@0.5.6 + +## 0.2.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## 0.2.24 + +### Patch Changes + +- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system. + +- df4d646: Moved types, API and client to the common package, allowing both frontend and + backend plugins to use the `CatalogUnprocessedEntitiesClient`. + + The following types, clients and interfaces have been deprecated and should be + imported from the `@backstage/plugin-catalog-unprocessed-entities-common` instead: + `CatalogUnprocessedEntitiesApi`, `CatalogUnprocessedEntitiesApiResponse`, `UnprocessedEntity`, + `UnprocessedEntityCache`, `UnprocessedEntityError`, `CatalogUnprocessedEntitiesClient`. + + All those types, clients and interfaces are re-exported temporarily in the + `@backstage/plugin-catalog-unprocessed-entities` package until cleaned up. + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2 + - @backstage/core-components@0.18.4 + - @backstage/core-plugin-api@1.12.1 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.12 + +## 0.2.24-next.1 + +### Patch Changes + +- df4d646: Moved types, API and client to the common package, allowing both frontend and + backend plugins to use the `CatalogUnprocessedEntitiesClient`. + + The following types, clients and interfaces have been deprecated and should be + imported from the `@backstage/plugin-catalog-unprocessed-entities-common` instead: + `CatalogUnprocessedEntitiesApi`, `CatalogUnprocessedEntitiesApiResponse`, `UnprocessedEntity`, + `UnprocessedEntityCache`, `UnprocessedEntityError`, `CatalogUnprocessedEntitiesClient`. + + All those types, clients and interfaces are re-exported temporarily in the + `@backstage/plugin-catalog-unprocessed-entities` package until cleaned up. + +- Updated dependencies + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.12-next.0 + +## 0.2.24-next.0 + +### Patch Changes + +- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.0 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/core-components@0.18.4-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## 0.2.23 + +### Patch Changes + +- 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 + - @backstage/frontend-plugin-api@0.13.0 + - @backstage/core-compat-api@0.5.4 + - @backstage/core-components@0.18.3 + - @backstage/core-plugin-api@1.12.0 + - @backstage/catalog-model@1.7.6 + +## 0.2.23-next.0 + +### Patch Changes + +- 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 + - @backstage/core-plugin-api@1.11.2-next.0 + - @backstage/core-components@0.18.3-next.0 + - @backstage/catalog-model@1.7.6-next.0 + - @backstage/frontend-plugin-api@0.12.2-next.0 + - @backstage/core-compat-api@0.5.4-next.0 + - @backstage/errors@1.2.7 + +## 0.2.22 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2 + - @backstage/frontend-plugin-api@0.12.1 + - @backstage/core-compat-api@0.5.3 + - @backstage/core-plugin-api@1.11.1 + +## 0.2.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + +## 0.2.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + +## 0.2.21 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.12.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/core-components@0.18.0 + - @backstage/core-compat-api@0.5.2 + +## 0.2.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.11.1-next.0 + - @backstage/core-components@0.17.6-next.0 + - @backstage/core-compat-api@0.5.2-next.1 + +## 0.2.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.5.2-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-components@0.17.5 + - @backstage/core-plugin-api@1.10.9 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.11.0 + +## 0.2.20 + +### Patch Changes + +- e4ddf22: Internal update to align with new blueprint parameter naming in the new frontend system. +- f2f133c: Internal update to use the new variant of `ApiBlueprint`. +- Updated dependencies + - @backstage/core-components@0.17.5 + - @backstage/frontend-plugin-api@0.11.0 + - @backstage/core-compat-api@0.5.0 + +## 0.2.20-next.2 + +### Patch Changes + +- e4ddf22: Internal update to align with new blueprint parameter naming in the new frontend system. +- Updated dependencies + - @backstage/frontend-plugin-api@0.11.0-next.1 + - @backstage/core-compat-api@0.5.0-next.2 + - @backstage/core-components@0.17.5-next.1 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.10.9 + - @backstage/errors@1.2.7 + +## 0.2.20-next.1 + +### Patch Changes + +- f2f133c: Internal update to use the new variant of `ApiBlueprint`. +- Updated dependencies + - @backstage/core-compat-api@0.4.5-next.1 + - @backstage/frontend-plugin-api@0.11.0-next.0 + - @backstage/core-components@0.17.5-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.10.9 + - @backstage/errors@1.2.7 + +## 0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.4.5-next.0 + - @backstage/frontend-plugin-api@0.10.4 + +## 0.2.19 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.5 + - @backstage/core-components@0.17.4 + - @backstage/core-plugin-api@1.10.9 + - @backstage/core-compat-api@0.4.4 + - @backstage/frontend-plugin-api@0.10.4 + +## 0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.5-next.0 + - @backstage/core-components@0.17.4-next.1 + - @backstage/core-plugin-api@1.10.9-next.0 + - @backstage/core-compat-api@0.4.4-next.1 + - @backstage/frontend-plugin-api@0.10.4-next.1 + +## 0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.4-next.0 + - @backstage/catalog-model@1.7.4 + - @backstage/core-compat-api@0.4.4-next.0 + - @backstage/core-plugin-api@1.10.8 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.4-next.0 + +## 0.2.18 + +### Patch Changes + +- 18c64e9: Added the `info.packageJson` option to the plugin instance for the new frontend system. +- Updated dependencies + - @backstage/core-components@0.17.3 + - @backstage/core-plugin-api@1.10.8 + - @backstage/frontend-plugin-api@0.10.3 + - @backstage/catalog-model@1.7.4 + - @backstage/core-compat-api@0.4.3 + - @backstage/errors@1.2.7 + +## 0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.3-next.0 + - @backstage/frontend-plugin-api@0.10.3-next.1 + - @backstage/catalog-model@1.7.4 + - @backstage/core-compat-api@0.4.3-next.2 + - @backstage/core-plugin-api@1.10.7 + - @backstage/errors@1.2.7 + +## 0.2.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.4 + - @backstage/core-compat-api@0.4.3-next.1 + - @backstage/core-components@0.17.2 + - @backstage/core-plugin-api@1.10.7 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.3-next.0 + +## 0.2.18-next.0 + +### Patch Changes + +- 18c64e9: Added the `info.packageJson` option to the plugin instance for the new frontend system. +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.3-next.0 + - @backstage/core-compat-api@0.4.3-next.0 + +## 0.2.17 + +### Patch Changes + +- fb58f20: Internal update to use the new `pluginId` option of `createFrontendPlugin`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.2 + - @backstage/core-components@0.17.2 + - @backstage/catalog-model@1.7.4 + - @backstage/core-compat-api@0.4.2 + - @backstage/core-plugin-api@1.10.7 + - @backstage/errors@1.2.7 + +## 0.2.17-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.4.2-next.3 + - @backstage/core-components@0.17.2-next.1 + - @backstage/core-plugin-api@1.10.7-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.2-next.1 + +## 0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.7-next.0 + - @backstage/core-compat-api@0.4.2-next.2 + - @backstage/core-components@0.17.2-next.1 + - @backstage/frontend-plugin-api@0.10.2-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.17-next.1 + +### Patch Changes + +- fb58f20: Internal update to use the new `pluginId` option of `createFrontendPlugin`. +- Updated dependencies + - @backstage/core-components@0.17.2-next.0 + - @backstage/frontend-plugin-api@0.10.2-next.0 + - @backstage/core-compat-api@0.4.2-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.6 + - @backstage/errors@1.2.7 + +## 0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.4.2-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.1 + - @backstage/core-plugin-api@1.10.6 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.1 + +## 0.2.16 + +### Patch Changes + +- ba88bfa: Added confirmation popup for delete entities in Catalog Unprocessed Entities plugin + +- a47fd39: Removes instances of default React imports, a necessary update for the upcoming React 19 migration. + + + +- 2479827: Fixed the `convertTimeToLocalTimezone` function in the FailedEntities component to correctly parse ISO 8601 date strings and set the timezone to the current local timezone. + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1 + - @backstage/core-compat-api@0.4.1 + - @backstage/core-components@0.17.1 + - @backstage/core-plugin-api@1.10.6 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.16-next.2 + +### Patch Changes + +- a47fd39: Removes instances of default React imports, a necessary update for the upcoming React 19 migration. + + + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.1-next.1 + - @backstage/core-compat-api@0.4.1-next.2 + - @backstage/core-components@0.17.1-next.1 + - @backstage/core-plugin-api@1.10.6-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.1-next.0 + - @backstage/frontend-plugin-api@0.10.1-next.0 + - @backstage/core-compat-api@0.4.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + +## 0.2.16-next.0 + +### Patch Changes + +- ba88bfa: Added confirmation popup for delete entities in Catalog Unprocessed Entities plugin +- 2479827: Fixed the `convertTimeToLocalTimezone` function in the FailedEntities component to correctly parse ISO 8601 date strings and set the timezone to the current local timezone. +- Updated dependencies + - @backstage/core-compat-api@0.4.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.10.0 + +## 0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.0 + - @backstage/core-plugin-api@1.10.5 + - @backstage/frontend-plugin-api@0.10.0 + - @backstage/core-compat-api@0.4.0 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.10.0-next.2 + - @backstage/core-compat-api@0.4.0-next.2 + - @backstage/core-components@0.16.5-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.4 + - @backstage/errors@1.2.7 + +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.5-next.0 + - @backstage/core-compat-api@0.3.7-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.4 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.9.6-next.1 + +## 0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.9.6-next.0 + - @backstage/core-compat-api@0.3.7-next.0 + +## 0.2.14 + +### Patch Changes + +- e09d3e8: Added alpha support for the New Frontend System +- 58ec9e7: Removed older versions of React packages as a preparatory step for upgrading to React 19. This commit does not introduce any functional changes, but removes dependencies on previous React versions, allowing for a cleaner upgrade path in subsequent commits. +- Updated dependencies + - @backstage/core-components@0.16.4 + - @backstage/frontend-plugin-api@0.9.5 + - @backstage/core-compat-api@0.3.6 + - @backstage/core-plugin-api@1.10.4 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.4-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/core-plugin-api@1.10.4-next.0 + - @backstage/errors@1.2.7 + +## 0.2.14-next.0 + +### Patch Changes + +- 58ec9e7: Removed older versions of React packages as a preparatory step for upgrading to React 19. This commit does not introduce any functional changes, but removes dependencies on previous React versions, allowing for a cleaner upgrade path in subsequent commits. +- Updated dependencies + - @backstage/core-components@0.16.4-next.0 + - @backstage/core-plugin-api@1.10.4-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.13 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3 + - @backstage/core-components@0.16.3 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + +## 0.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/core-plugin-api@1.10.2 + +## 0.2.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/core-components@0.16.2-next.2 + - @backstage/core-plugin-api@1.10.2-next.0 + +## 0.2.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.2-next.1 + - @backstage/catalog-model@1.7.1 + - @backstage/core-plugin-api@1.10.1 + - @backstage/errors@1.2.5 + +## 0.2.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.1 + - @backstage/core-components@0.16.2-next.0 + - @backstage/core-plugin-api@1.10.1 + - @backstage/errors@1.2.5 + +## 0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.0 + - @backstage/catalog-model@1.7.1 + - @backstage/core-plugin-api@1.10.1 + - @backstage/errors@1.2.5 + +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.0-next.2 + - @backstage/catalog-model@1.7.0 + - @backstage/core-plugin-api@1.10.0 + - @backstage/errors@1.2.4 + +## 0.2.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.0 + - @backstage/core-components@0.16.0-next.1 + - @backstage/core-plugin-api@1.10.0 + - @backstage/errors@1.2.4 + +## 0.2.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.16.0-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/core-plugin-api@1.10.0 + - @backstage/errors@1.2.4 + +## 0.2.9 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1 + - @backstage/core-plugin-api@1.10.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + +## 0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.0 + - @backstage/core-components@0.15.1-next.2 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/errors@1.2.4 + +## 0.2.9-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.0 + - @backstage/core-plugin-api@1.10.0-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + +## 0.2.8 + +### Patch Changes + +- 836127c: Updated dependency `@testing-library/react` to `^16.0.0`. + +- 4f08c85: Show additional info on DevTools unprocessed entities table + + - Location path (so that it's easier to search the failed entity from the YAML URL) + - Time info of last discovery and next refresh time so that users can be aware of it and can sort the errors based on the time. + +- Updated dependencies + - @backstage/core-components@0.15.0 + - @backstage/catalog-model@1.7.0 + - @backstage/core-plugin-api@1.9.4 + - @backstage/errors@1.2.4 + +## 0.2.8-next.1 + +### Patch Changes + +- 836127c: Updated dependency `@testing-library/react` to `^16.0.0`. +- Updated dependencies + - @backstage/core-components@0.14.11-next.1 + - @backstage/core-plugin-api@1.9.4-next.0 + - @backstage/catalog-model@1.6.0 + - @backstage/errors@1.2.4 + +## 0.2.8-next.0 + +### Patch Changes + +- 4f08c85: Show additional info on DevTools unprocessed entities table + + - Location path (so that it's easier to search the failed entity from the YAML URL) + - Time info of last discovery and next refresh time so that users can be aware of it and can sort the errors based on the time. + +- Updated dependencies + - @backstage/core-components@0.14.11-next.0 + - @backstage/catalog-model@1.6.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/errors@1.2.4 + +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.10 + - @backstage/catalog-model@1.6.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/errors@1.2.4 + +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.6.0-next.0 + - @backstage/core-components@0.14.10-next.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/errors@1.2.4 + +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.10-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/errors@1.2.4 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.9 + - @backstage/catalog-model@1.5.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/errors@1.2.4 + +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.9-next.1 + +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.9-next.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + +## 0.2.5 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/core-components@0.14.8 + - @backstage/core-plugin-api@1.9.3 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + +## 0.2.5-next.2 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/core-components@0.14.8-next.2 + - @backstage/catalog-model@1.5.0 + - @backstage/core-plugin-api@1.9.3-next.0 + - @backstage/errors@1.2.4 + +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.8-next.1 + - @backstage/core-plugin-api@1.9.3-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.8-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/core-plugin-api@1.9.2 + - @backstage/errors@1.2.4 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.7 + - @backstage/catalog-model@1.5.0 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.5.0-next.0 + - @backstage/core-components@0.14.5-next.0 + - @backstage/core-plugin-api@1.9.2 + - @backstage/errors@1.2.4 + +## 0.2.3 + +### Patch Changes + +- abfbcfc: Updated dependency `@testing-library/react` to `^15.0.0`. +- Updated dependencies + - @backstage/core-components@0.14.4 + - @backstage/core-plugin-api@1.9.2 + - @backstage/catalog-model@1.4.5 + - @backstage/errors@1.2.4 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.4-next.0 + - @backstage/catalog-model@1.4.5 + - @backstage/core-plugin-api@1.9.1 + - @backstage/errors@1.2.4 + +## 0.2.2 + +### Patch Changes + +- e8f026a: Use ESM exports of react-use library +- Updated dependencies + - @backstage/core-components@0.14.3 + - @backstage/core-plugin-api@1.9.1 + - @backstage/catalog-model@1.4.5 + - @backstage/errors@1.2.4 + +## 0.2.1 + +### Patch Changes + +- e8f026a: Use ESM exports of react-use library +- Updated dependencies + - @backstage/core-components@0.14.2 + - @backstage/core-plugin-api@1.9.1 + - @backstage/catalog-model@1.4.5 + - @backstage/errors@1.2.4 + +## 0.2.0 + +### Minor Changes + +- 924c1ac: **BREAKING**- the `@backstage/plugin-catalog-backend-module-unprocessed` constructor is now private, and have been moved to using the static `.create` method instead which now requires a `PermissionService` and `DiscoveryService`. + + If you're using this module in the old backend system you'll need to migrate to using the `.create` method and pass in the new required parameters in `packages/backend/src/plugins/catalog.ts`. + + No changes should be required if you're using the new backend system. + + ```diff + - const unprocessed = new UnprocessedEntitiesModule( + - await env.database.getClient(), + - router, + - ); + + const unprocessed = UnprocessedEntitiesModule.create({ + + database: await env.database.getClient(), + + router, + + permissions: env.permissions, + + discovery: env.discovery, + + }); + + unprocessed.registerRoutes(); + ``` + + Adds the ability to delete an unprocessed entity from the `refresh_state` table. This change requires enabling permissions for your Backstage instance. + +### Patch Changes + +- 2b397fe: Added the `no-top-level-material-ui-4-imports` ESLint rule to aid with the migration to Material UI v5 +- Updated dependencies + - @backstage/core-components@0.14.1 + - @backstage/errors@1.2.4 + - @backstage/catalog-model@1.4.5 + - @backstage/core-plugin-api@1.9.1 + +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.1-next.2 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/core-plugin-api@1.9.1-next.1 + - @backstage/errors@1.2.4-next.0 + +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.1-next.1 + - @backstage/core-plugin-api@1.9.1-next.1 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/errors@1.2.4-next.0 + +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.4-next.0 + - @backstage/core-components@0.14.1-next.0 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/core-plugin-api@1.9.1-next.0 + +## 0.1.8 + +### Patch Changes + +- 9aac2b0: Use `--cwd` as the first `yarn` argument +- 8fe56a8: Widen `@types/react` dependency range to include version 18. +- Updated dependencies + - @backstage/core-components@0.14.0 + - @backstage/catalog-model@1.4.4 + - @backstage/core-plugin-api@1.9.0 + - @backstage/errors@1.2.3 + +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.0-next.2 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/core-plugin-api@1.9.0-next.1 + - @backstage/errors@1.2.3 + +## 0.1.8-next.1 + +### Patch Changes + +- 9aac2b0: Use `--cwd` as the first `yarn` argument +- 8fe56a8: Widen `@types/react` dependency range to include version 18. +- Updated dependencies + - @backstage/core-components@0.14.0-next.1 + - @backstage/core-plugin-api@1.9.0-next.1 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/errors@1.2.3 + +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.0-next.0 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/core-plugin-api@1.8.3-next.0 + - @backstage/errors@1.2.3 + +## 0.1.7 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10 + - @backstage/core-plugin-api@1.8.2 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2-next.0 + - @backstage/core-components@0.13.10-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.1.7-next.0 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/core-components@0.13.10-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/core-plugin-api@1.8.1 + - @backstage/errors@1.2.3 + +## 0.1.6 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.1 + - @backstage/core-components@0.13.9 + - @backstage/theme@0.5.0 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.1.6-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.9-next.3 + - @backstage/catalog-model@1.4.3 + - @backstage/core-plugin-api@1.8.1-next.1 + - @backstage/errors@1.2.3 + - @backstage/theme@0.5.0-next.1 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.5.0-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/core-components@0.13.9-next.2 + - @backstage/core-plugin-api@1.8.1-next.1 + - @backstage/errors@1.2.3 + +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.9-next.1 + - @backstage/core-plugin-api@1.8.1-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/theme@0.5.0-next.0 + +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.1-next.0 + - @backstage/core-components@0.13.9-next.0 + - @backstage/theme@0.5.0-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.1.5 + +### Patch Changes + +- 6c2b872153: Add official support for React 18. +- a11cdb9200: Added filtering and sorting to unprocessed entities tables. +- Updated dependencies + - @backstage/core-components@0.13.8 + - @backstage/core-plugin-api@1.8.0 + - @backstage/theme@0.4.4 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.1.5-next.2 + +### Patch Changes + +- [#20998](https://github.com/backstage/backstage/pull/20998) [`a11cdb9200`](https://github.com/backstage/backstage/commit/a11cdb9200077312ca92ed85b159527226574c08) Thanks [@alde](https://github.com/alde)! - Added filtering and sorting to unprocessed entities tables. + +- Updated dependencies + - @backstage/core-components@0.13.8-next.2 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.8-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/core-plugin-api@1.8.0-next.0 + - @backstage/errors@1.2.3 + - @backstage/theme@0.4.4-next.0 + +## 0.1.5-next.0 + +### Patch Changes + +- 6c2b872153: Add official support for React 18. +- Updated dependencies + - @backstage/core-components@0.13.7-next.0 + - @backstage/core-plugin-api@1.8.0-next.0 + - @backstage/theme@0.4.4-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + +## 0.1.4 + +### Patch Changes + +- 9a1fce352e: Updated dependency `@testing-library/jest-dom` to `^6.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.7.0 + - @backstage/core-components@0.13.6 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/theme@0.4.3 + +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.6-next.2 + - @backstage/core-plugin-api@1.7.0-next.1 + - @backstage/catalog-model@1.4.3-next.0 + - @backstage/errors@1.2.3-next.0 + - @backstage/theme@0.4.3-next.0 + +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.6-next.1 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.3 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5 + - @backstage/catalog-model@1.4.2 + - @backstage/core-plugin-api@1.6.0 + - @backstage/errors@1.2.2 + - @backstage/theme@0.4.2 + +## 0.1.3-next.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/catalog-model@1.4.2-next.2 + - @backstage/core-components@0.13.5-next.3 + - @backstage/core-plugin-api@1.6.0-next.3 + - @backstage/errors@1.2.2-next.0 + - @backstage/theme@0.4.2-next.0 + +## 0.1.3-next.2 + +### Patch Changes + +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-components@0.13.5-next.2 + - @backstage/core-plugin-api@1.6.0-next.2 + - @backstage/catalog-model@1.4.2-next.1 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + +## 0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.5-next.1 + - @backstage/catalog-model@1.4.2-next.0 + - @backstage/core-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + +## 0.1.3-next.0 + +### Patch Changes + +- 482bb5c0bbf8: Moved `@types/react` to be a regular dependency +- Updated dependencies + - @backstage/core-plugin-api@1.6.0-next.0 + - @backstage/core-components@0.13.5-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.4 + - @backstage/core-plugin-api@1.5.3 + - @backstage/catalog-model@1.4.1 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/catalog-model@1.4.1 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + +## 0.1.1 + +### Patch Changes + +- 2c4869473155: The Catalog Unprocessed Entities plugin can now be integrated as a tab within the DevTools plugin + + - Added an export for `UnprocessedEntitiesContent` + - Updated the `README` with images of the features + - Adjusted the styles to fill in the available space + - Set the table page size to 20 as 40 was causing errors in the browser console + +- 57585d89f926: Export some types and API items. This allows people to call the API from different places with the ApiRef, as well + as completely customize the client if required. Check the [README.md](https://github.com/backstage/backstage/blob/master/plugins/catalog-unprocessed-entities/README.md) to + note what needs to be added in order to use the new `catalogUnprocessedEntitiesApiRef` exported function. + +- a8fa79ccc105: Fix and improve documentation for the unprocessed entities modules. + +- 267396f45bd0: Corrected the installation instructions. + +- 7a9c8a9cd0ce: Fixed spacing for success message + +- e6f50426333b: update some peer dependencies to silence yarn install + +- 77b408fad872: install command points to correct package name + +- Updated dependencies + - @backstage/theme@0.4.1 + - @backstage/errors@1.2.1 + - @backstage/core-components@0.13.3 + - @backstage/core-plugin-api@1.5.3 + - @backstage/catalog-model@1.4.1 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.4.1-next.1 + - @backstage/core-plugin-api@1.5.3-next.1 + - @backstage/core-components@0.13.3-next.2 + - @backstage/catalog-model@1.4.1-next.0 + - @backstage/errors@1.2.1-next.0 + +## 0.1.1-next.1 + +### Patch Changes + +- 267396f45bd0: Corrected the installation instructions. +- 7a9c8a9cd0ce: Fixed spacing for success message +- 77b408fad872: install command points to correct package name +- Updated dependencies + - @backstage/theme@0.4.1-next.0 + - @backstage/core-components@0.13.3-next.1 + - @backstage/core-plugin-api@1.5.3-next.0 + +## 0.1.1-next.0 + +### Patch Changes + +- 2c4869473155: The Catalog Unprocessed Entities plugin can now be integrated as a tab within the DevTools plugin + + - Added an export for `UnprocessedEntitiesContent` + - Updated the `README` with images of the features + - Adjusted the styles to fill in the available space + - Set the table page size to 20 as 40 was causing errors in the browser console + +- 57585d89f926: Export some types and API items. This allows people to call the API from different places with the ApiRef, as well + as completely customize the client if required. Check the [README.md](https://github.com/backstage/backstage/blob/master/plugins/catalog-unprocessed-entities/README.md) to + note what needs to be added in order to use the new `catalogUnprocessedEntitiesApiRef` exported function. + +- a8fa79ccc105: Fix and improve documentation for the unprocessed entities modules. + +- Updated dependencies + - @backstage/errors@1.2.1-next.0 + - @backstage/core-components@0.13.3-next.0 + - @backstage/catalog-model@1.4.1-next.0 + - @backstage/core-plugin-api@1.5.2 + - @backstage/theme@0.4.0 + +## 0.1.0 + +### Minor Changes + +- d44fcd9829c2: Added a new plugin to expose entities which are unprocessed or have errors processing + +### Patch Changes + +- 493eab8c577f: Use FetchApi instead of native fetch +- Updated dependencies + - @backstage/core-plugin-api@1.5.2 + - @backstage/core-components@0.13.2 + - @backstage/theme@0.4.0 + - @backstage/catalog-model@1.4.0 + - @backstage/errors@1.2.0 + +## 0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.2-next.3 + - @backstage/catalog-model@1.4.0-next.1 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/errors@1.2.0-next.0 + - @backstage/theme@0.4.0-next.1 + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.4.0-next.1 + - @backstage/core-components@0.13.2-next.2 + - @backstage/core-plugin-api@1.5.2-next.0 + +## 0.1.0-next.0 + +### Minor Changes + +- d44fcd9829c2: Added a new plugin to expose entities which are unprocessed or have errors processing + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/core-components@0.13.2-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/theme@0.4.0-next.0 + +## @backstage/plugin-techdocs-backend@2.2.0-next.1 + +### Minor Changes + +- 5ef8d16: Add support for disabling external font downloads via app-config option `techdocs.generator.mkdocs.disableExternalFonts`, useful for air-gapped Backstage instances. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.2-next.1 + - @backstage/plugin-techdocs-node@1.15.0-next.1 + +## @backstage/plugin-techdocs-node@1.15.0-next.1 + +### Minor Changes + +- 5ef8d16: Add support for disabling external font downloads via app-config option `techdocs.generator.mkdocs.disableExternalFonts`, useful for air-gapped Backstage instances. + +### Patch Changes + +- 6ce8462: Fixed bug causing `--legacyCopyReadmeMdToIndexMd` option to fail if docs directory is not present +- Updated dependencies + - @backstage/integration@2.0.2-next.1 + +## @backstage/core-components@0.18.10-next.1 + +### Patch Changes + +- 021b368: Added stable DOM markers to the legacy Page and Header so adjacent layout components can coordinate spacing without relying on generated class names. + +## @backstage/create-app@0.8.3-next.2 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/integration@2.0.2-next.1 + +### Patch Changes + +- 6b112d3: Fixed two issues in the GitLab integration's fetch behavior: + + - The internal fetch wrapper was passing `mode: 'same-origin'` on every request. This had no practical effect server-side, but would have caused cross-origin requests to be rejected when the integration is used from a browser. Requests now use the default fetch mode and work correctly in both browser and Node environments. + - When retries are configured, transient network errors (such as dropped connections or DNS hiccups) are now retried using the same `maxRetries` and exponential delay as retryable HTTP status codes. Previously, a thrown fetch error would propagate immediately on the first failure regardless of the retry configuration. Caller-initiated aborts continue to surface immediately without being retried. + +## @backstage/ui@0.15.0-next.2 + +### Patch Changes + +- 37535b2: 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. + +- 5b85902: Fix `Card href=...` not showing a focus indicator on keyboard navigation. `Link` now composes `useFocusRing`, emits `data-focus-visible`, and renders a `--bui-ring` outline when keyboard-focused. The Card's existing focus-ring CSS matches when the trigger is focused. + + _Affected components_: Card, Link + +- 38bb056: Adjusted PluginHeader spacing and borders so headers with and without tabs align more consistently with surrounding page content, including when paired with page headers. + + **Affected components:** PluginHeader, Header + +- 25909ba: Added `searchDebounceMs` and `filterDebounceMs` options to `useTable` in `complete` mode. Both default to `0` (no debounce, no observable change for existing consumers); set them to defer the client-side filter/search/sort pipeline on large datasets without reimplementing input-layer debouncing. The controlled `search` / `onSearchChange` and `filter` / `onFilterChange` callbacks continue to fire on every change. + + **Affected components:** Table + +- ddca41f: Added a new `Combobox` component. It pairs a text input with a filterable dropdown of options and supports single selection, sectioned options, icons, sizes, and custom typed values via `allowsCustomValue`. + + **Affected components:** Combobox + +## @backstage/plugin-catalog-backend-module-unprocessed@0.6.12-next.1 + +### Patch Changes + +- fa06df6: Added permission authorization checks to the unprocessed entities read endpoints for pending and failed entities. +- Updated dependencies + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.16-next.1 + +## @backstage/plugin-catalog-unprocessed-entities-common@0.0.16-next.1 + +### Patch Changes + +- fa06df6: Added `unprocessedEntitiesReadPermission` for authorizing read access to unprocessed entity endpoints. + +## @backstage/plugin-devtools@0.1.39-next.2 + +### Patch Changes + +- 08c922e: Migrated `ConfigContent` component from Material UI to Backstage UI (BUI). +- Updated dependencies + - @backstage/ui@0.15.0-next.2 + - @backstage/core-components@0.18.10-next.1 + +## @backstage/plugin-search-backend@2.1.2-next.1 + +### Patch Changes + +- 303954b: Added action for search backend to query search engine using the actions registry + +## @backstage/plugin-search-backend-module-techdocs@0.4.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.15.0-next.1 + +## example-backend@0.0.50-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend@2.1.2-next.1 + - @backstage/plugin-techdocs-backend@2.2.0-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.12-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.4.14-next.1 diff --git a/microsite/blog/2026-04-20-backstagecon-kubecon-26-amsterdam.mdx b/microsite/blog/2026-04-20-backstagecon-kubecon-26-amsterdam.mdx new file mode 100644 index 0000000000..6848e9c55b --- /dev/null +++ b/microsite/blog/2026-04-20-backstagecon-kubecon-26-amsterdam.mdx @@ -0,0 +1,64 @@ +--- +title: 'Backstage in Amsterdam: Highlights from BackstageCon and KubeCon + CloudNativeCon Europe 2026' +author: André Wanlin, Emma Indal & Ruxandra Stanciu, Spotify +--- + +![Backstage in Amsterdam: Highlights from BackstageCon and KubeCon + CloudNativeCon Europe 2026](assets/2026-04-20/backstagecon-kubecon-eu-2026-hero.png) + +Amsterdam delivered. From the moment BackstageCon opened its doors on March 23, the Backstage community was in full force — long-time contributors comparing notes with teams who had only just started their IDP journey. Across four days of BackstageCon and KubeCon + CloudNativeCon Europe 2026, there was a lot to take in: an energetic day of community talks, a documentary premiere, a standing room–only maintainers session, a live demo on the Keynote mainstage, and a ContribFest that turned issues into pull requests in real time. Read on for the highlights — and catch up on all the BackstageCon talks in the [full recordings playlist](https://youtube.com/playlist?list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995&si=dAZ-Gg2A0hspfNbx). + +{/* truncate */} + +## BackstageCon: What the community is building + +![BackstageCon Europe 2026 in Amsterdam](assets/2026-04-20/kc26ams-backstagecon-crowd.jpg) +📸 _[CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720332674037/)_ + +BackstageCon kicked off the week with a full day of talks organized by the community, for the community — emceed by [Balaji Sivasubramanian](https://www.linkedin.com/in/balajisiva/) (Red Hat) and [André Wanlin](https://www.linkedin.com/in/andr%C3%A9-wanlin-31a00a16a/) (Spotify). The [full schedule](https://colocatedeventseu2026.sched.com/overview/area/BackstageCon) had something for every stage of the Backstage journey, but a few themes stood out across the day. + +On the engineering side, Booking.com's [Symbat Nurbay](https://www.linkedin.com/in/symbat-nurbay-b981a6134/) and [Xicu Piñera](https://www.linkedin.com/in/xicupinera/) shared [how they're working toward a unified developer experience](https://www.youtube.com/watch?v=vtlI4KoK_Tc&list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995) across a large, complex organization — a relatable challenge for many in the room. [Krzysztof Janota](https://www.linkedin.com/in/krzysztof-janota-91aba1143/) and [Dusan Askovic](https://www.linkedin.com/in/dusanaskovic/) from ING Bank N.V. went [deep on how to keep a Backstage deployment healthy and collaborative](https://www.youtube.com/watch?v=zJehyAxDhV8&list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995) in a big institution, covering the governance patterns that make it scale without fragmenting. On the catalog and tooling side, [Sebastian Poxhofer](https://www.linkedin.com/in/sebastian-poxhofer/) from N26 showed [how adding a platform CLI on top of the Backstage catalog](https://www.youtube.com/watch?v=4BZC0TcoW1Y&list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995) can open up new workflows and make the catalog more actionable for platform teams. + +One of the day's surprises came from the lightning talk slot: [Mathilde Ançay](https://www.linkedin.com/in/mathilde-an%C3%A7ay-2b4b84236/) from HEIG-VD took an [unexpected angle](https://www.youtube.com/watch?v=-tTJeEdQIHU&list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995), tracing an unlikely path from philosophy to a Backstage plugin — it's the kind of talk that's hard to summarize, so just watch it. + +And the buzziest moment of the day? The panel — [Building a Healthy Backstage Plugins Ecosystem](https://www.youtube.com/watch?v=67fFjQMRKyM&list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995) — with [Paul Schultz](https://www.linkedin.com/in/schultzp2020/) and [Hope Hadfield](https://www.linkedin.com/in/hope-hadfield/) (Red Hat), [Heikki Hellgren](https://www.linkedin.com/in/heikkihellgren/) (OP Financial Group), [Peter Macdonald](https://www.linkedin.com/in/peter-j-macdonald/) (VodafoneZiggo), and [Aramis Sennyey](https://www.linkedin.com/in/aramis-sennyey/) (DoorDash). The conversation was wide-ranging and the Q&A spilled past the scheduled time, which felt like a good sign. + +📺 Those are just a few picks — there's plenty more to explore in the [full BackstageCon playlist](https://youtube.com/playlist?list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995&si=dAZ-Gg2A0hspfNbx). + +## Now playing: The Backstage story, on film + +![The Backstage Documentary screening at KubeCon Amsterdam 2026](assets/2026-04-20/kc26ams-documentary.jpg) +📸 _[CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720332674037/)_ + +One of the week's most memorable moments had nothing to do with a slide deck. The [Backstage Documentary](https://www.youtube.com/watch?v=gJHYTlO0VwA&list=PLf1KFlSkDLIClkq80u8EBijuxHklONfo0) made its world premiere at KubeCon Amsterdam, and the room filled up with community members eager to watch the story of how Backstage evolved from an internal tool at Spotify into one of the most [widely adopted](https://www.youtube.com/watch?v=F7DKUThZ2I0&list=PLf1KFlSkDLIBmA5TLXn2BzEHmwWzckP8y) and [active](https://www.cncf.io/blog/2026/02/09/what-cncf-project-velocity-in-2025-reveals-about-cloud-natives-future/) open source projects in the cloud native ecosystem. The film surfaces voices from across the project's history — including some perspectives that even long-time contributors hadn't heard before. If you haven't watched it yet, grab a snack and set aside 30 minutes to see the past, present, and future of Backstage. + +## Standing room only: The State of Backstage in 2026 + +![Core maintainers present at KubeCon + CloudNativeCon Europe 2026](assets/2026-04-20/kc26ams-maintainers-talk.jpg) + +The State of Backstage talk has become one of the community's most anticipated events at every KubeCon. In Amsterdam, that anticipation was on full display: over 600 people were seated, close to 1,000 had registered, and more were turned away at the door. Core maintainers [Ben Lambert](https://www.linkedin.com/in/benlambert1/) and [Patrik Oldsberg](https://www.linkedin.com/in/patrik-oldsberg-326a216b/) [covered the full breadth](https://www.youtube.com/watch?v=tFsp5bpKwdk&list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995) of what's been happening across the project — contributions, ecosystem growth, the New Frontend System now that it's adoption-ready, and the work underway on MCP support and an AI-native Backstage direction. + +## A demo on the big stage + +![The Backstage Keynote Demo at KubeCon + CloudNativeCon Europe 2026](assets/2026-04-20/kc26ams-keynote-demo.jpg) +📸 _[CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720332674037/)_ + +On Thursday morning, the core maintainers stepped up for something a little different: a [live demo on the KubeCon Keynote mainstage](https://www.youtube.com/watch?v=cTXlkhKXgyE&t=298s&list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995). In front of over 1,500 attendees, they showcased some of Backstage's newest capabilities — including the MCP and AI-related features covered in the maintainers talk the day before. It's one thing to hear about new features in a talk; seeing them demonstrated live in a keynote setting, to an audience that large, is a different kind of moment for our open source project. + +## ContribFest: Open source, live + +![Backstage ContribFest at KubeCon + CloudNativeCon Europe 2026](assets/2026-04-20/kc26ams-contribfest.jpg) + +Rounding out the week was the fourth-ever Backstage ContribFest, co-hosted by [André Wanlin](https://www.linkedin.com/in/andr%C3%A9-wanlin-31a00a16a/) and [Emma Indal](https://www.linkedin.com/in/emma-indal/) (Spotify), [Heikki Hellgren](https://www.linkedin.com/in/heikkihellgren/) (OP Financial Group), and [Elaine Bezerra](https://www.linkedin.com/in/elaine-mattos/) (DB Systel GmbH). Around 50 attendees showed up ready to contribute — some experienced, some brand new to the project — and spent the session working through real issues in the Backstage and Community Plugins repositories alongside core maintainers and community contributors. + +Not every contribution makes it into a merged PR on the day, but ContribFest is often where the work starts. Keep an eye on the release notes — some of what was kicked off in Amsterdam may already be on its way to a future release. + +Want to see what came out of Amsterdam and past ContribFests? Head over to the [ContribFest web app](https://contribfest.backstage.io/contrib-champs/) to browse the full history of contributions from every session. + +## Tot ziens, Amsterdam! 🌷 + +![Goodbye, Amsterdam!](assets/2026-04-20/backstagecon-kubecon-eu-2026-closing.png) +📸 _[CNCF](https://www.flickr.com/photos/143247548@N03/albums/72177720332674037/)_ + +What a week. BackstageCon, a documentary debut, a packed maintainers room, a keynote demo, and a ContribFest — Amsterdam showed that the open source Backstage community has a lot of momentum and a lot to say. Catch up on everything you missed in the [BackstageCon playlist](https://www.youtube.com/playlist?list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995), and watch the [Backstage Documentary](https://www.youtube.com/watch?v=gJHYTlO0VwA&list=PLf1KFlSkDLIClkq80u8EBijuxHklONfo0) and [Keynote Demo](https://www.youtube.com/watch?v=cTXlkhKXgyE&t=298s&list=PL8iP9yIjU0Q0eZv3LncHLG3g5itFec995) if you haven't already. + +See you in Salt Lake City 🏔️ at [BackstageCon and KubeCon + CloudNativeCon North America](https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/), November 9-12, 2026! diff --git a/microsite/blog/assets/2026-04-20/backstagecon-kubecon-eu-2026-closing.png b/microsite/blog/assets/2026-04-20/backstagecon-kubecon-eu-2026-closing.png new file mode 100644 index 0000000000..3a2c32fe0e Binary files /dev/null and b/microsite/blog/assets/2026-04-20/backstagecon-kubecon-eu-2026-closing.png differ diff --git a/microsite/blog/assets/2026-04-20/backstagecon-kubecon-eu-2026-hero.png b/microsite/blog/assets/2026-04-20/backstagecon-kubecon-eu-2026-hero.png new file mode 100644 index 0000000000..5950a7cbbb Binary files /dev/null and b/microsite/blog/assets/2026-04-20/backstagecon-kubecon-eu-2026-hero.png differ diff --git a/microsite/blog/assets/2026-04-20/kc26ams-backstagecon-crowd.jpg b/microsite/blog/assets/2026-04-20/kc26ams-backstagecon-crowd.jpg new file mode 100644 index 0000000000..46cb3299b3 Binary files /dev/null and b/microsite/blog/assets/2026-04-20/kc26ams-backstagecon-crowd.jpg differ diff --git a/microsite/blog/assets/2026-04-20/kc26ams-contribfest.jpg b/microsite/blog/assets/2026-04-20/kc26ams-contribfest.jpg new file mode 100644 index 0000000000..385be4afb6 Binary files /dev/null and b/microsite/blog/assets/2026-04-20/kc26ams-contribfest.jpg differ diff --git a/microsite/blog/assets/2026-04-20/kc26ams-documentary.jpg b/microsite/blog/assets/2026-04-20/kc26ams-documentary.jpg new file mode 100644 index 0000000000..ab751b0eb6 Binary files /dev/null and b/microsite/blog/assets/2026-04-20/kc26ams-documentary.jpg differ diff --git a/microsite/blog/assets/2026-04-20/kc26ams-keynote-demo.jpg b/microsite/blog/assets/2026-04-20/kc26ams-keynote-demo.jpg new file mode 100644 index 0000000000..1f12a3a3fd Binary files /dev/null and b/microsite/blog/assets/2026-04-20/kc26ams-keynote-demo.jpg differ diff --git a/microsite/blog/assets/2026-04-20/kc26ams-maintainers-talk.jpg b/microsite/blog/assets/2026-04-20/kc26ams-maintainers-talk.jpg new file mode 100644 index 0000000000..2bdcf9d2eb Binary files /dev/null and b/microsite/blog/assets/2026-04-20/kc26ams-maintainers-talk.jpg differ diff --git a/microsite/data/plugins/aws-cost-insights.yaml b/microsite/data/plugins/aws-cost-insights.yaml new file mode 100644 index 0000000000..623e4c05f6 --- /dev/null +++ b/microsite/data/plugins/aws-cost-insights.yaml @@ -0,0 +1,11 @@ +--- +title: AWS Cost Insights +author: letthem +authorUrl: https://github.com/letthem +category: FinOps +description: Visualize AWS EC2 costs from S3 CUR data with resource insights and cost forecasting. +documentation: https://github.com/letthem/backstage-plugin-cost-insights +iconUrl: /img/aws-cost-insights-logo.svg +npmPackageName: '@letthem/backstage-plugin-aws-cost-insights' +addedDate: '2026-03-04' +status: active diff --git a/microsite/data/plugins/scaffolder-studio.yaml b/microsite/data/plugins/scaffolder-studio.yaml new file mode 100644 index 0000000000..f71ac10a28 --- /dev/null +++ b/microsite/data/plugins/scaffolder-studio.yaml @@ -0,0 +1,11 @@ +--- +title: Scaffolder Studio +author: Miklos Kiss +authorUrl: https://github.com/kissmikijr +category: Scaffolder +description: Visually create, edit, and dry-run Backstage Software Templates in a dedicated user space, with reusable Prefabs and a publishing workflow. +documentation: https://github.com/kissmikijr/scaffolder-studio/blob/main/plugins/scaffolder-studio/README.md +iconUrl: /img/scaffolder-studio.svg +npmPackageName: '@kissmiklosjr/plugin-scaffolder-studio' +addedDate: '2026-04-28' +status: active diff --git a/microsite/data/plugins/testkube.yaml b/microsite/data/plugins/testkube.yaml new file mode 100644 index 0000000000..e47fb7b015 --- /dev/null +++ b/microsite/data/plugins/testkube.yaml @@ -0,0 +1,11 @@ +--- +title: Testkube +author: Testkube +authorUrl: https://testkube.io +category: Test Orchestration +description: Catalog, Execute, Troubleshoot, & Report on automated testing from one centralized platform. +documentation: https://github.com/kubeshop/testkube-backstage-plugin +iconUrl: /img/testkube-logo.svg +npmPackageName: '@testkube/backstage-plugin' +addedDate: '2026-03-10' +status: active diff --git a/microsite/sidebars.ts b/microsite/sidebars.ts index df39e911ff..565c09feb4 100644 --- a/microsite/sidebars.ts +++ b/microsite/sidebars.ts @@ -108,9 +108,32 @@ export default { 'golden-path/plugins/why-build-plugins', 'golden-path/plugins/sustainable-plugin-development', sidebarElementWithIndex({ label: 'Backend Plugins' }, [ - 'golden-path/plugins/backend/001-first-steps', - 'golden-path/plugins/backend/002-poking-around', + 'golden-path/plugins/backend/first-steps', + 'golden-path/plugins/backend/poking-around', + 'golden-path/plugins/backend/persistence', + 'golden-path/plugins/backend/reading-from-source', + 'golden-path/plugins/backend/testing', ]), + sidebarElementWithIndex({ label: 'Frontend Plugins' }, [ + 'golden-path/plugins/frontend/first-steps', + 'golden-path/plugins/frontend/poking-around', + 'golden-path/plugins/frontend/dynamic-config', + 'golden-path/plugins/frontend/http-client', + 'golden-path/plugins/frontend/testing', + ]), + ]), + sidebarElementWithIndex({ label: '003 - Deployment' }, [ + 'golden-path/deployment/index', + ]), + sidebarElementWithIndex({ label: '004 - Adoption' }, [ + 'golden-path/adoption/getting-started', + 'golden-path/adoption/leadership-buy-in', + 'golden-path/adoption/setting-up-a-poc', + 'golden-path/adoption/first-stakeholder-feedback', + 'golden-path/adoption/customize-your-instance', + 'golden-path/adoption/preparing-for-ga', + 'golden-path/adoption/plugin-ownership', + 'golden-path/adoption/full-catalog', ]), ]), ] diff --git a/microsite/static/img/aws-cost-insights-logo.svg b/microsite/static/img/aws-cost-insights-logo.svg new file mode 100644 index 0000000000..f901cf6c03 --- /dev/null +++ b/microsite/static/img/aws-cost-insights-logo.svg @@ -0,0 +1,20 @@ + + + + + + +
+ + + + +
+ + + + + + + +
diff --git a/microsite/static/img/scaffolder-studio.svg b/microsite/static/img/scaffolder-studio.svg new file mode 100644 index 0000000000..798e86c678 --- /dev/null +++ b/microsite/static/img/scaffolder-studio.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/microsite/static/img/testkube-logo.svg b/microsite/static/img/testkube-logo.svg new file mode 100644 index 0000000000..7416317ed9 --- /dev/null +++ b/microsite/static/img/testkube-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/package.json b/package.json index 7e4b416e68..86fd4da8a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.50.0", + "version": "1.51.0-next.2", "backstage": { "cli": { "new": { @@ -99,6 +99,7 @@ "rejectFrontendNetworkRequests": true }, "resolutions": { + "@remixicon/react": ">=4.6.0 <4.9.0", "@changesets/assemble-release-plan@^6.0.0": "patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch", "@material-ui/pickers@^3.2.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch", "@material-ui/pickers@^3.3.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch", diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index 9f01db7736..adecadbf90 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/app-defaults +## 1.7.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/plugin-permission-react@0.5.1-next.0 + ## 1.7.7 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 912082932b..04aabbde6f 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/app-defaults", - "version": "1.7.7", + "version": "1.7.8-next.0", "description": "Provides the default wiring of a Backstage App", "backstage": { "role": "web-library" diff --git a/packages/app-example-plugin/CHANGELOG.md b/packages/app-example-plugin/CHANGELOG.md index f87af48446..fd881f6380 100644 --- a/packages/app-example-plugin/CHANGELOG.md +++ b/packages/app-example-plugin/CHANGELOG.md @@ -1,5 +1,13 @@ # app-example-plugin +## 0.0.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + ## 0.0.34 ### Patch Changes diff --git a/packages/app-example-plugin/package.json b/packages/app-example-plugin/package.json index ece5d38f57..6c80c28f1f 100644 --- a/packages/app-example-plugin/package.json +++ b/packages/app-example-plugin/package.json @@ -1,6 +1,6 @@ { "name": "app-example-plugin", - "version": "0.0.34", + "version": "0.0.35-next.0", "description": "Backstage internal example plugin", "backstage": { "role": "frontend-plugin", diff --git a/packages/app-legacy/CHANGELOG.md b/packages/app-legacy/CHANGELOG.md index 6d9a5c7b04..312b6d06bf 100644 --- a/packages/app-legacy/CHANGELOG.md +++ b/packages/app-legacy/CHANGELOG.md @@ -1,5 +1,49 @@ # example-app-legacy +## 0.2.121-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-notifications@0.5.17-next.0 + - @backstage/frontend-app-api@0.16.3-next.0 + - @backstage/plugin-home@0.9.5-next.0 + - @backstage/plugin-techdocs@1.17.6-next.0 + - @backstage/plugin-scaffolder@1.36.3-next.0 + - @backstage/cli@0.36.2-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/plugin-catalog@2.0.5-next.0 + - @backstage/plugin-catalog-graph@0.6.4-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/plugin-catalog-import@0.13.13-next.0 + - @backstage/plugin-search-react@1.11.4-next.0 + - @backstage/plugin-search@1.7.4-next.0 + - @backstage/plugin-org@0.7.4-next.0 + - @backstage/app-defaults@1.7.8-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/plugin-api-docs@0.14.1-next.0 + - @backstage/plugin-auth-react@0.1.27-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.30-next.0 + - @backstage/plugin-devtools@0.1.39-next.0 + - @backstage/plugin-home-react@0.1.38-next.0 + - @backstage/plugin-kubernetes@0.12.19-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.37-next.0 + - @backstage/plugin-scaffolder-react@1.20.2-next.0 + - @backstage/plugin-signals@0.0.31-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.36-next.0 + - @backstage/plugin-user-settings@0.9.3-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/plugin-mui-to-bui@0.2.7-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + ## 0.2.120 ### Patch Changes diff --git a/packages/app-legacy/package.json b/packages/app-legacy/package.json index 58bbd2d42d..b908be897c 100644 --- a/packages/app-legacy/package.json +++ b/packages/app-legacy/package.json @@ -1,6 +1,6 @@ { "name": "example-app-legacy", - "version": "0.2.120", + "version": "0.2.121-next.0", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index d5c6f68aa3..ac9fdf7c77 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,55 @@ # example-app +## 0.0.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-notifications@0.5.17-next.0 + - @backstage/plugin-app@0.4.6-next.0 + - @backstage/plugin-app-visualizer@0.2.4-next.0 + - @backstage/frontend-app-api@0.16.3-next.0 + - @backstage/plugin-home@0.9.5-next.0 + - @backstage/plugin-techdocs@1.17.6-next.0 + - @backstage/plugin-scaffolder@1.36.3-next.0 + - @backstage/cli@0.36.2-next.0 + - @backstage/core-compat-api@0.5.11-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-catalog@2.0.5-next.0 + - @backstage/plugin-catalog-graph@0.6.4-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/plugin-catalog-import@0.13.13-next.0 + - @backstage/plugin-search-react@1.11.4-next.0 + - @backstage/plugin-search@1.7.4-next.0 + - @backstage/plugin-org@0.7.4-next.0 + - @backstage/app-defaults@1.7.8-next.0 + - @backstage/frontend-defaults@0.5.2-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/plugin-api-docs@0.14.1-next.0 + - @backstage/plugin-auth-react@0.1.27-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.30-next.0 + - @backstage/plugin-devtools@0.1.39-next.0 + - @backstage/plugin-home-react@0.1.38-next.0 + - @backstage/plugin-kubernetes@0.12.19-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.37-next.0 + - @backstage/plugin-scaffolder-react@1.20.2-next.0 + - @backstage/plugin-signals@0.0.31-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.36-next.0 + - @backstage/plugin-user-settings@0.9.3-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/plugin-auth@0.1.8-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-app-react@0.2.3-next.0 + - @backstage/theme@0.7.3 + - @backstage/plugin-catalog-common@1.1.10-next.0 + - @backstage/plugin-permission-react@0.5.1-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + ## 0.0.34 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 1f0dd0e247..7406c051bd 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.0.34", + "version": "0.0.35-next.0", "backstage": { "role": "frontend" }, diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 0c8b25cbd6..bcd9e27a03 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/backend-app-api +## 1.7.0-next.0 + +### Minor Changes + +- 3595c97: Added `ExtensionPointFactoryMiddleware` type and `createExtensionPointFactoryMiddleware` helper to reimplement extension point outputs at backend creation time. + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + ## 1.6.1 ### Patch Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 8517c94f1c..9bb7462158 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-app-api", - "version": "1.6.1", + "version": "1.7.0-next.0", "description": "Core API used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 381463e24a..35a5bc5d2f 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/backend-defaults +## 0.17.1-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/cli-node@0.3.2-next.1 + - @backstage/plugin-auth-node@0.7.1-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## 0.17.1-next.0 + +### Patch Changes + +- 3595c97: Exported `defaultServiceFactories` to allow use with `createSpecializedBackend` for advanced configuration like `extensionPointFactoryMiddleware`. +- 89d3248: Fixed scheduler `sleep` firing immediately for durations longer than ~24.8 days, caused by Node.js `setTimeout` overflowing its 32-bit millisecond limit. +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-app-api@1.7.0-next.0 + - @backstage/integration@2.0.2-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/config-loader@1.10.11-next.0 + - @backstage/integration-aws-node@0.1.22-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/backend-dev-utils@0.1.7 + - @backstage/types@1.2.2 + ## 0.17.0 ### Minor Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 8b1ec4a0ed..db6f075aac 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-defaults", - "version": "0.17.0", + "version": "0.17.1-next.1", "description": "Backend defaults used by Backstage backend apps", "backstage": { "role": "node-library" @@ -192,7 +192,6 @@ "selfsigned": "^2.0.0", "tar": "^7.5.6", "triple-beam": "^1.4.1", - "uuid": "^11.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0", "yauzl": "^3.2.1", diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts index 349ad9bc19..97eb72e36c 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts @@ -25,7 +25,7 @@ import { import { randomBytes } from 'node:crypto'; import { SignJWT, exportJWK, generateKeyPair } from 'jose'; import { DateTime } from 'luxon'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; diff --git a/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts index 327173fdee..f8164dae19 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts @@ -19,7 +19,7 @@ import { ConfigReader } from '@backstage/config'; import { SignJWT, exportJWK, generateKeyPair } from 'jose'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { jwksTokenHandler } from './jwks'; // Simplified copy of TokenFactory in @backstage/plugin-auth-backend diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts index 562086a07f..40a47c4ea2 100644 --- a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts +++ b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts @@ -17,7 +17,7 @@ import { DatabaseService, LoggerService } from '@backstage/backend-plugin-api'; import { HumanDuration, durationToMilliseconds } from '@backstage/types'; import { JWK, exportJWK, generateKeyPair } from 'jose'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { DatabaseKeyStore } from './DatabaseKeyStore'; import { InternalKey, KeyPayload, KeyStore } from './types'; import { PluginKeySource } from './types'; diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts index cc8aac5f51..c91466f667 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.test.ts @@ -150,13 +150,13 @@ describe('PluginTaskManagerImpl', () => { id: 'task1', timeout: Duration.fromMillis(5000), frequency: Duration.fromObject({ years: 1 }), - initialDelay: Duration.fromObject({ years: 1 }), + initialDelay: Duration.fromObject({ seconds: 60 }), fn, scope: 'global', }); await manager.triggerTask('task1'); - jest.advanceTimersByTime(5000); + await jest.advanceTimersByTimeAsync(65_000); await promise; expect(fn).toHaveBeenCalledWith(expect.any(AbortSignal)); diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts index 4f32dc6863..8481302ba3 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts @@ -19,7 +19,7 @@ import { ConflictError, NotFoundError } from '@backstage/errors'; import { CronTime } from 'cron'; import { Knex } from 'knex'; import { DateTime, Duration } from 'luxon'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { DB_TASKS_TABLE, DbTasksRow } from '../database/tables'; import { TaskSettingsV2, diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/util.test.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/util.test.ts index e2536abb88..c4126588fb 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/util.test.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/util.test.ts @@ -56,6 +56,29 @@ describe('util', () => { await promise; expect(true).toBe(true); }, 1_000); + + it('handles durations longer than 2^31 ms by chunking setTimeout calls', async () => { + jest.useFakeTimers(); + try { + const thirtyDaysMs = 30 * 24 * 60 * 60 * 1000; + let resolved = false; + const promise = sleep(Duration.fromMillis(thirtyDaysMs)).then(() => { + resolved = true; + }); + + expect(jest.getTimerCount()).toBe(1); + + await jest.advanceTimersByTimeAsync(2 ** 30); + expect(resolved).toBe(false); + expect(jest.getTimerCount()).toBe(1); + + await jest.advanceTimersByTimeAsync(thirtyDaysMs - 2 ** 30); + await promise; + expect(resolved).toBe(true); + } finally { + jest.useRealTimers(); + } + }); }); describe('delegateAbortController', () => { diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/util.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/util.ts index 3e42d198df..06d6750ba0 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/util.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/util.ts @@ -54,6 +54,11 @@ export function nowPlus(duration: Duration | undefined, knex: Knex) { return knex.raw(`now() + interval '${seconds} seconds'`); } +// Node.js setTimeout uses a 32-bit signed integer internally, so timeouts +// longer than 2^31-1 ms (~24.8 days) fire immediately. We cap each individual +// wait at 2^30 ms (~12.4 days) and loop until the full duration has elapsed. +const MAX_TIMEOUT_MS = 2 ** 30; + /** * Sleep for the given duration, but return sooner if the abort signal * triggers. @@ -69,19 +74,34 @@ export async function sleep( return; } - await new Promise(resolve => { - let timeoutHandle: NodeJS.Timeout | undefined = undefined; + let remaining = duration.as('milliseconds'); + if (!Number.isFinite(remaining) || remaining <= 0) { + return; + } - const done = () => { + await new Promise(resolve => { + let timeoutHandle: NodeJS.Timeout | undefined; + + const finish = () => { if (timeoutHandle) { clearTimeout(timeoutHandle); } - abortSignal?.removeEventListener('abort', done); + abortSignal?.removeEventListener('abort', finish); resolve(); }; - timeoutHandle = setTimeout(done, duration.as('milliseconds')); - abortSignal?.addEventListener('abort', done); + const tick = () => { + if (remaining <= 0) { + finish(); + return; + } + const chunk = Math.min(remaining, MAX_TIMEOUT_MS); + remaining -= chunk; + timeoutHandle = setTimeout(tick, chunk); + }; + + abortSignal?.addEventListener('abort', finish); + tick(); }); } diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md index 2168c673da..3a9a4f7d10 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/backend-dynamic-feature-service +## 0.8.2-next.0 + +### Patch Changes + +- 41070b8: Upgraded `@module-federation/enhanced`, `@module-federation/runtime`, and `@module-federation/sdk` from `^0.21.6` to `^2.3.3` to address known vulnerabilities. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/plugin-catalog-backend@3.6.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.9-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/config-loader@1.10.11-next.0 + - @backstage/plugin-events-backend@0.6.2-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/plugin-scaffolder-node@0.13.3-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.45-next.0 + - @backstage/plugin-search-common@1.2.24-next.0 + ## 0.8.1 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index 50ec127d26..381a9525d6 100644 --- a/packages/backend-dynamic-feature-service/package.json +++ b/packages/backend-dynamic-feature-service/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dynamic-feature-service", - "version": "0.8.1", + "version": "0.8.2-next.0", "description": "Backstage dynamic feature service", "backstage": { "role": "node-library" diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md index a6e14b9284..55eb1b995d 100644 --- a/packages/backend-openapi-utils/CHANGELOG.md +++ b/packages/backend-openapi-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-openapi-utils +## 0.6.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/types@1.2.2 + ## 0.6.8 ### Patch Changes diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index 5aaa0e2b95..7ea0e9a374 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-openapi-utils", - "version": "0.6.8", + "version": "0.6.9-next.0", "description": "OpenAPI typescript support.", "backstage": { "role": "node-library" diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 74e296fed9..78ea0628af 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/backend-plugin-api +## 1.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/types@1.2.2 + ## 1.9.0 ### Minor Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 631074da96..c6c8eb2a40 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-plugin-api", - "version": "1.9.0", + "version": "1.9.1-next.0", "description": "Core API used by Backstage backend plugins", "backstage": { "role": "node-library" diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 35f5ea220e..beb06f083b 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/backend-test-utils +## 1.11.3-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/backend-defaults@0.17.1-next.1 + - @backstage/plugin-auth-node@0.7.1-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## 1.11.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-app-api@1.7.0-next.0 + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-events-node@0.4.22-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/types@1.2.2 + ## 1.11.2 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index a3d0f99a23..0256992ba2 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-test-utils", - "version": "1.11.2", + "version": "1.11.3-next.1", "description": "Test helpers library for Backstage backends", "backstage": { "role": "node-library" @@ -77,7 +77,6 @@ "pg-connection-string": "^2.3.0", "testcontainers": "^11.9.0", "text-extensions": "^2.4.0", - "uuid": "^11.0.0", "yn": "^4.0.0", "zod": "^3.25.76 || ^4.0.0", "zod-to-json-schema": "^3.25.1" diff --git a/packages/backend-test-utils/src/cache/helpers.ts b/packages/backend-test-utils/src/cache/helpers.ts index 7a18240fc8..6f339fc326 100644 --- a/packages/backend-test-utils/src/cache/helpers.ts +++ b/packages/backend-test-utils/src/cache/helpers.ts @@ -15,7 +15,7 @@ */ import Keyv, { type KeyvStoreAdapter } from 'keyv'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { waitForReady } from '../util/waitForReady'; import { Instance } from './types'; diff --git a/packages/backend-test-utils/src/cache/memcache.test.ts b/packages/backend-test-utils/src/cache/memcache.test.ts index bd912ce9d2..95522a5b65 100644 --- a/packages/backend-test-utils/src/cache/memcache.test.ts +++ b/packages/backend-test-utils/src/cache/memcache.test.ts @@ -16,7 +16,7 @@ import { isDockerDisabledForTests } from '../util/isDockerDisabledForTests'; import { startMemcachedContainer } from './memcache'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; const itIfDocker = isDockerDisabledForTests() ? it.skip : it; diff --git a/packages/backend-test-utils/src/cache/redis.test.ts b/packages/backend-test-utils/src/cache/redis.test.ts index 6555a26677..d003a4f449 100644 --- a/packages/backend-test-utils/src/cache/redis.test.ts +++ b/packages/backend-test-utils/src/cache/redis.test.ts @@ -16,7 +16,7 @@ import { isDockerDisabledForTests } from '../util/isDockerDisabledForTests'; import { startRedisContainer } from './redis'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; const itIfDocker = isDockerDisabledForTests() ? it.skip : it; diff --git a/packages/backend-test-utils/src/cache/valkey.test.ts b/packages/backend-test-utils/src/cache/valkey.test.ts index d706458659..0f1ee3e834 100644 --- a/packages/backend-test-utils/src/cache/valkey.test.ts +++ b/packages/backend-test-utils/src/cache/valkey.test.ts @@ -15,7 +15,7 @@ */ import { isDockerDisabledForTests } from '../util/isDockerDisabledForTests'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { startValkeyContainer } from './valkey'; const itIfDocker = isDockerDisabledForTests() ? it.skip : it; diff --git a/packages/backend-test-utils/src/database/mysql.ts b/packages/backend-test-utils/src/database/mysql.ts index 042aa74405..b4d677bd1f 100644 --- a/packages/backend-test-utils/src/database/mysql.ts +++ b/packages/backend-test-utils/src/database/mysql.ts @@ -16,7 +16,7 @@ import { randomBytes } from 'node:crypto'; import knexFactory, { Knex } from 'knex'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import yn from 'yn'; import { waitForReady } from '../util/waitForReady'; import { Engine, LARGER_POOL_CONFIG, TestDatabaseProperties } from './types'; diff --git a/packages/backend-test-utils/src/database/postgres.ts b/packages/backend-test-utils/src/database/postgres.ts index 8d85470252..e9a8086230 100644 --- a/packages/backend-test-utils/src/database/postgres.ts +++ b/packages/backend-test-utils/src/database/postgres.ts @@ -17,7 +17,7 @@ import { randomBytes } from 'node:crypto'; import knexFactory, { Knex } from 'knex'; import { parse as parsePgConnectionString } from 'pg-connection-string'; -import { v4 as uuid } from 'uuid'; +import { randomUUID as uuid } from 'node:crypto'; import { waitForReady } from '../util/waitForReady'; import { Engine, LARGER_POOL_CONFIG, TestDatabaseProperties } from './types'; diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 49479461e9..e14a65b6ab 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,76 @@ # example-backend +## 0.0.50-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend@2.1.2-next.1 + - @backstage/plugin-techdocs-backend@2.2.0-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.12-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.4.14-next.1 + +## 0.0.50-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@3.5.0-next.1 + - @backstage/catalog-model@1.8.1-next.1 + - @backstage/backend-defaults@0.17.1-next.1 + - @backstage/plugin-auth-backend@0.28.1-next.1 + - @backstage/plugin-auth-node@0.7.1-next.1 + - @backstage/plugin-catalog-backend@3.6.2-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.14-next.1 + - @backstage/plugin-notifications-backend@0.6.5-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.8.3-next.1 + - @backstage/plugin-search-backend-node@1.4.4-next.1 + - @backstage/plugin-signals-backend@0.3.15-next.1 + +## 0.0.50-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.9.9-next.0 + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/plugin-catalog-backend@3.6.1-next.0 + - @backstage/plugin-app-backend@0.5.14-next.0 + - @backstage/plugin-auth-node@0.7.1-next.0 + - @backstage/plugin-devtools-backend@0.5.17-next.0 + - @backstage/plugin-permission-backend@0.7.12-next.0 + - @backstage/plugin-search-backend@2.1.2-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/plugin-auth-backend@0.28.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.19-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.14-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.11-next.0 + - @backstage/plugin-events-backend@0.6.2-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.2.3-next.0 + - @backstage/plugin-kubernetes-backend@0.21.4-next.0 + - @backstage/plugin-mcp-actions-backend@0.1.13-next.0 + - @backstage/plugin-notifications-backend@0.6.5-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-permission-node@0.10.13-next.0 + - @backstage/plugin-proxy-backend@0.6.13-next.0 + - @backstage/plugin-scaffolder-backend@3.4.1-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.15-next.0 + - @backstage/plugin-search-backend-node@1.4.4-next.0 + - @backstage/plugin-techdocs-backend@2.1.8-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.5.3-next.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.7-next.0 + - @backstage/plugin-signals-backend@0.3.15-next.0 + - @backstage/plugin-catalog-backend-module-logs@0.1.22-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.22-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.20-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.19-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.22-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.8.3-next.0 + - @backstage/plugin-search-backend-module-explore@0.3.14-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.14-next.0 + ## 0.0.49 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 787349dcd7..f36ffaacc3 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.0.49", + "version": "0.0.50-next.2", "backstage": { "role": "backend" }, diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index 3dd9ed8fd6..fc4d702b6d 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/catalog-client +## 1.15.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + ## 1.15.0 ### Minor Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index 0bedf6bfb5..4228f6e905 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/catalog-client", - "version": "1.15.0", + "version": "1.15.1-next.0", "description": "An isomorphic client for the catalog backend", "backstage": { "role": "common-library" diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index 58d9da57e2..132bfd7c97 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/catalog-model +## 1.8.1-next.1 + +### Patch Changes + +- ab1cdbb: Removed a handful of internal imports that referenced the package by its own name. Value imports were switched to relative paths, and type-only imports to `import type`. These self-referential imports could trigger circular initialization errors in bundled ESM and when the package was loaded via `jest.requireActual` — most visibly `Cannot access '_AppRootElementBlueprintesm' before initialization` from `@backstage/frontend-plugin-api`. There are no user-facing API changes. + +## 1.8.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/types@1.2.2 + ## 1.8.0 ### Minor Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 75b48a91c5..89d236c150 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/catalog-model", - "version": "1.8.0", + "version": "1.8.1-next.1", "description": "Types and validators that help describe the model of a Backstage Catalog", "backstage": { "role": "common-library" diff --git a/packages/catalog-model/report-alpha.api.md b/packages/catalog-model/report-alpha.api.md index c323e4be5c..7483d0b6a6 100644 --- a/packages/catalog-model/report-alpha.api.md +++ b/packages/catalog-model/report-alpha.api.md @@ -3,7 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { Entity } from '@backstage/catalog-model'; +import type { Entity } from '@backstage/catalog-model'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { SerializedError } from '@backstage/errors'; diff --git a/packages/catalog-model/src/entity/AlphaEntity.ts b/packages/catalog-model/src/entity/AlphaEntity.ts index 6f5c9d4fa7..4f3f9d55fc 100644 --- a/packages/catalog-model/src/entity/AlphaEntity.ts +++ b/packages/catalog-model/src/entity/AlphaEntity.ts @@ -14,9 +14,7 @@ * limitations under the License. */ -// TODO(Rugvip): Figure out best way to allow this import -// eslint-disable-next-line import/no-extraneous-dependencies -import { Entity } from '@backstage/catalog-model'; +import type { Entity } from '@backstage/catalog-model'; import { EntityStatus } from './EntityStatus'; /** diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md index 1475c4c6a6..7d5a9f85aa 100644 --- a/packages/cli-common/CHANGELOG.md +++ b/packages/cli-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/cli-common +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + ## 0.2.1 ### Patch Changes diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index bfb0ea8292..672c89af65 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-common", - "version": "0.2.1", + "version": "0.2.2-next.0", "description": "Common functionality used by cli, backend, and create-app", "backstage": { "role": "node-library" diff --git a/packages/cli-defaults/CHANGELOG.md b/packages/cli-defaults/CHANGELOG.md index 046d139b5c..cdc09c8574 100644 --- a/packages/cli-defaults/CHANGELOG.md +++ b/packages/cli-defaults/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/cli-defaults +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-module-build@0.1.3-next.0 + - @backstage/cli-module-actions@0.1.1-next.0 + - @backstage/cli-module-auth@0.1.2-next.0 + - @backstage/cli-module-migrate@0.1.2-next.0 + - @backstage/cli-module-new@0.1.3-next.0 + - @backstage/cli-module-config@0.1.2-next.0 + - @backstage/cli-module-github@0.1.2-next.0 + - @backstage/cli-module-info@0.1.2-next.0 + - @backstage/cli-module-lint@0.1.2-next.0 + - @backstage/cli-module-maintenance@0.1.2-next.0 + - @backstage/cli-module-test-jest@0.1.2-next.0 + - @backstage/cli-module-translations@0.1.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-defaults/package.json b/packages/cli-defaults/package.json index 760980ae63..a2ecf9e0c6 100644 --- a/packages/cli-defaults/package.json +++ b/packages/cli-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-defaults", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "Default set of CLI modules for the Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-internal/CHANGELOG.md b/packages/cli-internal/CHANGELOG.md index 035664289e..546b6f0e37 100644 --- a/packages/cli-internal/CHANGELOG.md +++ b/packages/cli-internal/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/cli +## 0.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-node@0.3.2-next.0 + ## 0.0.3 ### Patch Changes diff --git a/packages/cli-internal/package.json b/packages/cli-internal/package.json index e1d179aba7..c407c4ba97 100644 --- a/packages/cli-internal/package.json +++ b/packages/cli-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/cli", - "version": "0.0.3", + "version": "0.0.4-next.0", "backstage": { "role": "node-library", "inline": true diff --git a/packages/cli-module-actions/CHANGELOG.md b/packages/cli-module-actions/CHANGELOG.md index 6ade2c056d..361151e84b 100644 --- a/packages/cli-module-actions/CHANGELOG.md +++ b/packages/cli-module-actions/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-module-actions +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-node@0.3.2-next.0 + ## 0.1.0 ### Minor Changes diff --git a/packages/cli-module-actions/package.json b/packages/cli-module-actions/package.json index e716c64641..b1144f8430 100644 --- a/packages/cli-module-actions/package.json +++ b/packages/cli-module-actions/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-actions", - "version": "0.1.0", + "version": "0.1.1-next.0", "description": "CLI module for executing distributed actions", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-auth/CHANGELOG.md b/packages/cli-module-auth/CHANGELOG.md index a72ad03744..0f0a0bc20b 100644 --- a/packages/cli-module-auth/CHANGELOG.md +++ b/packages/cli-module-auth/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-module-auth +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-node@0.3.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-module-auth/package.json b/packages/cli-module-auth/package.json index 516f165fa7..2a5d4b4aef 100644 --- a/packages/cli-module-auth/package.json +++ b/packages/cli-module-auth/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-auth", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-build/CHANGELOG.md b/packages/cli-module-build/CHANGELOG.md index a00b04209f..bd83d53103 100644 --- a/packages/cli-module-build/CHANGELOG.md +++ b/packages/cli-module-build/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/cli-module-build +## 0.1.3-next.0 + +### Patch Changes + +- ed4ee6f: Fixed config path resolution for the embedded-postgres database client detection to resolve paths relative to the target package directory rather than the workspace root. +- 41070b8: Upgraded `@module-federation/enhanced`, `@module-federation/runtime`, and `@module-federation/sdk` from `^0.21.6` to `^2.3.3` to address known vulnerabilities. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/module-federation-common@0.1.4-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/config-loader@1.10.11-next.0 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-module-build/package.json b/packages/cli-module-build/package.json index e21ffbeca9..1cb6071212 100644 --- a/packages/cli-module-build/package.json +++ b/packages/cli-module-build/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-build", - "version": "0.1.1", + "version": "0.1.3-next.0", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-config/CHANGELOG.md b/packages/cli-module-config/CHANGELOG.md index ff3244abb2..6f54c9a68a 100644 --- a/packages/cli-module-config/CHANGELOG.md +++ b/packages/cli-module-config/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/cli-module-config +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/config-loader@1.10.11-next.0 + - @backstage/types@1.2.2 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-module-config/package.json b/packages/cli-module-config/package.json index 40367eec74..1c42952d2e 100644 --- a/packages/cli-module-config/package.json +++ b/packages/cli-module-config/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-config", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-github/CHANGELOG.md b/packages/cli-module-github/CHANGELOG.md index 10d7c4ea41..ae16e9a952 100644 --- a/packages/cli-module-github/CHANGELOG.md +++ b/packages/cli-module-github/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-module-github +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-module-github/package.json b/packages/cli-module-github/package.json index 263562b0e8..797a5e38fa 100644 --- a/packages/cli-module-github/package.json +++ b/packages/cli-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-github", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-info/CHANGELOG.md b/packages/cli-module-info/CHANGELOG.md index 78e9a28ad2..2a64c788ae 100644 --- a/packages/cli-module-info/CHANGELOG.md +++ b/packages/cli-module-info/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-module-info +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-module-info/package.json b/packages/cli-module-info/package.json index f4dce6f6f9..1f1a8f37fb 100644 --- a/packages/cli-module-info/package.json +++ b/packages/cli-module-info/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-info", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-lint/CHANGELOG.md b/packages/cli-module-lint/CHANGELOG.md index 58277d0d1c..81f713ac99 100644 --- a/packages/cli-module-lint/CHANGELOG.md +++ b/packages/cli-module-lint/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-module-lint +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-module-lint/package.json b/packages/cli-module-lint/package.json index 3403a4575c..8ab6ea2118 100644 --- a/packages/cli-module-lint/package.json +++ b/packages/cli-module-lint/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-lint", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-maintenance/CHANGELOG.md b/packages/cli-module-maintenance/CHANGELOG.md index 23084b6deb..5ecf10f044 100644 --- a/packages/cli-module-maintenance/CHANGELOG.md +++ b/packages/cli-module-maintenance/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-module-maintenance +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-module-maintenance/package.json b/packages/cli-module-maintenance/package.json index 3d16489eac..6563e23e74 100644 --- a/packages/cli-module-maintenance/package.json +++ b/packages/cli-module-maintenance/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-maintenance", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-migrate/CHANGELOG.md b/packages/cli-module-migrate/CHANGELOG.md index 75b7b3e791..6e33b8dc20 100644 --- a/packages/cli-module-migrate/CHANGELOG.md +++ b/packages/cli-module-migrate/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/cli-module-migrate +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/release-manifests@0.0.13 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-module-migrate/package.json b/packages/cli-module-migrate/package.json index 2fd42855f0..efc1a0f720 100644 --- a/packages/cli-module-migrate/package.json +++ b/packages/cli-module-migrate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-migrate", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-new/CHANGELOG.md b/packages/cli-module-new/CHANGELOG.md index fe4f1f9f28..bfc28cda84 100644 --- a/packages/cli-module-new/CHANGELOG.md +++ b/packages/cli-module-new/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/cli-module-new +## 0.1.3-next.1 + +### Patch Changes + +- e9b78e9: Removed the `uuid` dependency and replaced usage with the built-in `crypto.randomUUID()`. +- Updated dependencies + - @backstage/cli-node@0.3.2-next.1 + +## 0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + ## 0.1.2 ### Patch Changes diff --git a/packages/cli-module-new/package.json b/packages/cli-module-new/package.json index ae058beac3..83735284b1 100644 --- a/packages/cli-module-new/package.json +++ b/packages/cli-module-new/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-new", - "version": "0.1.2", + "version": "0.1.3-next.1", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-new/templates/catalog-provider-module/src/provider/{{providerClass}}.ts.hbs b/packages/cli-module-new/templates/catalog-provider-module/src/provider/{{providerClass}}.ts.hbs index 3e4c5718ae..443091e81a 100644 --- a/packages/cli-module-new/templates/catalog-provider-module/src/provider/{{providerClass}}.ts.hbs +++ b/packages/cli-module-new/templates/catalog-provider-module/src/provider/{{providerClass}}.ts.hbs @@ -4,7 +4,7 @@ import { EntityProvider, EntityProviderConnection, } from '@backstage/plugin-catalog-node'; -import * as uuid from 'uuid'; +import { randomUUID } from 'node:crypto'; import { readProviderConfigs } from './readProviderConfigs'; import { LoggerService, @@ -74,7 +74,7 @@ export class {{providerClass}} implements EntityProvider { fn: async () => { const logger = this.#logger.child({ taskId: id, - taskInstanceId: uuid.v4(), + taskInstanceId: randomUUID(), }); try { diff --git a/packages/cli-module-test-jest/CHANGELOG.md b/packages/cli-module-test-jest/CHANGELOG.md index 236c170eff..89ab33d3a5 100644 --- a/packages/cli-module-test-jest/CHANGELOG.md +++ b/packages/cli-module-test-jest/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-module-test-jest +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-module-test-jest/package.json b/packages/cli-module-test-jest/package.json index 6c50790d1b..e20f7a5d1c 100644 --- a/packages/cli-module-test-jest/package.json +++ b/packages/cli-module-test-jest/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-test-jest", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-module-translations/CHANGELOG.md b/packages/cli-module-translations/CHANGELOG.md index c31186293b..d10ed4fc9a 100644 --- a/packages/cli-module-translations/CHANGELOG.md +++ b/packages/cli-module-translations/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-module-translations +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/packages/cli-module-translations/package.json b/packages/cli-module-translations/package.json index 49d4ce0474..5b63fb6a63 100644 --- a/packages/cli-module-translations/package.json +++ b/packages/cli-module-translations/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-module-translations", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "CLI module for Backstage CLI", "backstage": { "role": "cli-module" diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index 735aad0f05..c6ed8c339a 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/cli-node +## 0.3.2-next.1 + +### Patch Changes + +- 357d639: Fixed a bug in `PackageGraph.listChangedPackages` where removed dependencies were not detected during lockfile analysis. The dependency graph from the previous lockfile was not being merged, causing transitive dependency removals to be missed. + +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/types@1.2.2 + ## 0.3.1 ### Patch Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index e03fd9db8c..f00d1b567c 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-node", - "version": "0.3.1", + "version": "0.3.2-next.1", "description": "Node.js library for Backstage CLIs", "backstage": { "role": "node-library" diff --git a/packages/cli-node/src/monorepo/PackageGraph.test.ts b/packages/cli-node/src/monorepo/PackageGraph.test.ts index 51d8f7b7be..7ee41e939d 100644 --- a/packages/cli-node/src/monorepo/PackageGraph.test.ts +++ b/packages/cli-node/src/monorepo/PackageGraph.test.ts @@ -222,4 +222,51 @@ c-dep@^2: 'origin/master', ); }); + + it('detects packages affected by a removed dependency in the lockfile', async () => { + const graph = PackageGraph.fromPackages(testPackages); + + mockListChangedFiles.mockResolvedValueOnce(['yarn.lock']); + + // The old lockfile (at the ref) has b depending on b-dep + mockReadFileAtRef.mockResolvedValueOnce(` +a@^1: + version: "1.0.0" + +b@^1: + version: "1.0.0" + dependencies: + b-dep: ^1 + +b-dep@^1: + version: "1.0.0" + integrity: sha512-old + +c@^1: + version: "1.0.0" +`); + + // The current lockfile no longer has b-dep at all + jest.spyOn(Lockfile, 'load').mockResolvedValueOnce( + Lockfile.parse(` +a@^1: + version: "1.0.0" + +b@^1: + version: "1.0.0" + +c@^1: + version: "1.0.0" +`), + ); + + await expect( + graph + .listChangedPackages({ + ref: 'origin/master', + analyzeLockfile: true, + }) + .then(pkgs => pkgs.map(pkg => pkg.name)), + ).resolves.toEqual(['b']); + }); }); diff --git a/packages/cli-node/src/monorepo/PackageGraph.ts b/packages/cli-node/src/monorepo/PackageGraph.ts index 9d1745c7c5..35fe943606 100644 --- a/packages/cli-node/src/monorepo/PackageGraph.ts +++ b/packages/cli-node/src/monorepo/PackageGraph.ts @@ -393,7 +393,7 @@ export class PackageGraph extends Map { // Merge the dependency graph from the other lockfile into this one in // order to be able to detect removals accurately. { - const otherGraph = thisLockfile.createSimplifiedDependencyGraph(); + const otherGraph = otherLockfile.createSimplifiedDependencyGraph(); for (const [name, dependencies] of otherGraph) { const node = graph.get(name); if (node) { diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 4e6e9ee5b6..73402a615a 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/cli +## 0.36.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/eslint-plugin@0.3.0-next.0 + - @backstage/cli-node@0.3.2-next.1 + +## 0.36.2-next.0 + +### Patch Changes + +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-module-build@0.1.3-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/cli-defaults@0.1.2-next.0 + - @backstage/cli-module-test-jest@0.1.2-next.0 + - @backstage/eslint-plugin@0.2.3 + ## 0.36.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index bbd47a292c..04b7ea1a04 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.36.1", + "version": "0.36.2-next.1", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md index 2f2e3f9533..029df0e687 100644 --- a/packages/codemods/CHANGELOG.md +++ b/packages/codemods/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/codemods +## 0.1.57-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + ## 0.1.56 ### Patch Changes diff --git a/packages/codemods/package.json b/packages/codemods/package.json index e632df1512..899c187d1a 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/codemods", - "version": "0.1.56", + "version": "0.1.57-next.0", "description": "A collection of codemods for Backstage projects", "backstage": { "role": "cli" diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index b59aa8d9ea..e42a98da9f 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/config-loader +## 1.10.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + ## 1.10.10 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 7e52782299..8a1c33cd16 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/config-loader", - "version": "1.10.10", + "version": "1.10.11-next.0", "description": "Config loading functionality used by Backstage backend, and CLI", "backstage": { "role": "node-library" diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index 2c83cbd075..5930daf6f4 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/config +## 1.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/types@1.2.2 + ## 1.3.7 ### Patch Changes diff --git a/packages/config/package.json b/packages/config/package.json index 67e7529adb..a30a5f754f 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/config", - "version": "1.3.7", + "version": "1.3.8-next.0", "description": "Config API used by Backstage core, backend, and CLI", "backstage": { "role": "common-library" diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index 8b46dcbb7b..31524c557b 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/core-app-api +## 1.20.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.15.0-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 1.20.0 ### Minor Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 1e20b4bbd8..224e45c0b5 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-app-api", - "version": "1.20.0", + "version": "1.20.1-next.0", "description": "Core app API used by Backstage apps", "backstage": { "role": "web-library" diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md index bda0809873..32fa2cc16a 100644 --- a/packages/core-compat-api/CHANGELOG.md +++ b/packages/core-compat-api/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/core-compat-api +## 0.5.11-next.0 + +### Patch Changes + +- 744fa1f: Removed duplicated entries that appeared in both `dependencies` and `devDependencies`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/plugin-app-react@0.2.3-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 0.5.10 ### Patch Changes diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index 518672d8c1..999e436ea3 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-compat-api", - "version": "0.5.10", + "version": "0.5.11-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 285c06ae35..d9341fdc01 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/core-components +## 0.18.10-next.1 + +### Patch Changes + +- 021b368: Added stable DOM markers to the legacy Page and Header so adjacent layout components can coordinate spacing without relying on generated class names. + +## 0.18.10-next.0 + +### Patch Changes + +- 3846774: Added missing dependencies that were previously only available transitively. +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + - @backstage/version-bridge@1.0.12 + ## 0.18.9 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 0d4d1d4149..b846ba1090 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-components", - "version": "0.18.9", + "version": "0.18.10-next.1", "description": "Core components used by Backstage plugins and apps", "backstage": { "role": "web-library" diff --git a/packages/core-components/src/layout/Header/Header.tsx b/packages/core-components/src/layout/Header/Header.tsx index f5facda641..3320ba782a 100644 --- a/packages/core-components/src/layout/Header/Header.tsx +++ b/packages/core-components/src/layout/Header/Header.tsx @@ -228,7 +228,11 @@ export function Header(props: PropsWithChildren) { return ( <> -
+
-
{children}
+
+ {children} +
); } diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 995781d3f8..4bba39665b 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/core-plugin-api +## 1.12.6-next.1 + +### Patch Changes + +- ab1cdbb: Removed a handful of internal imports that referenced the package by its own name. Value imports were switched to relative paths, and type-only imports to `import type`. These self-referential imports could trigger circular initialization errors in bundled ESM and when the package was loaded via `jest.requireActual` — most visibly `Cannot access '_AppRootElementBlueprintesm' before initialization` from `@backstage/frontend-plugin-api`. There are no user-facing API changes. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.1 + +## 1.12.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 1.12.5 ### Patch Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 706e89f9c3..e82561e75e 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-plugin-api", - "version": "1.12.5", + "version": "1.12.6-next.1", "description": "Core API used by Backstage plugins", "backstage": { "role": "web-library" diff --git a/packages/core-plugin-api/src/app/useApp.tsx b/packages/core-plugin-api/src/app/useApp.tsx index 5d789689cd..16818c038a 100644 --- a/packages/core-plugin-api/src/app/useApp.tsx +++ b/packages/core-plugin-api/src/app/useApp.tsx @@ -27,7 +27,7 @@ import { FrontendPlugin, ApiHolder, } from '@backstage/frontend-plugin-api'; -import { +import type { AppComponents, IconComponent, BackstagePlugin, diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index cecdf63805..472170f770 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/create-app +## 0.8.3-next.2 + +### Patch Changes + +- Bumped create-app version. + +## 0.8.3-next.1 + +### Patch Changes + +- Bumped create-app version. + +## 0.8.3-next.0 + +### Patch Changes + +- 927c003: Replaced internal error utilities with shared ones from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.2.2-next.0 + ## 0.8.2 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 1ebe2543ac..ad81c91f11 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.8.2", + "version": "0.8.3-next.2", "description": "A CLI that helps you create your own Backstage app", "backstage": { "role": "cli" diff --git a/packages/create-app/seed-yarn.lock b/packages/create-app/seed-yarn.lock index b6ba82ab17..e92bbfe51d 100644 --- a/packages/create-app/seed-yarn.lock +++ b/packages/create-app/seed-yarn.lock @@ -37,3 +37,46 @@ fast-xml-builder@*: version "3.1.0" resolved "https://registry.yarnpkg.com/knex/-/knex-3.1.0.tgz#b6ddd5b5ad26a6315234a5b09ec38dc4a370bd8c" integrity sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw== + +// @protobufjs/inquire@1.1.1 dropped the eval-based workaround that hid its +// dynamic require() from bundlers, which causes webpack/rspack to emit a +// "Critical dependency: the request of a dependency is an expression" warning +// that fails the build under CI=true. Pin to 1.1.0 until upstream is fixed. +// See https://github.com/protobufjs/protobuf.js/issues/2057 +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +// protobufjs@7.5.6 bumped its @protobufjs/inquire dependency to ^1.1.1, which +// would bypass the pin above. Pin protobufjs to 7.5.5 (the last version that +// requests inquire ^1.1.0) for all known workspace queries. +"protobufjs@^7.0.0": + version "7.5.5" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.5.tgz#b7089ca4410374c75150baf277353ef76db69f96" + integrity sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg== + +"protobufjs@^7.2.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.5.tgz#b7089ca4410374c75150baf277353ef76db69f96" + integrity sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg== + +"protobufjs@^7.2.6": + version "7.5.5" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.5.tgz#b7089ca4410374c75150baf277353ef76db69f96" + integrity sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg== + +"protobufjs@^7.3.2": + version "7.5.5" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.5.tgz#b7089ca4410374c75150baf277353ef76db69f96" + integrity sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg== + +"protobufjs@^7.4.0": + version "7.5.5" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.5.tgz#b7089ca4410374c75150baf277353ef76db69f96" + integrity sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg== + +"protobufjs@^7.5.3": + version "7.5.5" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.5.tgz#b7089ca4410374c75150baf277353ef76db69f96" + integrity sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg== diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index f7ffe9fe82..d73c467d86 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/dev-utils +## 1.1.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-catalog-react@2.1.5-next.0 + - @backstage/app-defaults@1.7.8-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/theme@0.7.3 + ## 1.1.22 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 96280f4346..cd36f79313 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.22", + "version": "1.1.23-next.0", "description": "Utilities for developing Backstage plugins.", "backstage": { "role": "web-library" diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index 11bf4e058d..85df1e1379 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,14 @@ # e2e-test +## 0.2.40-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/create-app@0.8.3-next.0 + - @backstage/cli-common@0.2.2-next.0 + ## 0.2.39 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 4fa0cd00b8..978ffd0ce8 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,6 +1,6 @@ { "name": "e2e-test", - "version": "0.2.39", + "version": "0.2.40-next.0", "description": "E2E test for verifying Backstage packages", "backstage": { "role": "cli" diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index fdccdfa84e..b5df43ec8a 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/errors +## 1.3.1-next.0 + +### Patch Changes + +- 8741e5a: Added explicit `name` property to `ServiceUnavailableError` for consistency with all other error classes, making it resilient to minification. +- Updated dependencies + - @backstage/types@1.2.2 + ## 1.3.0 ### Minor Changes diff --git a/packages/errors/package.json b/packages/errors/package.json index a1836e0854..bbff9d7373 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/errors", - "version": "1.3.0", + "version": "1.3.1-next.0", "description": "Common utilities for error handling within Backstage", "backstage": { "role": "common-library" diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md index e7160fafeb..7dce1921d7 100644 --- a/packages/eslint-plugin/CHANGELOG.md +++ b/packages/eslint-plugin/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/eslint-plugin +## 0.3.0-next.0 + +### Minor Changes + +- ab1cdbb: 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`. + ## 0.2.3 ### Patch Changes diff --git a/packages/eslint-plugin/docs/rules/no-self-package-imports.md b/packages/eslint-plugin/docs/rules/no-self-package-imports.md new file mode 100644 index 0000000000..4b383ed59c --- /dev/null +++ b/packages/eslint-plugin/docs/rules/no-self-package-imports.md @@ -0,0 +1,106 @@ +# @backstage/no-self-package-imports + +This rule prevents a package from importing itself by its own name when the +imported entry point bundles the current file. Self-package imports in that +situation create a circular dependency through the bundled barrel, which can +surface as runtime errors such as +`Cannot access 'X' before initialization` when the package is loaded in an +environment that triggers eager re-evaluation (for example +`jest.requireActual`, or ESM consumers that follow the cycle). + +The rule understands your package's `exports` map and follows the +relative import graph from each entry's source file to determine which files +are actually bundled into each entry. It then reports: + +- **Same-entry self-imports**: the current file is part of the same bundle + as the entry it imports, so the cycle is real. +- **Cross-entry self-imports** (optional): the file is part of a different + entry's bundle than the one it imports. Cross-entry self-imports don't + always cycle, but they still couple unrelated entry points at initialization + time and are worth avoiding. + +Files that aren't reachable from any published entry (tests, scripts, +orphans) are skipped, as self-imports from them can't affect a published +bundle. + +Imports declared with `import type` (or `export type`) are erased at runtime +and are always allowed, since they can't cause circular initialization. + +## Usage + +Add the rule as follows: + +```js +"@backstage/no-self-package-imports": ["error"] +``` + +This errors on same-entry self-imports. Cross-entry self-imports are allowed +by default; opt in to reporting them with `allowCrossEntry: false`: + +```js +"@backstage/no-self-package-imports": ["error", { "allowCrossEntry": false }] +``` + +## Rule Details + +Given this `package.json`: + +```json +{ + "name": "@backstage/plugin-foo", + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + } +} +``` + +and `src/index.ts` that re-exports `./blueprint`: + +```ts +export * from './blueprint'; +``` + +### Fail + +Importing `@backstage/plugin-foo` from a file that is also reachable from +`src/index.ts` creates a cycle: + +```ts +// src/blueprint.ts +import { helper } from '@backstage/plugin-foo'; +``` + +### Pass + +Use a relative import instead: + +```ts +// src/blueprint.ts +import { helper } from './helper'; +``` + +Or, if only the type is used, `import type` is erased at runtime and is +always allowed: + +```ts +// src/blueprint.ts +import type { Helper } from '@backstage/plugin-foo'; +``` + +Importing `package.json` is always allowed: + +```ts +import { version } from '@backstage/plugin-foo/package.json'; +``` + +## Options + +### `allowCrossEntry` + +- Type: `boolean` +- Default: `true` + +When `false`, the rule also reports self-imports that target a different +entry from the one the current file is part of. diff --git a/packages/eslint-plugin/index.js b/packages/eslint-plugin/index.js index d911eee1ef..e31091ace3 100644 --- a/packages/eslint-plugin/index.js +++ b/packages/eslint-plugin/index.js @@ -24,6 +24,7 @@ module.exports = { '@backstage/no-undeclared-imports': 'error', '@backstage/no-mixed-plugin-imports': 'warn', '@backstage/no-ui-css-imports-in-non-frontend': 'error', + '@backstage/no-self-package-imports': 'error', }, }, }, @@ -34,5 +35,6 @@ module.exports = { 'no-top-level-material-ui-4-imports': require('./rules/no-top-level-material-ui-4-imports'), 'no-mixed-plugin-imports': require('./rules/no-mixed-plugin-imports'), 'no-ui-css-imports-in-non-frontend': require('./rules/no-ui-css-imports-in-non-frontend'), + 'no-self-package-imports': require('./rules/no-self-package-imports'), }, }; diff --git a/packages/eslint-plugin/lib/visitImports.js b/packages/eslint-plugin/lib/visitImports.js index 85c5ac0568..e4df5a8f32 100644 --- a/packages/eslint-plugin/lib/visitImports.js +++ b/packages/eslint-plugin/lib/visitImports.js @@ -111,7 +111,7 @@ function getImportInfo(node) { return { path: pathNode.value, node: pathNode, - kind: anyNode.importKind ?? 'value', + kind: anyNode.importKind ?? anyNode.exportKind ?? 'value', }; } diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index cd10f347d7..1a383c0f10 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/eslint-plugin", - "version": "0.2.3", + "version": "0.3.0-next.0", "description": "Backstage ESLint plugin", "publishConfig": { "access": "public" diff --git a/packages/eslint-plugin/rules/no-self-package-imports.js b/packages/eslint-plugin/rules/no-self-package-imports.js new file mode 100644 index 0000000000..0ea55e5d20 --- /dev/null +++ b/packages/eslint-plugin/rules/no-self-package-imports.js @@ -0,0 +1,284 @@ +/* + * Copyright 2026 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. + */ + +// @ts-check + +const fs = require('node:fs'); +const path = require('node:path'); +const visitImports = require('../lib/visitImports'); +const getPackages = require('../lib/getPackages'); + +/** + * @typedef EntryInfo + * @type {object} + * @property {string} key - The exports key, e.g. '.' or './alpha'. + * @property {string} sourceFile - The source file for the entry, relative to the package dir. + */ + +const SOURCE_EXTENSIONS = [ + '.ts', + '.tsx', + '.mts', + '.cts', + '.js', + '.jsx', + '.mjs', + '.cjs', +]; + +// Cache the per-package analysis across files lint invocations. The key is the +// absolute package dir; the value is a Map from absolute file path to the set +// of entry keys whose bundle reaches that file. +/** @type {Map>>} */ +const bundleCache = new Map(); + +/** + * Build a list of entries from the package.json exports field. Entries that + * don't point to a script (e.g. `./package.json`) are ignored. + * + * @param {unknown} exportsField + * @returns {EntryInfo[]} + */ +function readEntries(exportsField) { + if (!exportsField || typeof exportsField !== 'object') { + return [{ key: '.', sourceFile: 'src/index.ts' }]; + } + /** @type {EntryInfo[]} */ + const entries = []; + for (const [key, value] of Object.entries(exportsField)) { + if (typeof value !== 'string') continue; + if (key === './package.json') continue; + const rel = value.replace(/^\.\//, ''); + entries.push({ key, sourceFile: rel }); + } + return entries; +} + +/** + * Resolve a relative module specifier against a containing file. + * Tries source extensions and index files, in that order. + * + * @param {string} fromFile + * @param {string} specifier + * @returns {string | undefined} + */ +function resolveSourcePath(fromFile, specifier) { + const base = path.resolve(path.dirname(fromFile), specifier); + // If the specifier already carries an extension, only try the exact path. + if (/\.[cm]?[jt]sx?$/i.test(specifier)) { + return fs.existsSync(base) ? base : undefined; + } + for (const ext of SOURCE_EXTENSIONS) { + const candidate = base + ext; + if (fs.existsSync(candidate)) return candidate; + } + for (const ext of SOURCE_EXTENSIONS) { + const candidate = path.join(base, 'index' + ext); + if (fs.existsSync(candidate)) return candidate; + } + return undefined; +} + +// Matches `from '...'` specifiers in `import`/`export ... from` statements. +// Uses a non-greedy body so multi-line imports match cleanly. The negative +// lookahead skips `import type` / `export type` statements because type-only +// edges are erased at runtime and can't pull files into a runtime bundle. +const FROM_SPEC_RE = + /(?:^|[\s;}])(?:import|export)\b(?!\s+type\b)[^"';]*?\bfrom\s*["']([^"']+)["']/gm; +// Matches side-effect imports: `import '...';`. +const SIDE_EFFECT_IMPORT_RE = /(?:^|[\s;}])import\s*["']([^"']+)["']/gm; + +/** + * Extract relative module specifiers from a source file's contents. + * + * @param {string} contents + * @returns {string[]} + */ +function collectRelativeSpecifiers(contents) { + const specs = new Set(); + for (const m of contents.matchAll(FROM_SPEC_RE)) { + if (m[1].startsWith('.')) specs.add(m[1]); + } + for (const m of contents.matchAll(SIDE_EFFECT_IMPORT_RE)) { + if (m[1].startsWith('.')) specs.add(m[1]); + } + return [...specs]; +} + +/** + * Walk the relative import/export graph of each entry's source file and build + * a map of absolute file paths to the set of entries whose bundles include + * them. Files that aren't reachable from any entry (e.g. tests, scripts) + * aren't present in the map. + * + * @param {string} pkgDir + * @param {EntryInfo[]} entries + * @returns {Map>} + */ +function buildFileToEntriesMap(pkgDir, entries) { + /** @type {Map>} */ + const fileToEntries = new Map(); + for (const entry of entries) { + const sourceFile = path.join(pkgDir, entry.sourceFile); + if (!fs.existsSync(sourceFile)) continue; + /** @type {Set} */ + const visited = new Set(); + const queue = [sourceFile]; + while (queue.length > 0) { + const current = /** @type {string} */ (queue.pop()); + if (visited.has(current)) continue; + visited.add(current); + + let set = fileToEntries.get(current); + if (!set) { + set = new Set(); + fileToEntries.set(current, set); + } + set.add(entry.key); + + let contents; + try { + contents = fs.readFileSync(current, 'utf8'); + } catch { + continue; + } + + for (const spec of collectRelativeSpecifiers(contents)) { + const resolved = resolveSourcePath(current, spec); + if (resolved) queue.push(resolved); + } + } + } + return fileToEntries; +} + +/** + * @param {string} pkgDir + * @param {EntryInfo[]} entries + * @returns {Map>} + */ +function getFileToEntriesMap(pkgDir, entries) { + let cached = bundleCache.get(pkgDir); + if (!cached) { + cached = buildFileToEntriesMap(pkgDir, entries); + bundleCache.set(pkgDir, cached); + } + return cached; +} + +/** + * Find which entry an import targets based on its subpath. Returns undefined + * when the import doesn't match any declared entry. + * + * @param {string} subPath - The part after the package name, without leading slash. Empty for the root entry. + * @param {EntryInfo[]} entries + * @returns {EntryInfo | undefined} + */ +function findEntryForImport(subPath, entries) { + const key = subPath ? `./${subPath}` : '.'; + return entries.find(e => e.key === key); +} + +/** @type {import('eslint').Rule.RuleModule} */ +module.exports = { + meta: { + type: 'problem', + messages: { + sameEntrySelfImport: + "Do not import from your own package '{{packageName}}'. This causes a circular dependency because '{{entry}}' re-exports this file. Switch to a relative import, or use `import type` if only types are needed (type-only imports are erased at runtime).", + crossEntrySelfImport: + "Avoid importing from your own package '{{packageName}}' via '{{importPath}}'. Even across entry points this can lead to subtle circular initialization issues. Prefer a relative import, or use `import type` if only types are needed (type-only imports are erased at runtime).", + }, + docs: { + description: + 'Disallow a package from importing itself by its own name, which causes circular initialization issues in bundled ESM.', + url: 'https://github.com/backstage/backstage/blob/master/packages/eslint-plugin/docs/rules/no-self-package-imports.md', + }, + schema: [ + { + type: 'object', + properties: { + allowCrossEntry: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + ], + }, + create(context) { + const options = context.options[0] || {}; + const allowCrossEntry = options.allowCrossEntry !== false; + + const packages = getPackages(context.getCwd()); + const filename = context.getFilename(); + const selfPkg = packages?.byPath(filename); + if (!selfPkg) { + return {}; + } + const selfName = selfPkg.packageJson.name; + const entries = readEntries(selfPkg.packageJson.exports); + const fileToEntries = getFileToEntriesMap(selfPkg.dir, entries); + const fileEntries = fileToEntries.get(filename); + + // If the file isn't part of any entry's bundle (tests, scripts, orphans), + // a self-package import from it can't create a circular-initialization + // problem in a published bundle. Skip. + if (!fileEntries || fileEntries.size === 0) { + return {}; + } + + return visitImports(context, (node, imp) => { + if (imp.type !== 'internal') return; + if (imp.packageName !== selfName) return; + // Type-only imports are erased at runtime and can't cause circular init. + if (imp.kind === 'type') return; + // Importing a non-script asset (e.g. `package.json`) doesn't go through + // the module barrel, so it can't cause circular init issues. + if (imp.path === 'package.json' || imp.path.endsWith('/package.json')) { + return; + } + + const importEntry = findEntryForImport(imp.path, entries); + if (!importEntry) return; + + const importPath = imp.path ? `${selfName}/${imp.path}` : selfName; + + if (fileEntries.has(importEntry.key)) { + context.report({ + node, + messageId: 'sameEntrySelfImport', + data: { + packageName: selfName, + entry: importEntry.key, + }, + }); + return; + } + + if (!allowCrossEntry) { + context.report({ + node, + messageId: 'crossEntrySelfImport', + data: { + packageName: selfName, + importPath, + }, + }); + } + }); + }, +}; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/package.json b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/package.json new file mode 100644 index 0000000000..7e97cf807a --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/package.json @@ -0,0 +1,12 @@ +{ + "name": "@internal/self-import-pkg", + "backstage": { + "role": "node-library" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha/index.ts", + "./testUtils": "./src/testUtils.ts", + "./package.json": "./package.json" + } +} diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/alpha/index.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/alpha/index.ts new file mode 100644 index 0000000000..a4b52bcd7e --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/alpha/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2026 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 './refs'; +export * from '../shared'; +export * from '../next'; +export type { TypeOnly } from './typeRef'; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/alpha/refs.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/alpha/refs.ts new file mode 100644 index 0000000000..f79af46aaf --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/alpha/refs.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 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 const refs = 3; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/alpha/typeRef.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/alpha/typeRef.ts new file mode 100644 index 0000000000..0fcdda5d70 --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/alpha/typeRef.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 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 type TypeOnly = { value: number }; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/index.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/index.ts new file mode 100644 index 0000000000..38a032a9d9 --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2026 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 './util'; +export * from './shared'; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/next/foo.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/next/foo.ts new file mode 100644 index 0000000000..98c11f1fda --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/next/foo.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 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 const foo = 4; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/next/index.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/next/index.ts new file mode 100644 index 0000000000..7971b0e2cd --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/next/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 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 './foo'; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/orphan.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/orphan.ts new file mode 100644 index 0000000000..9e2273e1dd --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/orphan.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 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 const orphan = 6; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/shared.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/shared.ts new file mode 100644 index 0000000000..78d0377307 --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/shared.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 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 const shared = 2; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/testUtils.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/testUtils.ts new file mode 100644 index 0000000000..f180d591e0 --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/testUtils.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 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 './testUtils/helper'; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/testUtils/helper.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/testUtils/helper.ts new file mode 100644 index 0000000000..20e9b4a712 --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/testUtils/helper.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 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 const helper = 5; diff --git a/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/util.ts b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/util.ts new file mode 100644 index 0000000000..70f0e721b9 --- /dev/null +++ b/packages/eslint-plugin/src/__fixtures__/monorepo/packages/self-import-pkg/src/util.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2026 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 const util = 1; diff --git a/packages/eslint-plugin/src/no-self-package-imports.test.ts b/packages/eslint-plugin/src/no-self-package-imports.test.ts new file mode 100644 index 0000000000..e87e41f581 --- /dev/null +++ b/packages/eslint-plugin/src/no-self-package-imports.test.ts @@ -0,0 +1,229 @@ +/* + * Copyright 2026 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 { RuleTester } from 'eslint'; +import path from 'node:path'; +import rule from '../rules/no-self-package-imports'; + +const RULE = 'no-self-package-imports'; +const FIXTURE = path.resolve(__dirname, '__fixtures__/monorepo'); +const PKG_DIR = path.join(FIXTURE, 'packages/self-import-pkg'); + +const sameEntryErr = (entry = '.') => ({ + messageId: 'sameEntrySelfImport', + data: { packageName: '@internal/self-import-pkg', entry }, +}); + +const crossEntryErr = (importPath: string) => ({ + messageId: 'crossEntrySelfImport', + data: { packageName: '@internal/self-import-pkg', importPath }, +}); + +const origDir = process.cwd(); +afterAll(() => { + process.chdir(origDir); +}); +process.chdir(FIXTURE); + +const ruleTester = new RuleTester({ + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { + sourceType: 'module', + ecmaVersion: 2021, + }, +}); + +ruleTester.run(RULE, rule, { + valid: [ + // Relative imports are always fine. + { + code: `import { foo } from './local'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + }, + // Imports of other packages are unaffected. + { + code: `import { foo } from '@internal/bar'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + }, + { + code: `import { foo } from 'react'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + }, + // `src/alpha/refs.ts` is only in the `./alpha` bundle; importing from the + // root entry `.` is a cross-entry reference, which is allowed by default. + { + code: `import { foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/alpha/refs.ts'), + }, + // `src/index.ts` is only in the `.` bundle; importing from `./alpha` is + // cross-entry. + { + code: `import { foo } from '@internal/self-import-pkg/alpha'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + }, + { + code: `import { foo } from '@internal/self-import-pkg/testUtils'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + }, + // `src/next/foo.ts` is physically under `src/` but only re-exported from + // `./alpha` (via `src/alpha/index.ts` → `../next`). The rule follows the + // actual barrel graph rather than the directory layout, so importing + // from the root entry is correctly classified as cross-entry. + { + code: `import { foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/next/foo.ts'), + }, + // `package.json` imports are exempt since they don't go through the + // module barrel. + { + code: `import pkg from '@internal/self-import-pkg/package.json'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + }, + // Files that aren't reachable from any entry (tests, scripts, orphans) + // can't cause circular-init errors in the published bundle, so they're + // skipped entirely. + { + code: `import { foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/index.test.ts'), + }, + { + code: `import { foo } from '@internal/self-import-pkg/alpha'`, + filename: path.join(PKG_DIR, 'src/index.test.ts'), + }, + { + code: `import { foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/orphan.ts'), + }, + // Dynamic imports in a test file still count as orphan, since the test + // file itself isn't part of any entry's bundle. + { + code: `const m = import('@internal/self-import-pkg')`, + filename: path.join(PKG_DIR, 'src/alpha/refs.test.ts'), + }, + // `import type` is erased at runtime and can't create circular + // initialization issues, so it's always allowed. + { + code: `import type { Foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + }, + { + code: `import type { Foo } from '@internal/self-import-pkg/alpha'`, + filename: path.join(PKG_DIR, 'src/alpha/refs.ts'), + }, + // `export type { ... } from` is also a type-only statement: the TS AST + // marks it with `exportKind: 'type'`, and the emitted JS has no runtime + // edge. Both same-entry and cross-entry forms must be skipped. + { + code: `export type { Foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + }, + { + code: `export type { Foo } from '@internal/self-import-pkg/alpha'`, + filename: path.join(PKG_DIR, 'src/alpha/refs.ts'), + }, + // `src/alpha/typeRef.ts` is only reachable from the `./alpha` barrel via + // an `export type { ... } from './typeRef'` edge. Since type-only edges + // are erased at runtime, the file isn't part of any entry's bundle and + // self-imports from it must be skipped as orphans. + { + code: `import { foo } from '@internal/self-import-pkg/alpha'`, + filename: path.join(PKG_DIR, 'src/alpha/typeRef.ts'), + }, + { + code: `import { foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/alpha/typeRef.ts'), + }, + ], + invalid: [ + // Same-entry self-imports are always errors because they create circular + // module graphs inside a bundle. + { + code: `import { foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + errors: [sameEntryErr('.')], + }, + { + code: `import { foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/util.ts'), + errors: [sameEntryErr('.')], + }, + { + code: `export { foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + errors: [sameEntryErr('.')], + }, + { + code: `const x = require('@internal/self-import-pkg')`, + filename: path.join(PKG_DIR, 'src/index.ts'), + errors: [sameEntryErr('.')], + }, + { + code: `const m = import('@internal/self-import-pkg')`, + filename: path.join(PKG_DIR, 'src/util.ts'), + errors: [sameEntryErr('.')], + }, + // Files in a non-root entry's bundle importing that same entry are + // flagged. + { + code: `import { foo } from '@internal/self-import-pkg/alpha'`, + filename: path.join(PKG_DIR, 'src/alpha/refs.ts'), + errors: [sameEntryErr('./alpha')], + }, + { + code: `import { foo } from '@internal/self-import-pkg/testUtils'`, + filename: path.join(PKG_DIR, 'src/testUtils.ts'), + errors: [sameEntryErr('./testUtils')], + }, + { + code: `import { foo } from '@internal/self-import-pkg/testUtils'`, + filename: path.join(PKG_DIR, 'src/testUtils/helper.ts'), + errors: [sameEntryErr('./testUtils')], + }, + // `src/next/foo.ts` is actually in the `./alpha` bundle via barrel + // re-exports, so importing `./alpha` from it is same-entry — even though + // the directory layout might suggest otherwise. + { + code: `import { foo } from '@internal/self-import-pkg/alpha'`, + filename: path.join(PKG_DIR, 'src/next/foo.ts'), + errors: [sameEntryErr('./alpha')], + }, + // `src/shared.ts` is re-exported by both the root and alpha entries, so + // either target is same-entry. + { + code: `import { foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/shared.ts'), + errors: [sameEntryErr('.')], + }, + { + code: `import { foo } from '@internal/self-import-pkg/alpha'`, + filename: path.join(PKG_DIR, 'src/shared.ts'), + errors: [sameEntryErr('./alpha')], + }, + // With `allowCrossEntry: false`, cross-entry imports are also flagged. + { + code: `import { foo } from '@internal/self-import-pkg'`, + filename: path.join(PKG_DIR, 'src/alpha/refs.ts'), + options: [{ allowCrossEntry: false }], + errors: [crossEntryErr('@internal/self-import-pkg')], + }, + { + code: `import { foo } from '@internal/self-import-pkg/alpha'`, + filename: path.join(PKG_DIR, 'src/index.ts'), + options: [{ allowCrossEntry: false }], + errors: [crossEntryErr('@internal/self-import-pkg/alpha')], + }, + ], +}); diff --git a/packages/filter-predicates/CHANGELOG.md b/packages/filter-predicates/CHANGELOG.md index 646732a764..803a327a38 100644 --- a/packages/filter-predicates/CHANGELOG.md +++ b/packages/filter-predicates/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/filter-predicates +## 0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + ## 0.1.2 ### Patch Changes diff --git a/packages/filter-predicates/package.json b/packages/filter-predicates/package.json index 1c9fae6665..b1be20e36b 100644 --- a/packages/filter-predicates/package.json +++ b/packages/filter-predicates/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/filter-predicates", - "version": "0.1.2", + "version": "0.1.3-next.0", "description": "A library for expressing filter predicates and evaluating them against values", "backstage": { "role": "common-library" diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index 6b648552d4..a05adba6ba 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/frontend-app-api +## 0.16.3-next.1 + +### Patch Changes + +- b6ca666: Invalid feature flag declarations no longer crash the app during bootstrap. They are now reported through the error collector and skipped, letting the rest of the app load normally. +- Updated dependencies + - @backstage/frontend-defaults@0.5.2-next.1 + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + +## 0.16.3-next.0 + +### Patch Changes + +- f79eaf2: Internal cleanup of routing utilities. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/frontend-defaults@0.5.2-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 0.16.2 ### Patch Changes diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 224af139cf..ed2487f426 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-app-api", - "version": "0.16.2", + "version": "0.16.3-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-app-api/report.api.md b/packages/frontend-app-api/report.api.md index b6b502e2da..d3026bf538 100644 --- a/packages/frontend-app-api/report.api.md +++ b/packages/frontend-app-api/report.api.md @@ -148,6 +148,13 @@ export type AppErrorTypes = { bootstrapPluginId: string; }; }; + FEATURE_FLAG_INVALID: { + context: { + pluginId: string; + flagName: string; + error: Error; + }; + }; ROUTE_DUPLICATE: { context: { routeId: string; diff --git a/packages/frontend-app-api/src/wiring/apiFactories.test.ts b/packages/frontend-app-api/src/wiring/apiFactories.test.ts new file mode 100644 index 0000000000..9198af6f9c --- /dev/null +++ b/packages/frontend-app-api/src/wiring/apiFactories.test.ts @@ -0,0 +1,297 @@ +/* + * Copyright 2025 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 { + createFrontendPlugin, + createFrontendModule, + featureFlagsApiRef, + createApiRef, + type FeatureFlagsApi, +} from '@backstage/frontend-plugin-api'; +import { + registerFeatureFlagDeclarationsInHolder, + wrapFeatureFlagApiFactory, +} from './apiFactories'; +import { createErrorCollector } from './createErrorCollector'; + +function createValidatingMockFeatureFlagsApi(): FeatureFlagsApi & { + flags: Array<{ name: string; pluginId: string }>; +} { + const flagNameRegex = /^[a-z]+[a-z0-9-]+$/; + const flags = new Array<{ name: string; pluginId: string }>(); + return { + flags, + registerFlag(flag) { + if (!flagNameRegex.test(flag.name)) { + throw new Error( + `The '${flag.name}' feature flag must start with a lowercase letter and only contain lowercase letters, numbers and hyphens.`, + ); + } + flags.push(flag); + }, + getRegisteredFlags() { + return flags; + }, + isActive() { + return false; + }, + save() {}, + }; +} + +describe('registerFeatureFlagDeclarationsInHolder', () => { + it('should isolate invalid flags and still register valid ones from a plugin', () => { + const featureFlagsApi = createValidatingMockFeatureFlagsApi(); + const collector = createErrorCollector(); + + const plugin = createFrontendPlugin({ + pluginId: 'test', + featureFlags: [ + { name: 'valid-flag' }, + { name: 'bad/flag' }, + { name: 'another-valid' }, + ], + extensions: [], + }); + + registerFeatureFlagDeclarationsInHolder( + { + get: ref => + (ref.id === featureFlagsApiRef.id + ? featureFlagsApi + : undefined) as any, + }, + [plugin], + collector, + ); + + expect(featureFlagsApi.flags).toEqual([ + expect.objectContaining({ name: 'valid-flag', pluginId: 'test' }), + expect.objectContaining({ name: 'another-valid', pluginId: 'test' }), + ]); + + const errors = collector.collectErrors()!; + expect(errors).toHaveLength(1); + expect(errors[0]).toMatchObject({ + code: 'FEATURE_FLAG_INVALID', + context: { pluginId: 'test', flagName: 'bad/flag' }, + }); + expect(errors[0].message).toContain("Plugin 'test'"); + expect(errors[0].message).toContain("'bad/flag'"); + }); + + it('should report each invalid flag independently across multiple plugins', () => { + const featureFlagsApi = createValidatingMockFeatureFlagsApi(); + const collector = createErrorCollector(); + + const pluginA = createFrontendPlugin({ + pluginId: 'alpha', + featureFlags: [{ name: 'ok-flag' }, { name: 'UPPER' }], + extensions: [], + }); + const pluginB = createFrontendPlugin({ + pluginId: 'beta', + featureFlags: [{ name: 'x/y' }, { name: 'good-one' }], + extensions: [], + }); + + registerFeatureFlagDeclarationsInHolder( + { + get: ref => + (ref.id === featureFlagsApiRef.id + ? featureFlagsApi + : undefined) as any, + }, + [pluginA, pluginB], + collector, + ); + + expect(featureFlagsApi.flags).toEqual([ + expect.objectContaining({ name: 'ok-flag', pluginId: 'alpha' }), + expect.objectContaining({ name: 'good-one', pluginId: 'beta' }), + ]); + + const errors = collector.collectErrors()!; + expect(errors).toHaveLength(2); + expect(errors).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + code: 'FEATURE_FLAG_INVALID', + context: expect.objectContaining({ + pluginId: 'alpha', + flagName: 'UPPER', + }), + }), + expect.objectContaining({ + code: 'FEATURE_FLAG_INVALID', + context: expect.objectContaining({ + pluginId: 'beta', + flagName: 'x/y', + }), + }), + ]), + ); + }); + + it('should isolate invalid flags declared by a frontend module', () => { + const featureFlagsApi = createValidatingMockFeatureFlagsApi(); + const collector = createErrorCollector(); + + const mod = createFrontendModule({ + pluginId: 'my-plugin', + featureFlags: [{ name: 'mod-valid' }, { name: 'mod/invalid' }], + extensions: [], + }); + + registerFeatureFlagDeclarationsInHolder( + { + get: ref => + (ref.id === featureFlagsApiRef.id + ? featureFlagsApi + : undefined) as any, + }, + [mod], + collector, + ); + + expect(featureFlagsApi.flags).toEqual([ + expect.objectContaining({ name: 'mod-valid', pluginId: 'my-plugin' }), + ]); + + const errors = collector.collectErrors()!; + expect(errors).toHaveLength(1); + expect(errors[0]).toMatchObject({ + code: 'FEATURE_FLAG_INVALID', + context: { pluginId: 'my-plugin', flagName: 'mod/invalid' }, + }); + expect(errors[0].message).toContain("Module for plugin 'my-plugin'"); + expect(errors[0].message).toContain("'mod/invalid'"); + }); + + it('should isolate non-validation errors thrown by registerFlag', () => { + const featureFlagsApi: FeatureFlagsApi = { + registerFlag() { + throw new Error('database connection lost'); + }, + getRegisteredFlags: () => [], + isActive: () => false, + save() {}, + }; + const collector = createErrorCollector(); + + const plugin = createFrontendPlugin({ + pluginId: 'broken', + featureFlags: [{ name: 'any-flag' }], + extensions: [], + }); + + registerFeatureFlagDeclarationsInHolder( + { + get: ref => + (ref.id === featureFlagsApiRef.id + ? featureFlagsApi + : undefined) as any, + }, + [plugin], + collector, + ); + + const errors = collector.collectErrors()!; + expect(errors).toHaveLength(1); + expect(errors[0]).toMatchObject({ + code: 'FEATURE_FLAG_INVALID', + context: expect.objectContaining({ + pluginId: 'broken', + flagName: 'any-flag', + }), + }); + expect(errors[0].message).toContain('database connection lost'); + }); +}); + +describe('wrapFeatureFlagApiFactory', () => { + it('should not wrap factories for non-feature-flag APIs', () => { + const otherApiRef = createApiRef<{}>({ id: 'test.other' }); + const factory = { + api: otherApiRef, + deps: {}, + factory: () => ({}), + }; + const collector = createErrorCollector(); + + const result = wrapFeatureFlagApiFactory(factory, [], collector); + expect(result).toBe(factory); + }); + + it('should wrap the feature flags factory and isolate invalid flags', () => { + const featureFlagsApi = createValidatingMockFeatureFlagsApi(); + const collector = createErrorCollector(); + + const plugin = createFrontendPlugin({ + pluginId: 'test', + featureFlags: [{ name: 'good-flag' }, { name: 'bad/flag' }], + extensions: [], + }); + + const factory = { + api: featureFlagsApiRef, + deps: {}, + factory: () => featureFlagsApi, + }; + + const wrapped = wrapFeatureFlagApiFactory(factory, [plugin], collector); + expect(wrapped).not.toBe(factory); + + const result = wrapped.factory({}); + expect(result).toBe(featureFlagsApi); + expect(featureFlagsApi.flags).toEqual([ + expect.objectContaining({ name: 'good-flag', pluginId: 'test' }), + ]); + + const errors = collector.collectErrors()!; + expect(errors).toHaveLength(1); + expect(errors[0]).toMatchObject({ + code: 'FEATURE_FLAG_INVALID', + context: { pluginId: 'test', flagName: 'bad/flag' }, + }); + }); + + it('should not throw from the wrapped factory when flags are invalid', () => { + const featureFlagsApi = createValidatingMockFeatureFlagsApi(); + const collector = createErrorCollector(); + + const plugin = createFrontendPlugin({ + pluginId: 'crashy', + featureFlags: [{ name: 'inspt/show-test-banner' }], + extensions: [], + }); + + const factory = { + api: featureFlagsApiRef, + deps: {}, + factory: () => featureFlagsApi, + }; + + const wrapped = wrapFeatureFlagApiFactory(factory, [plugin], collector); + + expect(() => wrapped.factory({})).not.toThrow(); + expect(featureFlagsApi.flags).toEqual([]); + + const errors = collector.collectErrors()!; + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe('FEATURE_FLAG_INVALID'); + }); +}); diff --git a/packages/frontend-app-api/src/wiring/apiFactories.ts b/packages/frontend-app-api/src/wiring/apiFactories.ts index 6ccc75b9c1..1fdc747f51 100644 --- a/packages/frontend-app-api/src/wiring/apiFactories.ts +++ b/packages/frontend-app-api/src/wiring/apiFactories.ts @@ -51,10 +51,11 @@ export type ApiFactoryEntry = { export function registerFeatureFlagDeclarationsInHolder( apis: ApiHolder, features: FrontendFeature[], + collector: ErrorCollector, ) { const featureFlagApi = apis.get(featureFlagsApiRef); if (featureFlagApi) { - registerFeatureFlagDeclarations(featureFlagApi, features); + registerFeatureFlagDeclarations(featureFlagApi, features, collector); } } @@ -65,6 +66,7 @@ export function registerFeatureFlagDeclarationsInHolder( export function wrapFeatureFlagApiFactory( factory: AnyApiFactory, features: FrontendFeature[], + collector: ErrorCollector, ) { if (factory.api.id !== featureFlagsApiRef.id) { return factory; @@ -76,7 +78,7 @@ export function wrapFeatureFlagApiFactory( const featureFlagApi = factory.factory( deps, ) as typeof featureFlagsApiRef.T; - registerFeatureFlagDeclarations(featureFlagApi, features); + registerFeatureFlagDeclarations(featureFlagApi, features, collector); return featureFlagApi; }, } as AnyApiFactory; @@ -137,7 +139,11 @@ export function syncFinalApiFactories(options: { return true; }); const changedFactories = changedEntries.map(entry => - wrapFeatureFlagApiFactory(entry.factory, options.features), + wrapFeatureFlagApiFactory( + entry.factory, + options.features, + options.collector, + ), ); options.appApiRegistry.setAll(changedFactories); options.apiResolver.invalidate( @@ -174,25 +180,39 @@ const EMPTY_API_HOLDER: ApiHolder = { function registerFeatureFlagDeclarations( featureFlagApi: typeof featureFlagsApiRef.T, features: FrontendFeature[], + collector: ErrorCollector, ) { for (const feature of features) { + let pluginId: string | undefined; + let flags: Array<{ name: string; description?: string }> | undefined; + let source: string | undefined; + if (OpaqueFrontendPlugin.isType(feature)) { - OpaqueFrontendPlugin.toInternal(feature).featureFlags.forEach(flag => - featureFlagApi.registerFlag({ - name: flag.name, - description: flag.description, - pluginId: feature.id, - }), - ); + pluginId = feature.id; + flags = OpaqueFrontendPlugin.toInternal(feature).featureFlags; + source = 'Plugin'; + } else if (isInternalFrontendModule(feature)) { + pluginId = feature.pluginId; + flags = toInternalFrontendModule(feature).featureFlags; + source = 'Module for plugin'; } - if (isInternalFrontendModule(feature)) { - toInternalFrontendModule(feature).featureFlags.forEach(flag => - featureFlagApi.registerFlag({ - name: flag.name, - description: flag.description, - pluginId: feature.pluginId, - }), - ); + + if (pluginId && flags && source) { + for (const flag of flags) { + try { + featureFlagApi.registerFlag({ + name: flag.name, + description: flag.description, + pluginId, + }); + } catch (error) { + collector.report({ + code: 'FEATURE_FLAG_INVALID', + message: `${source} '${pluginId}' declared invalid feature flag '${flag.name}': ${error}`, + context: { pluginId, flagName: flag.name, error: error as Error }, + }); + } + } } } } diff --git a/packages/frontend-app-api/src/wiring/createErrorCollector.ts b/packages/frontend-app-api/src/wiring/createErrorCollector.ts index 7077e0e9c4..5cf839b286 100644 --- a/packages/frontend-app-api/src/wiring/createErrorCollector.ts +++ b/packages/frontend-app-api/src/wiring/createErrorCollector.ts @@ -97,6 +97,9 @@ export type AppErrorTypes = { bootstrapPluginId: string; }; }; + FEATURE_FLAG_INVALID: { + context: { pluginId: string; flagName: string; error: Error }; + }; // routing ROUTE_DUPLICATE: { context: { routeId: string }; diff --git a/packages/frontend-app-api/src/wiring/prepareSpecializedApp.tsx b/packages/frontend-app-api/src/wiring/prepareSpecializedApp.tsx index 3a09804a18..517abe3669 100644 --- a/packages/frontend-app-api/src/wiring/prepareSpecializedApp.tsx +++ b/packages/frontend-app-api/src/wiring/prepareSpecializedApp.tsx @@ -342,7 +342,7 @@ export function prepareSpecializedApp( if (providedApis) { // Reused session state already carries a fully prepared API holder, so the // bootstrap path only needs to register feature flag declarations on top. - registerFeatureFlagDeclarationsInHolder(providedApis, features); + registerFeatureFlagDeclarationsInHolder(providedApis, features, collector); } else { // Bootstrap materializes only the immediately visible API factories. Any // predicate-gated API roots are revisited during finalization. @@ -355,7 +355,7 @@ export function prepareSpecializedApp( }); const apiFactories = Array.from( bootstrapApiFactoryEntries.values(), - entry => wrapFeatureFlagApiFactory(entry.factory, features), + entry => wrapFeatureFlagApiFactory(entry.factory, features, collector), ); appApiRegistry.registerAll(apiFactories); } diff --git a/packages/frontend-defaults/CHANGELOG.md b/packages/frontend-defaults/CHANGELOG.md index 1607fc9779..d6cebf4e3f 100644 --- a/packages/frontend-defaults/CHANGELOG.md +++ b/packages/frontend-defaults/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/frontend-defaults +## 0.5.2-next.1 + +### Patch Changes + +- 482cc59: Invalid feature flag declarations are now treated as warnings rather than errors, letting the app load normally. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/frontend-app-api@0.16.3-next.1 + - @backstage/plugin-app@0.4.6-next.1 + +## 0.5.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/errors@1.3.1-next.0 + - @backstage/plugin-app@0.4.6-next.0 + - @backstage/frontend-app-api@0.16.3-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/config@1.3.8-next.0 + ## 0.5.1 ### Patch Changes diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index 9c618d9656..02b21af0a6 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-defaults", - "version": "0.5.1", + "version": "0.5.2-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-defaults/src/maybeCreateErrorPage.tsx b/packages/frontend-defaults/src/maybeCreateErrorPage.tsx index 8c058b838f..a5463d4846 100644 --- a/packages/frontend-defaults/src/maybeCreateErrorPage.tsx +++ b/packages/frontend-defaults/src/maybeCreateErrorPage.tsx @@ -26,6 +26,7 @@ const DEFAULT_WARNING_CODES: Array = [ 'EXTENSION_OUTPUT_IGNORED', 'EXTENSION_BOOTSTRAP_PREDICATE_IGNORED', 'EXTENSION_BOOTSTRAP_API_UNAVAILABLE', + 'FEATURE_FLAG_INVALID', ]; function AppErrorItem(props: { error: AppError }): JSX.Element { diff --git a/packages/frontend-dev-utils/CHANGELOG.md b/packages/frontend-dev-utils/CHANGELOG.md index e1950c2ea7..f0eb766ecf 100644 --- a/packages/frontend-dev-utils/CHANGELOG.md +++ b/packages/frontend-dev-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/frontend-dev-utils +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-app@0.4.6-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/frontend-defaults@0.5.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/packages/frontend-dev-utils/package.json b/packages/frontend-dev-utils/package.json index 76dbab4920..b2ae8d6b8e 100644 --- a/packages/frontend-dev-utils/package.json +++ b/packages/frontend-dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-dev-utils", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "Utilities for developing Backstage frontend plugins using the new frontend system.", "backstage": { "role": "web-library" diff --git a/packages/frontend-dynamic-feature-loader/CHANGELOG.md b/packages/frontend-dynamic-feature-loader/CHANGELOG.md index b544986b33..7837f7ccde 100644 --- a/packages/frontend-dynamic-feature-loader/CHANGELOG.md +++ b/packages/frontend-dynamic-feature-loader/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/frontend-dynamic-feature-loader +## 0.1.12-next.0 + +### Patch Changes + +- 41070b8: Upgraded `@module-federation/enhanced`, `@module-federation/runtime`, and `@module-federation/sdk` from `^0.21.6` to `^2.3.3` to address known vulnerabilities. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/module-federation-common@0.1.4-next.0 + - @backstage/config@1.3.8-next.0 + ## 0.1.11 ### Patch Changes diff --git a/packages/frontend-dynamic-feature-loader/package.json b/packages/frontend-dynamic-feature-loader/package.json index 94fb9b8e7c..377c694490 100644 --- a/packages/frontend-dynamic-feature-loader/package.json +++ b/packages/frontend-dynamic-feature-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-dynamic-feature-loader", - "version": "0.1.11", + "version": "0.1.12-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-internal/CHANGELOG.md b/packages/frontend-internal/CHANGELOG.md index a75ff1a6d6..17e80c3e57 100644 --- a/packages/frontend-internal/CHANGELOG.md +++ b/packages/frontend-internal/CHANGELOG.md @@ -1,5 +1,15 @@ # @internal/frontend +## 0.0.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 0.0.19 ### Patch Changes diff --git a/packages/frontend-internal/package.json b/packages/frontend-internal/package.json index 2e03a7e15a..6d16777c8e 100644 --- a/packages/frontend-internal/package.json +++ b/packages/frontend-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/frontend", - "version": "0.0.19", + "version": "0.0.20-next.0", "backstage": { "role": "web-library", "inline": true diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index 27f044e266..d5e8e973f2 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/frontend-plugin-api +## 0.17.0-next.1 + +### Patch Changes + +- ab1cdbb: Removed a handful of internal imports that referenced the package by its own name. Value imports were switched to relative paths, and type-only imports to `import type`. These self-referential imports could trigger circular initialization errors in bundled ESM and when the package was loaded via `jest.requireActual` — most visibly `Cannot access '_AppRootElementBlueprintesm' before initialization` from `@backstage/frontend-plugin-api`. There are no user-facing API changes. + +## 0.17.0-next.0 + +### Minor Changes + +- 8738203: **BREAKING**: Removed the deprecated property form of `PortableSchema.schema`. The `schema` member is now a plain method that must be called as `schema()` — direct property access like `schema.type` or `schema.properties` is no longer supported. + +### Patch Changes + +- cad156e: Replaced old config schema values from existing extensions and blueprints. +- 72a552f: Updated error messages and deprecation warnings to clarify that the `zod/v4` subpath export from the Zod v3 package is not supported by `configSchema`, since it does not include JSON Schema conversion. The `zod` dependency has been bumped to `^4.0.0`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 0.16.0 ### Minor Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 237e5d01fd..06a12556fe 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-plugin-api", - "version": "0.16.0", + "version": "0.17.0-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.tsx b/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.tsx index 955abce136..730af779ab 100644 --- a/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.tsx +++ b/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { ExtensionBoundary } from '@backstage/frontend-plugin-api'; +import { ExtensionBoundary } from '../components/ExtensionBoundary'; import { coreExtensionData, createExtensionBlueprint } from '../wiring'; /** diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index d9e4148da1..a64846f6d5 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/frontend-test-utils +## 0.5.3-next.1 + +### Patch Changes + +- fa363f9: Added support for `ExternalRouteRef` in the `mountedRoutes` option of `renderInTestApp` and `renderTestApp`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.1 + - @backstage/core-plugin-api@1.12.6-next.1 + - @backstage/frontend-app-api@0.16.3-next.1 + - @backstage/plugin-app@0.4.6-next.1 + - @backstage/plugin-permission-common@0.9.9-next.1 + +## 0.5.3-next.0 + +### Patch Changes + +- 0c298f7: Removed internal `mockWithApiFactory` helper in favor of using `attachMockApiFactory` directly. +- 9279ea8: Added explicit type annotations to `.map()` callback parameters in `renderInTestApp` to avoid implicit `any` errors with newer TypeScript versions. +- Updated dependencies + - @backstage/plugin-app@0.4.6-next.0 + - @backstage/frontend-app-api@0.16.3-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/filter-predicates@0.1.3-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/plugin-app-react@0.2.3-next.0 + - @backstage/test-utils@1.7.18-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-permission-react@0.5.1-next.0 + ## 0.5.2 ### Patch Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index 741e66313d..b0156a9d01 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-test-utils", - "version": "0.5.2", + "version": "0.5.3-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-test-utils/report.api.md b/packages/frontend-test-utils/report.api.md index 6d9f8964b1..d24046953f 100644 --- a/packages/frontend-test-utils/report.api.md +++ b/packages/frontend-test-utils/report.api.md @@ -26,6 +26,7 @@ import { EvaluatePermissionResponse } from '@backstage/plugin-permission-common' import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; import { ExtensionDefinition } from '@backstage/frontend-plugin-api'; import { ExtensionDefinitionParameters } from '@backstage/frontend-plugin-api'; +import { ExternalRouteRef } from '@backstage/frontend-plugin-api'; import { FeatureFlag } from '@backstage/frontend-plugin-api'; import { FeatureFlagsApi } from '@backstage/frontend-plugin-api'; import { FeatureFlagsSaveOptions } from '@backstage/frontend-plugin-api'; @@ -444,7 +445,7 @@ export type RenderTestAppOptions = { features?: FrontendFeature[]; initialRouteEntries?: string[]; mountedRoutes?: { - [path: string]: RouteRef; + [path: string]: RouteRef | ExternalRouteRef; }; apis?: readonly [...TestApiPairs]; }; @@ -473,7 +474,7 @@ export type TestApiProviderProps = { // @public export type TestAppOptions = { mountedRoutes?: { - [path: string]: RouteRef; + [path: string]: RouteRef | ExternalRouteRef; }; config?: JsonObject; features?: FrontendFeature[]; diff --git a/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx b/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx index c9d90715f6..aa3236be86 100644 --- a/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx +++ b/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx @@ -17,7 +17,12 @@ import { useCallback } from 'react'; import { screen, fireEvent } from '@testing-library/react'; import { mockApis, TestApiProvider } from '@backstage/frontend-test-utils'; -import { useAnalytics } from '@backstage/frontend-plugin-api'; +import { + useAnalytics, + createRouteRef, + createExternalRouteRef, + useRouteRef, +} from '@backstage/frontend-plugin-api'; import { Routes, Route } from 'react-router-dom'; import { renderInTestApp } from './renderInTestApp'; @@ -108,4 +113,40 @@ describe('renderInTestApp', () => { ]), ); }); + + it('should allow mounting route refs', () => { + const testRouteRef = createRouteRef({ + params: ['name'], + }); + + const LinkComponent = () => { + const link = useRouteRef(testRouteRef); + return
Link: {link?.({ name: 'test-name' }) ?? 'none'}
; + }; + + renderInTestApp(, { + mountedRoutes: { + '/test-path/:name': testRouteRef, + }, + }); + + expect(screen.getByText('Link: /test-path/test-name')).toBeInTheDocument(); + }); + + it('should allow mounting external route refs', () => { + const externalRef = createExternalRouteRef({ params: ['name'] }); + + const ExternalLinkComponent = () => { + const link = useRouteRef(externalRef); + return
Link: {link?.({ name: 'test' }) ?? 'none'}
; + }; + + renderInTestApp(, { + mountedRoutes: { + '/items/:name': externalRef, + }, + }); + + expect(screen.getByText('Link: /items/test')).toBeInTheDocument(); + }); }); diff --git a/packages/frontend-test-utils/src/app/renderInTestApp.tsx b/packages/frontend-test-utils/src/app/renderInTestApp.tsx index bdb9929635..fa4dc2023a 100644 --- a/packages/frontend-test-utils/src/app/renderInTestApp.tsx +++ b/packages/frontend-test-utils/src/app/renderInTestApp.tsx @@ -32,6 +32,8 @@ import { FrontendFeature, createFrontendModule, createApiFactory, + createRouteRef, + ExternalRouteRef, type ApiRef, } from '@backstage/frontend-plugin-api'; import { RouterBlueprint } from '@backstage/plugin-app-react'; @@ -40,6 +42,7 @@ import { getMockApiFactory } from '../apis/MockWithApiFactory'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import type { CreateSpecializedAppInternalOptions } from '../../../frontend-app-api/src/wiring/createSpecializedApp'; import { TestApiPairs } from '../apis/TestApiProvider'; +import { OpaqueExternalRouteRef } from '@internal/frontend'; const DEFAULT_MOCK_CONFIG = { app: { baseUrl: 'http://localhost:3000' }, @@ -53,7 +56,7 @@ const DEFAULT_MOCK_CONFIG = { export type TestAppOptions = { /** * An object of paths to mount route ref on, with the key being the path and the value - * being the RouteRef that the path will be bound to. This allows the route refs to be + * being the route ref that the path will be bound to. This allows the route refs to be * used by `useRouteRef` in the rendered elements. * * @example @@ -67,7 +70,7 @@ export type TestAppOptions = { * const link = useRouteRef(myRouteRef) * ``` */ - mountedRoutes?: { [path: string]: RouteRef }; + mountedRoutes?: { [path: string]: RouteRef | ExternalRouteRef }; /** * Additional configuration passed to the app when rendering elements inside it. @@ -180,9 +183,20 @@ export function renderInTestApp( }), ]; + const externalBindings = new Map(); + if (options?.mountedRoutes) { - for (const [path, routeRef] of Object.entries(options.mountedRoutes)) { - // TODO(Rugvip): add support for external route refs + for (const [path, optionRef] of Object.entries(options.mountedRoutes)) { + let routeRef: RouteRef; + + if (OpaqueExternalRouteRef.isType(optionRef)) { + // Create an actual route ref for the external route, then bind the external ref to it + routeRef = createRouteRef(); + externalBindings.set(optionRef, routeRef); + } else { + routeRef = optionRef; + } + extensions.push( createExtension({ kind: 'test-route', @@ -253,6 +267,14 @@ export function renderInTestApp( return createApiFactory(apiRef, implementation); }), }, + bindRoutes: + externalBindings.size > 0 + ? ({ bind }) => { + for (const [externalRef, targetRef] of externalBindings) { + bind({ ref: externalRef }, { ref: targetRef }); + } + } + : undefined, } as CreateSpecializedAppInternalOptions).finalize(); return render( diff --git a/packages/frontend-test-utils/src/app/renderTestApp.tsx b/packages/frontend-test-utils/src/app/renderTestApp.tsx index 7708fa4220..858f6d2cfe 100644 --- a/packages/frontend-test-utils/src/app/renderTestApp.tsx +++ b/packages/frontend-test-utils/src/app/renderTestApp.tsx @@ -25,6 +25,8 @@ import { ExtensionDefinition, FrontendFeature, RouteRef, + ExternalRouteRef, + createRouteRef, type ApiRef, } from '@backstage/frontend-plugin-api'; import { render, type RenderResult } from '@testing-library/react'; @@ -37,6 +39,7 @@ import { getMockApiFactory } from '../apis/MockWithApiFactory'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import type { CreateSpecializedAppInternalOptions } from '../../../frontend-app-api/src/wiring/createSpecializedApp'; import { TestApiPairs } from '../apis/TestApiProvider'; +import { OpaqueExternalRouteRef } from '@internal/frontend'; const DEFAULT_MOCK_CONFIG = { app: { baseUrl: 'http://localhost:3000' }, @@ -70,7 +73,7 @@ export type RenderTestAppOptions = { /** * An object of paths to mount route refs on, with the key being the path and - * the value being the RouteRef that the path will be bound to. This allows + * the value being the route ref that the path will be bound to. This allows * the route refs to be used by `useRouteRef` in the rendered elements. * * @example @@ -83,7 +86,7 @@ export type RenderTestAppOptions = { * }) * ``` */ - mountedRoutes?: { [path: string]: RouteRef }; + mountedRoutes?: { [path: string]: RouteRef | ExternalRouteRef }; /** * API overrides to provide to the test app. Use `mockApis` helpers @@ -121,8 +124,20 @@ export function renderTestApp( ): RenderResult { const extensions = [...(options?.extensions ?? [])]; + const externalBindings = new Map(); + if (options?.mountedRoutes) { - for (const [path, routeRef] of Object.entries(options.mountedRoutes)) { + for (const [path, optionRef] of Object.entries(options.mountedRoutes)) { + let routeRef: RouteRef; + + if (OpaqueExternalRouteRef.isType(optionRef)) { + // Create an actual route ref for the external route, then bind the external ref to it + routeRef = createRouteRef(); + externalBindings.set(optionRef, routeRef); + } else { + routeRef = optionRef; + } + extensions.push( createExtension({ kind: 'test-route', @@ -193,6 +208,14 @@ export function renderTestApp( return createApiFactory(apiRef, implementation); }), }, + bindRoutes: + externalBindings.size > 0 + ? ({ bind }) => { + for (const [externalRef, targetRef] of externalBindings) { + bind({ ref: externalRef }, { ref: targetRef }); + } + } + : undefined, } as CreateSpecializedAppInternalOptions).finalize(); return render( diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md index 0da98dc1f4..faf5838d00 100644 --- a/packages/integration-aws-node/CHANGELOG.md +++ b/packages/integration-aws-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/integration-aws-node +## 0.1.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + ## 0.1.21 ### Patch Changes diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index 09e0b03e7c..5ef8687a09 100644 --- a/packages/integration-aws-node/package.json +++ b/packages/integration-aws-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-aws-node", - "version": "0.1.21", + "version": "0.1.22-next.0", "description": "Helpers for fetching AWS account credentials", "backstage": { "role": "node-library" diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 31b34f7cb9..73cfe08917 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration-react +## 1.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + ## 1.2.17 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 896e236b87..f0ff6e4c60 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.2.17", + "version": "1.2.18-next.0", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 0962988e8b..d777d0676f 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/integration +## 2.0.2-next.1 + +### Patch Changes + +- 6b112d3: Fixed two issues in the GitLab integration's fetch behavior: + + - The internal fetch wrapper was passing `mode: 'same-origin'` on every request. This had no practical effect server-side, but would have caused cross-origin requests to be rejected when the integration is used from a browser. Requests now use the default fetch mode and work correctly in both browser and Node environments. + - When retries are configured, transient network errors (such as dropped connections or DNS hiccups) are now retried using the same `maxRetries` and exponential delay as retryable HTTP status codes. Previously, a thrown fetch error would propagate immediately on the first failure regardless of the retry configuration. Caller-initiated aborts continue to surface immediately without being retried. + +## 2.0.2-next.0 + +### Patch Changes + +- b62781f: Moved `registerMswTestHooks` to test files. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + ## 2.0.1 ### Patch Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index de351778b6..5de7427307 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "2.0.1", + "version": "2.0.2-next.1", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/integration/src/awsCodeCommit/AwsCodeCommitIntegration.ts b/packages/integration/src/awsCodeCommit/AwsCodeCommitIntegration.ts index e5b0e4b76b..801cd607ab 100644 --- a/packages/integration/src/awsCodeCommit/AwsCodeCommitIntegration.ts +++ b/packages/integration/src/awsCodeCommit/AwsCodeCommitIntegration.ts @@ -81,9 +81,8 @@ export class AwsCodeCommitIntegration implements ScmIntegration { * * @param url - The original URL * @param type - The desired type, e.g. 'blob', 'edit' - * @public */ -export function replaceCodeCommitUrlType( +function replaceCodeCommitUrlType( url: string, repositoryName: string, type: 'browse' | 'edit', diff --git a/packages/integration/src/gerrit/core.ts b/packages/integration/src/gerrit/core.ts index e8db1305ed..c004e4e613 100644 --- a/packages/integration/src/gerrit/core.ts +++ b/packages/integration/src/gerrit/core.ts @@ -209,11 +209,8 @@ export function buildGerritGitilesArchiveUrlFromLocation( * be used. * * @param config - A Gerrit provider config. - * @public */ -export function getAuthenticationPrefix( - config: GerritIntegrationConfig, -): string { +function getAuthenticationPrefix(config: GerritIntegrationConfig): string { return config.password ? '/a/' : '/'; } diff --git a/packages/integration/src/github/core.ts b/packages/integration/src/github/core.ts index 9599338497..6810e06a0c 100644 --- a/packages/integration/src/github/core.ts +++ b/packages/integration/src/github/core.ts @@ -63,7 +63,7 @@ export function getGithubFileFetchUrl( } } -export function chooseEndpoint( +function chooseEndpoint( config: GithubIntegrationConfig, credentials: GithubCredentials, ): 'api' | 'raw' { diff --git a/packages/integration/src/gitlab/GitLabIntegration.test.ts b/packages/integration/src/gitlab/GitLabIntegration.test.ts index 7132849a7c..156ea0ef3b 100644 --- a/packages/integration/src/gitlab/GitLabIntegration.test.ts +++ b/packages/integration/src/gitlab/GitLabIntegration.test.ts @@ -19,6 +19,7 @@ import { rest } from 'msw'; import { ConfigReader } from '@backstage/config'; import { GitLabIntegration, + parseRetryAfterMs, replaceGitLabUrlType, sleep, } from './GitLabIntegration'; @@ -318,6 +319,69 @@ describe('GitLabIntegration', () => { expect(response.status).toBe(200); expect(callCount).toBe(3); }); + + it('retries on transient network errors and returns once recovered', async () => { + let callCount = 0; + worker.use( + rest.get('https://h.com/api/v4', (_req, res, ctx) => { + callCount += 1; + if (callCount === 1) { + return res.networkError('boom'); + } + return res(ctx.status(200), ctx.json({})); + }), + ); + + const integration = new GitLabIntegration({ + host: 'h.com', + apiBaseUrl: 'https://h.com/api/v4', + baseUrl: 'https://h.com', + retry: { + maxRetries: 3, + retryStatusCodes: [429], + }, + }); + + const responsePromise = integration.fetch('https://h.com/api/v4'); + await jest.advanceTimersByTimeAsync(100); + const response = await responsePromise; + + expect(response.status).toBe(200); + expect(callCount).toBe(2); + }); + + it('surfaces the error after exhausting retries on persistent network errors', async () => { + let callCount = 0; + worker.use( + rest.get('https://h.com/api/v4', (_req, res) => { + callCount += 1; + return res.networkError('boom'); + }), + ); + + const integration = new GitLabIntegration({ + host: 'h.com', + apiBaseUrl: 'https://h.com/api/v4', + baseUrl: 'https://h.com', + retry: { + maxRetries: 2, + retryStatusCodes: [429], + }, + }); + + // Attach the catch handler before advancing timers so the in-flight + // rejections don't surface as unhandled. + let didReject = false; + const settled = integration.fetch('https://h.com/api/v4').catch(() => { + didReject = true; + }); + await jest.advanceTimersByTimeAsync(100); + await jest.advanceTimersByTimeAsync(200); + await settled; + + expect(didReject).toBe(true); + expect(callCount).toBe(3); // initial + 2 retries + }); }); }); @@ -414,6 +478,39 @@ describe('sleep', () => { }); }); +describe('parseRetryAfterMs', () => { + it('parses delay-seconds', () => { + expect(parseRetryAfterMs('120', 5000)).toBe(120_000); + expect(parseRetryAfterMs('1', 5000)).toBe(1000); + }); + + it('parses an HTTP-date and computes a delta', () => { + const futureDate = new Date(Date.now() + 30_000).toUTCString(); + const result = parseRetryAfterMs(futureDate, 5000); + expect(result).toBeGreaterThan(29_000); + expect(result).toBeLessThanOrEqual(30_000); + }); + + it('returns 0 for an HTTP-date in the past', () => { + const pastDate = new Date(Date.now() - 10_000).toUTCString(); + expect(parseRetryAfterMs(pastDate, 5000)).toBe(0); + }); + + it('returns fallback for null or unparseable values', () => { + expect(parseRetryAfterMs(null, 5000)).toBe(5000); + expect(parseRetryAfterMs('', 5000)).toBe(5000); + expect(parseRetryAfterMs('not-a-date-or-number', 5000)).toBe(5000); + }); + + it('treats zero seconds as retry-immediately', () => { + expect(parseRetryAfterMs('0', 5000)).toBe(0); + }); + + it('returns fallback for negative seconds', () => { + expect(parseRetryAfterMs('-5', 5000)).toBe(5000); + }); +}); + describe('replaceGitLabUrlType', () => { it('should replace with expected type', () => { expect( diff --git a/packages/integration/src/gitlab/GitLabIntegration.ts b/packages/integration/src/gitlab/GitLabIntegration.ts index 68afb6f63e..4e7f98c649 100644 --- a/packages/integration/src/gitlab/GitLabIntegration.ts +++ b/packages/integration/src/gitlab/GitLabIntegration.ts @@ -75,9 +75,7 @@ export class GitLabIntegration implements ScmIntegration { } private createFetchStrategy(): FetchFunction { - let fetchFn: FetchFunction = async (url, options) => { - return fetch(url, { ...options, mode: 'same-origin' }); - }; + let fetchFn: FetchFunction = (url, options) => fetch(url, options); const retryConfig = this.integrationConfig.retry; if (retryConfig) { @@ -109,35 +107,83 @@ export class GitLabIntegration implements ScmIntegration { return fetchFn; } + // Exponential backoff, cap at 10 seconds + const backoffDelay = (a: number) => + Math.min(100 * Math.pow(2, a - 1), 10000); + return async (url, options) => { const abortSignal = options?.signal; - let response: Response; let attempt = 0; for (;;) { - response = await fetchFn(url, options); - // If response is not retryable, return immediately - if (!retryStatusCodes.includes(response.status)) { - break; + let response: Response; + try { + response = await fetchFn(url, options); + } catch (e) { + // The caller aborted — surface that immediately rather than retrying. + if (abortSignal?.aborted) throw e; + // No more attempts left — propagate the network error. + if (attempt++ >= maxRetries) throw e; + await sleep(backoffDelay(attempt), abortSignal); + if (abortSignal?.aborted) throw e; + continue; } - // If this was the last allowed attempt, return response - if (attempt++ >= maxRetries) { - break; + // Successful, non-retryable response: return immediately + if (!retryStatusCodes.includes(response.status)) { + return response; } - // Determine delay from Retry-After header if present, otherwise exponential backoff - const retryAfter = response.headers.get('Retry-After'); - const delay = retryAfter - ? parseInt(retryAfter, 10) * 1000 - : Math.min(100 * Math.pow(2, attempt - 1), 10000); // Exponential backoff, cap at 10 seconds + + // No more attempts left — return the last (retryable) response. + if (attempt++ >= maxRetries) { + return response; + } + + // Retry-After is either delay-seconds or an HTTP-date (RFC 9110 §10.2.3). + const delay = parseRetryAfterMs( + response.headers.get('Retry-After'), + backoffDelay(attempt), + ); + + // Release the underlying connection so it can be reused, since we're + // about to discard this response in favor of a retry. + await response.body?.cancel().catch(() => {}); await sleep(delay, abortSignal); + if (abortSignal?.aborted) return response; } - - return response; }; } } +/** @internal */ +export function parseRetryAfterMs( + headerValue: string | null, + fallbackMs: number, +): number { + if (!headerValue) { + return fallbackMs; + } + + // delay-seconds per RFC 9110 is 1*DIGIT + if (/^\d+$/.test(headerValue)) { + return Number(headerValue) * 1000; + } + + // HTTP-dates (IMF-fixdate) always contain a comma, e.g. + // "Sun, 06 Nov 1994 08:49:37 GMT" — use that as a prerequisite + // to avoid Date.parse interpreting random strings as dates. + if (headerValue.includes(',')) { + const dateMs = Date.parse(headerValue); + if (Number.isFinite(dateMs)) { + const deltaMs = dateMs - Date.now(); + return deltaMs > 0 ? deltaMs : 0; + } + } + + return fallbackMs; +} + +/** @internal */ export async function sleep( durationMs: number, abortSignal: AbortSignal | null | undefined, diff --git a/packages/integration/src/gitlab/core.ts b/packages/integration/src/gitlab/core.ts index 435e5a8a31..d5c8703aec 100644 --- a/packages/integration/src/gitlab/core.ts +++ b/packages/integration/src/gitlab/core.ts @@ -75,7 +75,7 @@ export function getGitLabRequestOptions( // Converts // from: https://gitlab.com/groupA/teams/teamA/subgroupA/repoA/-/blob/branch/filepath // to: https://gitlab.com/api/v4/projects/groupA%2Fteams%2FteamA%2FsubgroupA%2FrepoA/repository/files/filepath/raw?ref=branch -export function buildProjectUrl( +function buildProjectUrl( target: string, projectPathOrID: string | Number, config: GitLabIntegrationConfig, diff --git a/packages/module-federation-common/CHANGELOG.md b/packages/module-federation-common/CHANGELOG.md index 25d751176f..fa877ae0f9 100644 --- a/packages/module-federation-common/CHANGELOG.md +++ b/packages/module-federation-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/module-federation-common +## 0.1.4-next.0 + +### Patch Changes + +- 41070b8: Upgraded `@module-federation/enhanced`, `@module-federation/runtime`, and `@module-federation/sdk` from `^0.21.6` to `^2.3.3` to address known vulnerabilities. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/types@1.2.2 + ## 0.1.3 ### Patch Changes diff --git a/packages/module-federation-common/package.json b/packages/module-federation-common/package.json index 35f6f6dd4e..0c5e5d20de 100644 --- a/packages/module-federation-common/package.json +++ b/packages/module-federation-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/module-federation-common", - "version": "0.1.3", + "version": "0.1.4-next.0", "description": "Helper library for module federation", "backstage": { "role": "common-library" diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 3a5b5e7587..ddb62814fd 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/repo-tools +## 0.17.2-next.0 + +### Patch Changes + +- 927c003: Replaced internal error utilities with shared ones from `@backstage/cli-common`. +- Updated dependencies + - @backstage/errors@1.3.1-next.0 + - @backstage/backend-plugin-api@1.9.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/cli-node@0.3.2-next.0 + - @backstage/config-loader@1.10.11-next.0 + ## 0.17.1 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 7c8d28095a..abb99bdb8c 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/repo-tools", - "version": "0.17.1", + "version": "0.17.2-next.0", "description": "CLI for Backstage repo tooling ", "backstage": { "role": "cli" diff --git a/packages/scaffolder-internal/CHANGELOG.md b/packages/scaffolder-internal/CHANGELOG.md index b02f7ea224..2c50e6e6f5 100644 --- a/packages/scaffolder-internal/CHANGELOG.md +++ b/packages/scaffolder-internal/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/scaffolder +## 0.0.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-scaffolder-react@1.20.2-next.0 + ## 0.0.20 ### Patch Changes diff --git a/packages/scaffolder-internal/package.json b/packages/scaffolder-internal/package.json index 89975eab5b..083ed71cce 100644 --- a/packages/scaffolder-internal/package.json +++ b/packages/scaffolder-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/scaffolder", - "version": "0.0.20", + "version": "0.0.21-next.0", "backstage": { "role": "web-library", "inline": true diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 9b98a6f4c5..ee7dcd8443 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,26 @@ # techdocs-cli-embedded-app +## 0.2.120-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.10-next.0 + - @backstage/ui@0.15.0-next.0 + - @backstage/plugin-techdocs@1.17.6-next.0 + - @backstage/cli@0.36.2-next.0 + - @backstage/frontend-plugin-api@0.17.0-next.0 + - @backstage/plugin-catalog@2.0.5-next.0 + - @backstage/plugin-techdocs-react@1.3.11-next.0 + - @backstage/frontend-defaults@0.5.2-next.0 + - @backstage/integration-react@1.2.18-next.0 + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-app-react@0.2.3-next.0 + - @backstage/test-utils@1.7.18-next.0 + - @backstage/theme@0.7.3 + ## 0.2.119 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 192455a934..d0c37f33ef 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.119", + "version": "0.2.120-next.0", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index ce76e73bd8..ce43bf88ca 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,28 @@ # @techdocs/cli +## 1.11.0-next.1 + +### Minor Changes + +- 329f592: Add support for disabling external font downloads via techdocs-cli `techdocs-cli generate --disableExternalFonts`, useful for air-gapped Backstage instances. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.15.0-next.1 + +## 1.10.8-next.0 + +### Patch Changes + +- 0c5e41f: Removed unused dependencies that had no imports in source code. +- Updated dependencies + - @backstage/backend-defaults@0.17.1-next.0 + - @backstage/catalog-model@1.8.1-next.0 + - @backstage/cli-common@0.2.2-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/plugin-techdocs-node@1.14.6-next.0 + ## 1.10.7 ### Patch Changes diff --git a/packages/techdocs-cli/cli-e2e-tests/techdocs-cli.test.ts b/packages/techdocs-cli/cli-e2e-tests/techdocs-cli.test.ts index a2720c934e..4a4819a715 100644 --- a/packages/techdocs-cli/cli-e2e-tests/techdocs-cli.test.ts +++ b/packages/techdocs-cli/cli-e2e-tests/techdocs-cli.test.ts @@ -60,6 +60,7 @@ jest.setTimeout(timeout * 2); describe('end-to-end', () => { const cwd = path.resolve(__dirname, '../src/example-docs'); + const legacyCwd = path.resolve(__dirname, '../src/legacy-docs'); const entryPoint = path.resolve(__dirname, '../bin/techdocs-cli'); afterEach(async () => { @@ -106,6 +107,19 @@ describe('end-to-end', () => { expect(proc.exit).toEqual(0); }); + it('can generate with --legacyCopyReadmeMdToIndexMd option', async () => { + const proc = await executeCommand( + entryPoint, + ['generate', '--no-docker', '--legacyCopyReadmeMdToIndexMd'], + { + cwd: legacyCwd, + timeout: timeout, + }, + ); + expect(proc.stdout).toContain('Successfully generated docs'); + expect(proc.exit).toEqual(0); + }); + it('can serve in mkdocs', async () => { const proc = await executeCommand( entryPoint, diff --git a/packages/techdocs-cli/cli-report.md b/packages/techdocs-cli/cli-report.md index 667c4fb6b6..f682072cd7 100644 --- a/packages/techdocs-cli/cli-report.md +++ b/packages/techdocs-cli/cli-report.md @@ -27,6 +27,7 @@ Usage: techdocs-cli generate|build [options] Options: --defaultPlugin [defaultPlugins...] + --disableExternalFonts --docker-image --etag --legacyCopyReadmeMdToIndexMd diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 1e2419fa60..09391a47cd 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.10.7", + "version": "1.11.0-next.1", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/packages/techdocs-cli/src/commands/generate/generate.ts b/packages/techdocs-cli/src/commands/generate/generate.ts index 9a009aff00..b5b38b13d7 100644 --- a/packages/techdocs-cli/src/commands/generate/generate.ts +++ b/packages/techdocs-cli/src/commands/generate/generate.ts @@ -42,6 +42,7 @@ export default async function generate(opts: OptionValues) { const dockerImage = opts.dockerImage; const pullImage = opts.pull; const legacyCopyReadmeMdToIndexMd = opts.legacyCopyReadmeMdToIndexMd; + const disableExternalFonts = opts.disableExternalFonts; const defaultPlugins = opts.defaultPlugin; logger.info(`Using source dir ${sourceDir}`); @@ -64,6 +65,7 @@ export default async function generate(opts: OptionValues) { mkdocs: { legacyCopyReadmeMdToIndexMd, omitTechdocsCorePlugin, + disableExternalFonts, defaultPlugins, }, }, diff --git a/packages/techdocs-cli/src/commands/index.ts b/packages/techdocs-cli/src/commands/index.ts index e69cf4671a..c169815afc 100644 --- a/packages/techdocs-cli/src/commands/index.ts +++ b/packages/techdocs-cli/src/commands/index.ts @@ -70,6 +70,11 @@ export function registerCommands(program: Command) { 'Attempt to ensure an index.md exists falling back to using /README.md or README.md in case a default /index.md is not provided.', false, ) + .option( + '--disableExternalFonts', + 'Disable external font downloads by default by setting theme.font: false in mkdocs.yml when not already configured. Useful for air-gapped environments where Google fonts cannot be accessed.', + false, + ) .option( '--defaultPlugin [defaultPlugins...]', 'Plugins which should be added automatically to the mkdocs.yaml file', diff --git a/packages/techdocs-cli/src/legacy-docs/README.md b/packages/techdocs-cli/src/legacy-docs/README.md new file mode 100644 index 0000000000..ab47987eb4 --- /dev/null +++ b/packages/techdocs-cli/src/legacy-docs/README.md @@ -0,0 +1 @@ +Very simple file to test that `--legacyCopyReadmeMdToIndexMd` option works diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 75975d2492..c9999eb627 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/test-utils +## 1.7.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.20.1-next.0 + - @backstage/config@1.3.8-next.0 + - @backstage/core-plugin-api@1.12.6-next.0 + - @backstage/plugin-permission-common@0.9.9-next.0 + - @backstage/theme@0.7.3 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-react@0.5.1-next.0 + ## 1.7.17 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 1143309661..14308d56e5 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/test-utils", - "version": "1.7.17", + "version": "1.7.18-next.0", "description": "Utilities to test Backstage plugins and apps.", "backstage": { "role": "web-library" diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index 4d15d47a4f..4776fbb952 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,112 @@ # @backstage/ui +## 0.15.0-next.2 + +### Patch Changes + +- 37535b2: 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. + +- 5b85902: Fix `Card href=...` not showing a focus indicator on keyboard navigation. `Link` now composes `useFocusRing`, emits `data-focus-visible`, and renders a `--bui-ring` outline when keyboard-focused. The Card's existing focus-ring CSS matches when the trigger is focused. + + _Affected components_: Card, Link + +- 38bb056: Adjusted PluginHeader spacing and borders so headers with and without tabs align more consistently with surrounding page content, including when paired with page headers. + + **Affected components:** PluginHeader, Header + +- 25909ba: Added `searchDebounceMs` and `filterDebounceMs` options to `useTable` in `complete` mode. Both default to `0` (no debounce, no observable change for existing consumers); set them to defer the client-side filter/search/sort pipeline on large datasets without reimplementing input-layer debouncing. The controlled `search` / `onSearchChange` and `filter` / `onFilterChange` callbacks continue to fire on every change. + + **Affected components:** Table + +- ddca41f: Added a new `Combobox` component. It pairs a text input with a filterable dropdown of options and supports single selection, sectioned options, icons, sizes, and custom typed values via `allowsCustomValue`. + + **Affected components:** Combobox + +## 0.15.0-next.1 + +### Minor Changes + +- 5351d8a: Added a `sticky` prop to the `Header` component. When `true`, the title-and-actions bar stays fixed to the top of its scroll container while the rest of the header (tags, description, metadata) scrolls away. The sticky bar background color automatically matches the container surface using the bg-consumer system. + + **BREAKING**: Removed the main header class from the `Header` component. Custom styles that target this class should be updated to target the component sections that remain. + + **Affected components:** Header + +### Patch Changes + +- e7fc79f: Added support for grouping options into sections in the Select component. You can now pass section objects with a `title` and a nested `options` array alongside (or instead of) regular options to render grouped dropdowns with section headers. + + **Affected components:** Select + +- 76635ae: Disabled `Card` scroll shadow in browsers that don't support `animation-timeline: scroll()`. Prevents the shadow from being always visible over the `CardBody` when there's nothing to scroll or the body is not scrolled. + + **Affected components:** Card + +- de75f7c: Fixed `CardBody` showing an unwanted scrollbar when constrained below the scroll shadow height. + + **Affected components:** Card + +- c96e2b3: Added `description`, `tags`, and `metadata` props to the `Header` component. The `description` prop accepts a markdown string with support for inline links. The `tags` prop renders a row of text or link items above the title. The `metadata` prop renders key-value pairs below the description. The `breadcrumbs` prop has been deprecated and will be removed in a future release. + + **Affected components:** Header + +- f635139: Limited `@remixicon/react` dependency to versions below 4.9.0 due to a license change in that release. +- 23ee789: Added invalid-state styling for Checkbox and corresponding Storybook variants for verification. + + **Affected components:** Checkbox, CheckboxGroup + +- df705bb: Fixed external URLs in BUI link components being rewritten as in-app paths when the app is served under a non-root base path. Absolute URLs (`http://`, `https://`, `//`, `mailto:`, `tel:`) are now passed through unchanged. Internal `href` values are resolved against the current `basename` exactly once, which also fixes a latent issue where internal link clicks under a non-root base path could navigate to a URL with the `basename` prefix doubled. + + **Affected components:** ButtonLink, Card, Link, Menu, Tab, Table, Tag + +## 0.15.0-next.0 + +### Minor Changes + +- a281469: Add support for flex item props (`grow`, `shrink`, and `basis`) to `Box`, `Card`, `Grid`, and `Flex` itself. + + **Affected components:** Box, Card, Grid, Flex + +### Patch Changes + +- 3846774: Added missing dependencies that were previously only available transitively. +- e8a1a35: 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 + +- e2d9831: Tightened React Aria dependency version ranges from `^` to `~` to prevent unintended minor version upgrades. +- a42766e: Fixed dark mode background for Dialog component by correcting the theme attribute selector from `data-theme` to `data-theme-mode`. + + **Affected components:** Dialog + +- c6fc76f: Fixed an issue where the active tab indicator would disappear shortly after page load for uncontrolled Tabs. + + **Affected components:** Tabs + +- d1be10c: Updated React Aria dependencies to v1.17.0 and migrated imports from individual `@react-aria/*` and `@react-stately/*` packages to the monopackages (`react-aria`, `react-stately`). This fixes a type resolution error for `@react-types/table` that occurred in new app installations. +- 401916d: Added new `DateRangePicker` component — combines two date fields and a calendar popover for selecting a date range, built on React Aria with full keyboard and screen reader accessibility. Uses BUI design tokens throughout, including auto-incremented backgrounds via the bg consumer pattern. +- Updated dependencies + - @backstage/version-bridge@1.0.12 + ## 0.14.0 ### Minor Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index 1b17bc8744..764a552480 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/ui", - "version": "0.14.0", + "version": "0.15.0-next.2", "backstage": { "role": "web-library" }, @@ -47,9 +47,12 @@ }, "dependencies": { "@backstage/version-bridge": "workspace:^", - "@remixicon/react": "^4.6.0", + "@braintree/sanitize-url": "^7.1.2", + "@internationalized/date": "^3.12.0", + "@remixicon/react": ">=4.6.0 <4.9.0", "@tanstack/react-table": "^8.21.3", "clsx": "^2.1.1", + "marked": "^15.0.12", "react-aria": "~3.48.0", "react-aria-components": "~1.17.0", "react-stately": "~3.46.0", @@ -57,7 +60,10 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", + "@backstage/core-components": "workspace:^", "@storybook/react-vite": "^10.3.3", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "@types/use-sync-external-store": "^1.0.0", diff --git a/packages/ui/report.api.md b/packages/ui/report.api.md index 4856387abf..ac6c9f13a2 100644 --- a/packages/ui/report.api.md +++ b/packages/ui/report.api.md @@ -10,10 +10,13 @@ import type { CheckboxProps as CheckboxProps_2 } from 'react-aria-components'; import { ColumnProps as ColumnProps_2 } from 'react-aria-components'; import type { ColumnSize } from 'react-stately'; import type { ColumnStaticSize } from 'react-stately'; +import type { ComboBoxProps } from 'react-aria-components'; import type { ComponentProps } from 'react'; import type { ComponentPropsWithoutRef } from 'react'; import type { ComponentPropsWithRef } from 'react'; import type { CSSProperties } from 'react'; +import type { DateRangePickerProps as DateRangePickerProps_2 } from 'react-aria-components'; +import type { DateValue } from '@internationalized/date'; import type { DialogTriggerProps as DialogTriggerProps_2 } from 'react-aria-components'; import type { DisclosureGroupProps } from 'react-aria-components'; import type { DisclosurePanelProps } from 'react-aria-components'; @@ -222,6 +225,9 @@ export const AlertDefinition: { readonly dataAttribute: true; readonly default: 'info'; }; + readonly isPending: { + readonly dataAttribute: true; + }; readonly loading: { readonly dataAttribute: true; }; @@ -239,6 +245,7 @@ export const AlertDefinition: { export type AlertOwnProps = { status?: Responsive<'info' | 'success' | 'warning' | 'danger'>; icon?: boolean | ReactElement; + isPending?: boolean; loading?: boolean; customActions?: ReactNode; title?: ReactNode; @@ -431,6 +438,9 @@ export const BoxDefinition: { 'py', 'position', 'display', + 'grow', + 'shrink', + 'basis', 'width', 'minWidth', 'maxWidth', @@ -452,6 +462,7 @@ export type BoxOwnProps = { // @public (undocumented) export interface BoxProps extends SpaceProps, + FlexItemProps, BoxOwnProps, BoxUtilityProps, Omit, 'children'> {} @@ -510,6 +521,9 @@ export const ButtonDefinition: { readonly destructive: { readonly dataAttribute: true; }; + readonly isPending: { + readonly dataAttribute: true; + }; readonly loading: { readonly dataAttribute: true; }; @@ -545,6 +559,9 @@ export const ButtonIconDefinition: { readonly dataAttribute: true; readonly default: 'primary'; }; + readonly isPending: { + readonly dataAttribute: true; + }; readonly loading: { readonly dataAttribute: true; }; @@ -558,6 +575,7 @@ export type ButtonIconOwnProps = { size?: Responsive<'small' | 'medium'>; variant?: Responsive<'primary' | 'secondary' | 'tertiary'>; icon?: ReactElement; + isPending?: boolean; loading?: boolean; className?: string; }; @@ -623,6 +641,7 @@ export type ButtonOwnProps = { destructive?: boolean; iconStart?: ReactElement; iconEnd?: ReactElement; + isPending?: boolean; loading?: boolean; children?: ReactNode; className?: string; @@ -642,6 +661,7 @@ export const Card: ForwardRefExoticComponent< export type CardBaseProps = { children?: ReactNode; className?: string; + style?: CSSProperties; }; // @public @@ -702,7 +722,9 @@ export const CardDefinition: { readonly target: {}; readonly rel: {}; readonly download: {}; + readonly style: {}; }; + readonly utilityProps: readonly ['grow', 'shrink', 'basis']; }; // @public @@ -786,10 +808,12 @@ export type CardOwnProps = Pick< | 'target' | 'rel' | 'download' + | 'style' >; // @public export type CardProps = CardBaseProps & + FlexItemProps & Omit, 'onClick'> & (CardButtonVariant | CardLinkVariant | CardStaticVariant); @@ -985,6 +1009,111 @@ export type Columns = | '12' | 'auto'; +// @public +export const Combobox: ForwardRefExoticComponent< + ComboboxProps & RefAttributes +>; + +// @public +export const ComboboxDefinition: { + readonly styles: { + readonly [key: string]: string; + }; + readonly classNames: { + readonly root: 'bui-Combobox'; + readonly popover: 'bui-ComboboxPopover'; + }; + readonly propDefs: { + readonly icon: {}; + readonly size: { + readonly dataAttribute: true; + readonly default: 'small'; + }; + readonly options: {}; + readonly placeholder: {}; + readonly label: {}; + readonly secondaryLabel: {}; + readonly description: {}; + readonly isRequired: {}; + readonly className: {}; + }; +}; + +// @public +export const ComboboxInputDefinition: { + readonly styles: { + readonly [key: string]: string; + }; + readonly classNames: { + readonly root: 'bui-ComboboxInput'; + readonly icon: 'bui-ComboboxInputIcon'; + readonly input: 'bui-ComboboxInputField'; + readonly chevron: 'bui-ComboboxInputChevron'; + }; + readonly bg: 'consumer'; + readonly propDefs: { + readonly icon: {}; + readonly placeholder: {}; + }; +}; + +// @public +export const ComboboxListBoxDefinition: { + readonly styles: { + readonly [key: string]: string; + }; + readonly classNames: { + readonly root: 'bui-ComboboxList'; + readonly noResults: 'bui-ComboboxNoResults'; + }; + readonly propDefs: { + readonly options: {}; + }; +}; + +// @public +export const ComboboxListBoxItemDefinition: { + readonly styles: { + readonly [key: string]: string; + }; + readonly classNames: { + readonly root: 'bui-ComboboxItem'; + readonly indicator: 'bui-ComboboxItemIndicator'; + readonly label: 'bui-ComboboxItemLabel'; + }; + readonly propDefs: {}; +}; + +// @public (undocumented) +export type ComboboxOwnProps = { + icon?: ReactNode; + size?: 'small' | 'medium' | Partial>; + options?: Array; + placeholder?: string; + label?: FieldLabelProps['label']; + secondaryLabel?: FieldLabelProps['secondaryLabel']; + description?: FieldLabelProps['description']; + isRequired?: boolean; + className?: string; +}; + +// @public (undocumented) +export interface ComboboxProps + extends ComboboxOwnProps, + Omit, keyof ComboboxOwnProps> {} + +// @public +export const ComboboxSectionDefinition: { + readonly styles: { + readonly [key: string]: string; + }; + readonly classNames: { + readonly root: 'bui-ComboboxSection'; + readonly header: 'bui-ComboboxSectionHeader'; + }; + readonly propDefs: {}; +}; + // @public (undocumented) export interface CompletePaginationOptions extends PaginationOptions { // (undocumented) @@ -1082,6 +1211,45 @@ export interface CursorResponse { totalCount?: number; } +// @public +export const DateRangePicker: ForwardRefExoticComponent< + DateRangePickerProps & RefAttributes +>; + +// @public +export const DateRangePickerDefinition: { + readonly styles: { + readonly [key: string]: string; + }; + readonly classNames: { + readonly root: 'bui-DateRangePicker'; + }; + readonly propDefs: { + readonly size: { + readonly dataAttribute: true; + readonly default: 'small'; + }; + readonly className: {}; + readonly label: {}; + readonly description: {}; + readonly secondaryLabel: {}; + }; +}; + +// @public (undocumented) +export type DateRangePickerOwnProps = { + size?: 'small' | 'medium' | Partial>; + className?: string; + label?: FieldLabelProps['label']; + description?: FieldLabelProps['description']; + secondaryLabel?: FieldLabelProps['secondaryLabel']; +}; + +// @public (undocumented) +export interface DateRangePickerProps + extends Omit, 'className' | 'children'>, + DateRangePickerOwnProps {} + // @public export const Dialog: ForwardRefExoticComponent< DialogProps & RefAttributes @@ -1315,12 +1483,22 @@ export const FlexDefinition: { 'align', 'justify', 'direction', + 'grow', + 'shrink', + 'basis', ]; }; // @public (undocumented) export type FlexDirection = 'row' | 'column'; +// @public +export interface FlexItemProps { + basis?: Responsive; + grow?: Responsive; + shrink?: Responsive; +} + // @public (undocumented) export type FlexOwnProps = { children: ReactNode; @@ -1332,6 +1510,7 @@ export type FlexOwnProps = { // @public (undocumented) export interface FlexProps extends SpaceProps, + FlexItemProps, FlexOwnProps, Omit, 'children'> { // (undocumented) @@ -1422,6 +1601,9 @@ export const GridDefinition: { 'pt', 'px', 'py', + 'grow', + 'shrink', + 'basis', ]; }; @@ -1478,6 +1660,7 @@ export type GridOwnProps = { // @public (undocumented) export interface GridProps extends SpaceProps, + FlexItemProps, GridOwnProps, Omit, 'children'> { // (undocumented) @@ -1502,12 +1685,27 @@ export const HeaderDefinition: { readonly styles: { readonly [key: string]: string; }; + readonly bg: 'consumer'; readonly classNames: { - readonly root: 'bui-Header'; + readonly headerTop: 'bui-HeaderTop'; + readonly stickySentinel: 'bui-HeaderStickySentinel'; readonly content: 'bui-HeaderContent'; + readonly headerBottom: 'bui-HeaderBottom'; readonly breadcrumbs: 'bui-HeaderBreadcrumbs'; + readonly breadcrumbsSmall: 'bui-HeaderBreadcrumbsSmall'; + readonly breadcrumbLink: 'bui-HeaderBreadcrumbLink'; + readonly breadcrumbLinkSmall: 'bui-HeaderBreadcrumbLinkSmall'; + readonly breadcrumbSeparator: 'bui-HeaderBreadcrumbSeparator'; + readonly titleStack: 'bui-HeaderTitleStack'; + readonly title: 'bui-HeaderTitle'; + readonly titleSmall: 'bui-HeaderTitleSmall'; readonly tabsWrapper: 'bui-HeaderTabsWrapper'; readonly controls: 'bui-HeaderControls'; + readonly tags: 'bui-HeaderTags'; + readonly tag: 'bui-HeaderTag'; + readonly description: 'bui-HeaderDescription'; + readonly metaRow: 'bui-HeaderMetaRow'; + readonly metaItem: 'bui-HeaderMetaItem'; }; readonly propDefs: { readonly title: {}; @@ -1515,10 +1713,52 @@ export const HeaderDefinition: { readonly tabs: {}; readonly activeTabId: {}; readonly breadcrumbs: {}; + readonly description: {}; + readonly tags: {}; + readonly metadata: {}; readonly className: {}; + readonly sticky: {}; }; }; +// @public +export interface HeaderMetadataItem { + // (undocumented) + label: string; + // (undocumented) + value: React.ReactNode; +} + +// @public +export const HeaderMetadataStatus: ( + input: HeaderMetadataStatusProps, +) => JSX_2.Element; + +// @public +export interface HeaderMetadataStatusProps { + // (undocumented) + color: 'danger' | 'warning' | 'success' | 'info'; + // (undocumented) + href?: string; + // (undocumented) + label: string; +} + +// @public +export interface HeaderMetadataUser { + // (undocumented) + href?: string; + // (undocumented) + name: string; + // (undocumented) + src?: string; +} + +// @public +export const HeaderMetadataUsers: (input: { + users: HeaderMetadataUser[]; +}) => JSX_2.Element | null; + // @public (undocumented) export const HeaderNavDefinition: { readonly styles: { @@ -1599,15 +1839,21 @@ export type HeaderNavTabItem = HeaderNavTab | HeaderNavTabGroup; export interface HeaderOwnProps { // (undocumented) activeTabId?: string | null; - // (undocumented) + // @deprecated (undocumented) breadcrumbs?: HeaderBreadcrumb[]; // (undocumented) className?: string; // (undocumented) customActions?: React.ReactNode; + description?: string; + // (undocumented) + metadata?: HeaderMetadataItem[]; + sticky?: boolean; // (undocumented) tabs?: HeaderNavTabItem[]; // (undocumented) + tags?: HeaderTag[]; + // (undocumented) title?: string; } @@ -1622,12 +1868,27 @@ export const HeaderPageDefinition: { readonly styles: { readonly [key: string]: string; }; + readonly bg: 'consumer'; readonly classNames: { - readonly root: 'bui-Header'; + readonly headerTop: 'bui-HeaderTop'; + readonly stickySentinel: 'bui-HeaderStickySentinel'; readonly content: 'bui-HeaderContent'; + readonly headerBottom: 'bui-HeaderBottom'; readonly breadcrumbs: 'bui-HeaderBreadcrumbs'; + readonly breadcrumbsSmall: 'bui-HeaderBreadcrumbsSmall'; + readonly breadcrumbLink: 'bui-HeaderBreadcrumbLink'; + readonly breadcrumbLinkSmall: 'bui-HeaderBreadcrumbLinkSmall'; + readonly breadcrumbSeparator: 'bui-HeaderBreadcrumbSeparator'; + readonly titleStack: 'bui-HeaderTitleStack'; + readonly title: 'bui-HeaderTitle'; + readonly titleSmall: 'bui-HeaderTitleSmall'; readonly tabsWrapper: 'bui-HeaderTabsWrapper'; readonly controls: 'bui-HeaderControls'; + readonly tags: 'bui-HeaderTags'; + readonly tag: 'bui-HeaderTag'; + readonly description: 'bui-HeaderDescription'; + readonly metaRow: 'bui-HeaderMetaRow'; + readonly metaItem: 'bui-HeaderMetaItem'; }; readonly propDefs: { readonly title: {}; @@ -1635,7 +1896,11 @@ export const HeaderPageDefinition: { readonly tabs: {}; readonly activeTabId: {}; readonly breadcrumbs: {}; + readonly description: {}; + readonly tags: {}; + readonly metadata: {}; readonly className: {}; + readonly sticky: {}; }; }; @@ -1659,6 +1924,14 @@ export interface HeaderTab { matchStrategy?: TabMatchStrategy; } +// @public +export interface HeaderTag { + // (undocumented) + href?: string; + // (undocumented) + label: string; +} + // @public (undocumented) export type JustifyContent = | 'stretch' @@ -2014,6 +2287,12 @@ type Option_2 = { }; export { Option_2 as Option }; +// @public (undocumented) +export type OptionSection = { + title: string; + options: Option_2[]; +}; + // @public (undocumented) export interface PaddingProps { // (undocumented) @@ -2500,7 +2779,7 @@ export const SelectDefinition: { export type SelectOwnProps = { icon?: ReactNode; size?: 'small' | 'medium' | Partial>; - options?: Array; + options?: Array; searchable?: boolean; searchPlaceholder?: string; label?: FieldLabelProps['label']; @@ -2717,6 +2996,9 @@ export const TableDefinition: { readonly stale: { readonly dataAttribute: true; }; + readonly isPending: { + readonly dataAttribute: true; + }; readonly loading: { readonly dataAttribute: true; }; @@ -2820,8 +3102,10 @@ export interface TableProps { // (undocumented) error?: Error; // (undocumented) - isStale?: boolean; + isPending?: boolean; // (undocumented) + isStale?: boolean; + // @deprecated (undocumented) loading?: boolean; // (undocumented) pagination: TablePaginationType; @@ -2843,6 +3127,7 @@ export const TableRoot: (props: TableRootProps) => JSX_2.Element; // @public (undocumented) export type TableRootOwnProps = { stale?: boolean; + isPending?: boolean; loading?: boolean; }; @@ -3284,6 +3569,8 @@ export type UseTableCompleteOptions< sortFn?: (data: T[], sort: SortDescriptor) => T[]; filterFn?: (data: T[], filter: TFilter) => T[]; searchFn?: (data: T[], search: string) => T[]; + searchDebounceMs?: number; + filterDebounceMs?: number; } & ( | { data: T[] | undefined; diff --git a/packages/ui/src/components/Accordion/Accordion.module.css b/packages/ui/src/components/Accordion/Accordion.module.css index 83ae6c24b8..06598d0529 100644 --- a/packages/ui/src/components/Accordion/Accordion.module.css +++ b/packages/ui/src/components/Accordion/Accordion.module.css @@ -21,18 +21,12 @@ width: 100%; border-radius: var(--bui-radius-3); padding: var(--bui-space-3); + } - &[data-bg='neutral-1'] { - background-color: var(--bui-bg-neutral-1); - } - - &[data-bg='neutral-2'] { - background-color: var(--bui-bg-neutral-2); - } - - &[data-bg='neutral-3'] { - background-color: var(--bui-bg-neutral-3); - } + .bui-Accordion[data-bg='danger'], + .bui-Accordion[data-bg='warning'], + .bui-Accordion[data-bg='success'] { + background-color: transparent; } .bui-AccordionTrigger { diff --git a/packages/ui/src/components/Alert/Alert.stories.tsx b/packages/ui/src/components/Alert/Alert.stories.tsx index 589d55b7dd..486daad2ef 100644 --- a/packages/ui/src/components/Alert/Alert.stories.tsx +++ b/packages/ui/src/components/Alert/Alert.stories.tsx @@ -32,7 +32,7 @@ const meta = preview.meta({ icon: { control: 'boolean', }, - loading: { + isPending: { control: 'boolean', }, }, @@ -208,25 +208,25 @@ export const WithActionsAndDescriptions = WithActions.extend({ }, }); -export const LoadingVariants = meta.story({ +export const PendingVariants = meta.story({ render: () => ( Info Success - + Warning @@ -234,27 +234,27 @@ export const LoadingVariants = meta.story({ ), }); -export const LoadingWithDescription = meta.story({ +export const PendingWithDescription = meta.story({ render: () => ( diff --git a/packages/ui/src/components/Alert/Alert.tsx b/packages/ui/src/components/Alert/Alert.tsx index 54eb9cffae..ef08528cc4 100644 --- a/packages/ui/src/components/Alert/Alert.tsx +++ b/packages/ui/src/components/Alert/Alert.tsx @@ -32,7 +32,7 @@ import { AlertDefinition } from './definition'; * * @remarks * The Alert component supports multiple status variants (info, success, warning, danger) - * and can display icons, loading states, and custom actions. It automatically handles + * and can display icons, pending states, and custom actions. It automatically handles * icon selection based on status when the icon prop is set to true. * * @example @@ -53,14 +53,14 @@ import { AlertDefinition } from './definition'; * ``` * * @example - * With custom actions and loading state: + * With custom actions and pending state: * ```tsx * * @@ -76,13 +76,21 @@ export const Alert = forwardRef( (props: AlertProps, ref: Ref) => { const { ownProps, restProps, dataAttributes, utilityStyle } = useDefinition( AlertDefinition, - props, + // Merge deprecated `loading` into `isPending` so data attributes and + // internal logic only need to check a single prop. + { + ...props, + isPending: + props.isPending || props.loading + ? true + : props.isPending ?? props.loading, + }, ); const { classes, status, icon, - loading, + isPending, customActions, title, description, @@ -132,7 +140,7 @@ export const Alert = forwardRef( data-has-description={description ? 'true' : 'false'} >
- {loading ? ( + {isPending ? (
()({ }, propDefs: { status: { dataAttribute: true, default: 'info' }, + isPending: { dataAttribute: true }, loading: { dataAttribute: true }, icon: {}, customActions: {}, diff --git a/packages/ui/src/components/Alert/types.ts b/packages/ui/src/components/Alert/types.ts index ce36d4c5fd..7018f25f6b 100644 --- a/packages/ui/src/components/Alert/types.ts +++ b/packages/ui/src/components/Alert/types.ts @@ -21,6 +21,8 @@ import type { Responsive, MarginProps } from '../../types'; export type AlertOwnProps = { status?: Responsive<'info' | 'success' | 'warning' | 'danger'>; icon?: boolean | ReactElement; + isPending?: boolean; + /** @deprecated Use `isPending` instead. */ loading?: boolean; customActions?: ReactNode; title?: ReactNode; diff --git a/packages/ui/src/components/Box/Box.module.css b/packages/ui/src/components/Box/Box.module.css index dd1ff447bc..688358fda0 100644 --- a/packages/ui/src/components/Box/Box.module.css +++ b/packages/ui/src/components/Box/Box.module.css @@ -22,28 +22,4 @@ font-weight: var(--bui-font-weight-regular); color: var(--bui-fg-primary); } - - .bui-Box[data-bg='neutral-1'] { - background-color: var(--bui-bg-neutral-1); - } - - .bui-Box[data-bg='neutral-2'] { - background-color: var(--bui-bg-neutral-2); - } - - .bui-Box[data-bg='neutral-3'] { - background-color: var(--bui-bg-neutral-3); - } - - .bui-Box[data-bg='danger'] { - background-color: var(--bui-bg-danger); - } - - .bui-Box[data-bg='warning'] { - background-color: var(--bui-bg-warning); - } - - .bui-Box[data-bg='success'] { - background-color: var(--bui-bg-success); - } } diff --git a/packages/ui/src/components/Box/Box.tsx b/packages/ui/src/components/Box/Box.tsx index 146292a344..1a2930dd2b 100644 --- a/packages/ui/src/components/Box/Box.tsx +++ b/packages/ui/src/components/Box/Box.tsx @@ -36,7 +36,7 @@ export const Box = forwardRef((props, ref) => { { ref, className: classes.root, - style: { ...ownProps.style, ...utilityStyle }, + style: { ...utilityStyle, ...ownProps.style }, ...dataAttributes, ...restProps, }, diff --git a/packages/ui/src/components/Box/definition.ts b/packages/ui/src/components/Box/definition.ts index 3837dc8ea4..c3a38326b2 100644 --- a/packages/ui/src/components/Box/definition.ts +++ b/packages/ui/src/components/Box/definition.ts @@ -52,6 +52,9 @@ export const BoxDefinition = defineComponent()({ 'py', 'position', 'display', + 'grow', + 'shrink', + 'basis', 'width', 'minWidth', 'maxWidth', diff --git a/packages/ui/src/components/Box/types.ts b/packages/ui/src/components/Box/types.ts index 1b4259099b..e333690e2e 100644 --- a/packages/ui/src/components/Box/types.ts +++ b/packages/ui/src/components/Box/types.ts @@ -15,7 +15,12 @@ */ import type { ReactNode, CSSProperties } from 'react'; -import type { Responsive, ProviderBg, SpaceProps } from '../../types'; +import type { + Responsive, + ProviderBg, + SpaceProps, + FlexItemProps, +} from '../../types'; /** @public */ export type BoxOwnProps = { @@ -43,6 +48,7 @@ export type BoxUtilityProps = { /** @public */ export interface BoxProps extends SpaceProps, + FlexItemProps, BoxOwnProps, BoxUtilityProps, Omit, 'children'> {} diff --git a/packages/ui/src/components/Button/Button.module.css b/packages/ui/src/components/Button/Button.module.css index 8273e77d5a..ffffaf52f0 100644 --- a/packages/ui/src/components/Button/Button.module.css +++ b/packages/ui/src/components/Button/Button.module.css @@ -54,7 +54,7 @@ cursor: not-allowed; } - &[data-loading='true'] { + &[data-ispending='true'] { cursor: wait; } } @@ -66,7 +66,7 @@ --fg: var(--bui-fg-solid); &[data-disabled='true'], - &[data-loading='true'] { + &[data-ispending='true'] { --bg: var(--bui-bg-solid-disabled); --bg-hover: var(--bui-bg-solid-disabled); --bg-active: var(--bui-bg-solid-disabled); @@ -100,7 +100,7 @@ --fg: var(--fg-solid-danger); &[data-disabled='true'], - &[data-loading='true'] { + &[data-ispending='true'] { --bg: var(--bg-solid-danger-disabled); --bg-hover: var(--bg-solid-danger-disabled); --bg-active: var(--bg-solid-danger-disabled); @@ -137,7 +137,7 @@ } &[data-disabled='true'], - &[data-loading='true'] { + &[data-ispending='true'] { --bg-hover: var(--bg); --bg-active: var(--bg); --fg: var(--bui-fg-disabled); @@ -166,7 +166,7 @@ --fg: var(--bui-fg-danger); &[data-disabled='true'], - &[data-loading='true'] { + &[data-ispending='true'] { --bg-hover: var(--bg); --bg-active: var(--bg); --fg: var(--bui-fg-disabled); @@ -198,7 +198,7 @@ } &[data-disabled='true'], - &[data-loading='true'] { + &[data-ispending='true'] { --bg-hover: var(--bg); --bg-active: var(--bg); --fg: var(--bui-fg-disabled); @@ -226,7 +226,7 @@ --fg: var(--bui-fg-danger); &[data-disabled='true'], - &[data-loading='true'] { + &[data-ispending='true'] { --bg-hover: var(--bg); --bg-active: var(--bg); --fg: var(--bui-fg-disabled); @@ -268,7 +268,7 @@ width: 100%; transition: opacity var(--loading-duration) ease-out; - .bui-Button[data-loading='true'] & { + .bui-Button[data-ispending='true'] & { opacity: 0; } } @@ -282,7 +282,7 @@ opacity: 0; transition: opacity var(--loading-duration) ease-in; - .bui-Button[data-loading='true'] & { + .bui-Button[data-ispending='true'] & { opacity: 1; } diff --git a/packages/ui/src/components/Button/Button.stories.tsx b/packages/ui/src/components/Button/Button.stories.tsx index 5781daca6a..3eec3ce36d 100644 --- a/packages/ui/src/components/Button/Button.stories.tsx +++ b/packages/ui/src/components/Button/Button.stories.tsx @@ -107,7 +107,7 @@ export const Destructive = meta.story({ - @@ -124,7 +124,7 @@ export const Destructive = meta.story({ - @@ -141,7 +141,7 @@ export const Destructive = meta.story({ - @@ -254,94 +254,94 @@ export const Responsive = meta.story({ }, }); -export const Loading = meta.story({ +export const Pending = meta.story({ render: () => { - const [isLoading, setIsLoading] = useState(false); + const [isPending, setIsPending] = useState(false); const handleClick = () => { - setIsLoading(true); + setIsPending(true); setTimeout(() => { - setIsLoading(false); + setIsPending(false); }, 3000); }; return ( - ); }, }); -export const LoadingVariants = meta.story({ +export const PendingVariants = meta.story({ render: () => ( Primary - - - Secondary - - - Tertiary - - - Primary Destructive - - - Loading vs Disabled + Pending vs Disabled - - diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx index 069c8632e0..92675a4f50 100644 --- a/packages/ui/src/components/Button/Button.tsx +++ b/packages/ui/src/components/Button/Button.tsx @@ -43,7 +43,7 @@ import { ButtonDefinition } from './definition'; * variant="primary" * size="medium" * iconStart={} - * loading={isSubmitting} + * isPending={isSubmitting} * > * Submit * @@ -55,15 +55,23 @@ export const Button = forwardRef( (props: ButtonProps, ref: Ref) => { const { ownProps, restProps, dataAttributes } = useDefinition( ButtonDefinition, - props, + // Merge deprecated `loading` into `isPending` so data attributes and + // internal logic only need to check a single prop. + { + ...props, + isPending: + props.isPending || props.loading + ? true + : props.isPending ?? props.loading, + }, ); - const { classes, iconStart, iconEnd, loading, children } = ownProps; + const { classes, iconStart, iconEnd, isPending, children } = ownProps; return ( diff --git a/packages/ui/src/components/Button/definition.ts b/packages/ui/src/components/Button/definition.ts index 21d3c7017b..891e21360d 100644 --- a/packages/ui/src/components/Button/definition.ts +++ b/packages/ui/src/components/Button/definition.ts @@ -34,6 +34,7 @@ export const ButtonDefinition = defineComponent()({ size: { dataAttribute: true, default: 'small' }, variant: { dataAttribute: true, default: 'primary' }, destructive: { dataAttribute: true }, + isPending: { dataAttribute: true }, loading: { dataAttribute: true }, iconStart: {}, iconEnd: {}, diff --git a/packages/ui/src/components/Button/types.ts b/packages/ui/src/components/Button/types.ts index 2bf36d808e..4f7ed8c50b 100644 --- a/packages/ui/src/components/Button/types.ts +++ b/packages/ui/src/components/Button/types.ts @@ -25,6 +25,8 @@ export type ButtonOwnProps = { destructive?: boolean; iconStart?: ReactElement; iconEnd?: ReactElement; + isPending?: boolean; + /** @deprecated Use `isPending` instead. */ loading?: boolean; children?: ReactNode; className?: string; diff --git a/packages/ui/src/components/ButtonIcon/ButtonIcon.module.css b/packages/ui/src/components/ButtonIcon/ButtonIcon.module.css index 8a345647c5..df4584cdea 100644 --- a/packages/ui/src/components/ButtonIcon/ButtonIcon.module.css +++ b/packages/ui/src/components/ButtonIcon/ButtonIcon.module.css @@ -54,7 +54,7 @@ cursor: not-allowed; } - &[data-loading='true'] { + &[data-ispending='true'] { cursor: wait; } } @@ -66,7 +66,7 @@ --fg: var(--bui-fg-solid); &[data-disabled='true'], - &[data-loading='true'] { + &[data-ispending='true'] { --bg: var(--bui-bg-solid-disabled); --bg-hover: var(--bui-bg-solid-disabled); --bg-active: var(--bui-bg-solid-disabled); @@ -104,7 +104,7 @@ } &[data-disabled='true'], - &[data-loading='true'] { + &[data-ispending='true'] { --bg-hover: var(--bg); --bg-active: var(--bg); --fg: var(--bui-fg-disabled); @@ -138,7 +138,7 @@ } &[data-disabled='true'], - &[data-loading='true'] { + &[data-ispending='true'] { --bg-hover: var(--bg); --bg-active: var(--bg); --fg: var(--bui-fg-disabled); @@ -179,7 +179,7 @@ width: 100%; transition: opacity var(--loading-duration) ease-out; - .bui-ButtonIcon[data-loading='true'] & { + .bui-ButtonIcon[data-ispending='true'] & { opacity: 0; } } @@ -193,7 +193,7 @@ opacity: 0; transition: opacity var(--loading-duration) ease-in; - .bui-ButtonIcon[data-loading='true'] & { + .bui-ButtonIcon[data-ispending='true'] & { opacity: 1; } diff --git a/packages/ui/src/components/ButtonIcon/ButtonIcon.stories.tsx b/packages/ui/src/components/ButtonIcon/ButtonIcon.stories.tsx index be6dad7754..75d95fdc1f 100644 --- a/packages/ui/src/components/ButtonIcon/ButtonIcon.stories.tsx +++ b/packages/ui/src/components/ButtonIcon/ButtonIcon.stories.tsx @@ -82,14 +82,14 @@ export const Responsive = meta.story({ render: args => } />, }); -export const Loading = meta.story({ +export const Pending = meta.story({ render: () => { - const [isLoading, setIsLoading] = useState(false); + const [isPending, setIsPending] = useState(false); const handleClick = () => { - setIsLoading(true); + setIsPending(true); setTimeout(() => { - setIsLoading(false); + setIsPending(false); }, 3000); }; @@ -97,14 +97,14 @@ export const Loading = meta.story({ } - loading={isLoading} + isPending={isPending} onPress={handleClick} /> ); }, }); -export const LoadingVariants = meta.story({ +export const PendingVariants = meta.story({ render: () => ( Primary @@ -113,13 +113,13 @@ export const LoadingVariants = meta.story({ variant="primary" size="small" icon={} - loading + isPending /> } - loading + isPending /> @@ -129,13 +129,13 @@ export const LoadingVariants = meta.story({ variant="secondary" size="small" icon={} - loading + isPending /> } - loading + isPending /> @@ -145,24 +145,24 @@ export const LoadingVariants = meta.story({ variant="tertiary" size="small" icon={} - loading + isPending /> } - loading + isPending /> - Loading vs Disabled + Pending vs Disabled - } loading /> + } isPending /> } isDisabled /> } - loading + isPending isDisabled /> diff --git a/packages/ui/src/components/ButtonIcon/ButtonIcon.tsx b/packages/ui/src/components/ButtonIcon/ButtonIcon.tsx index e5ac723f42..9aebc18d08 100644 --- a/packages/ui/src/components/ButtonIcon/ButtonIcon.tsx +++ b/packages/ui/src/components/ButtonIcon/ButtonIcon.tsx @@ -30,15 +30,23 @@ export const ButtonIcon = forwardRef( (props: ButtonIconProps, ref: Ref) => { const { ownProps, restProps, dataAttributes } = useDefinition( ButtonIconDefinition, - props, + // Merge deprecated `loading` into `isPending` so data attributes and + // internal logic only need to check a single prop. + { + ...props, + isPending: + props.isPending || props.loading + ? true + : props.isPending ?? props.loading, + }, ); - const { classes, icon, loading } = ownProps; + const { classes, icon, isPending } = ownProps; return ( diff --git a/packages/ui/src/components/ButtonIcon/definition.ts b/packages/ui/src/components/ButtonIcon/definition.ts index 0027227094..6c065188d8 100644 --- a/packages/ui/src/components/ButtonIcon/definition.ts +++ b/packages/ui/src/components/ButtonIcon/definition.ts @@ -33,6 +33,7 @@ export const ButtonIconDefinition = defineComponent()({ propDefs: { size: { dataAttribute: true, default: 'small' }, variant: { dataAttribute: true, default: 'primary' }, + isPending: { dataAttribute: true }, loading: { dataAttribute: true }, icon: {}, className: {}, diff --git a/packages/ui/src/components/ButtonIcon/types.ts b/packages/ui/src/components/ButtonIcon/types.ts index f30f01ff99..69ebcc21ec 100644 --- a/packages/ui/src/components/ButtonIcon/types.ts +++ b/packages/ui/src/components/ButtonIcon/types.ts @@ -23,6 +23,8 @@ export type ButtonIconOwnProps = { size?: Responsive<'small' | 'medium'>; variant?: Responsive<'primary' | 'secondary' | 'tertiary'>; icon?: ReactElement; + isPending?: boolean; + /** @deprecated Use `isPending` instead. */ loading?: boolean; className?: string; }; diff --git a/packages/ui/src/components/Card/Card.module.css b/packages/ui/src/components/Card/Card.module.css index eced185550..617c922707 100644 --- a/packages/ui/src/components/Card/Card.module.css +++ b/packages/ui/src/components/Card/Card.module.css @@ -29,18 +29,6 @@ padding: var(--bui-space-3); } - .bui-Card[data-bg='neutral-1'] { - --bui-card-bg: var(--bui-bg-neutral-1); - } - - .bui-Card[data-bg='neutral-2'] { - --bui-card-bg: var(--bui-bg-neutral-2); - } - - .bui-Card[data-bg='neutral-3'] { - --bui-card-bg: var(--bui-bg-neutral-3); - } - .bui-Card:has(.bui-CardHeader, .bui-CardBody, .bui-CardFooter) { padding: 0; } @@ -94,7 +82,7 @@ .bui-CardBody { flex: 1; - min-height: 0; + min-height: var(--bui-space-6); overflow: auto; padding-inline: var(--bui-space-3); padding-block: var(--bui-space-3); @@ -111,8 +99,14 @@ .bui-Card:has(.bui-CardHeader) .bui-CardBody { padding-block-start: 0; + } - &::before { + .bui-Card:has(.bui-CardFooter) .bui-CardBody { + padding-block-end: 0; + } + + @supports (animation-timeline: scroll()) { + .bui-Card:has(.bui-CardHeader) .bui-CardBody::before { content: ''; position: sticky; top: 0; @@ -121,8 +115,8 @@ margin-bottom: -1.5rem; background: linear-gradient( to bottom, - var(--bui-card-bg), - rgb(from var(--bui-card-bg) r g b / 0) + var(--bui-bg-inherit), + rgb(from var(--bui-bg-inherit) r g b / 0) ); pointer-events: none; opacity: 0; @@ -130,12 +124,8 @@ animation-timeline: scroll(); animation-range: 0px 2.5rem; } - } - .bui-Card:has(.bui-CardFooter) .bui-CardBody { - padding-block-end: 0; - - &::after { + .bui-Card:has(.bui-CardFooter) .bui-CardBody::after { content: ''; position: sticky; bottom: 0; @@ -144,8 +134,8 @@ margin-top: -1.5rem; background: linear-gradient( to top, - var(--bui-card-bg), - rgb(from var(--bui-card-bg) r g b / 0) + var(--bui-bg-inherit), + rgb(from var(--bui-bg-inherit) r g b / 0) ); pointer-events: none; opacity: 0; diff --git a/packages/ui/src/components/Card/Card.tsx b/packages/ui/src/components/Card/Card.tsx index aecca09512..498fd5b021 100644 --- a/packages/ui/src/components/Card/Card.tsx +++ b/packages/ui/src/components/Card/Card.tsx @@ -41,7 +41,7 @@ const INTERACTIVE_ELEMENT_SELECTOR = * @public */ export const Card = forwardRef((props, ref) => { - const { ownProps, restProps, dataAttributes } = useDefinition( + const { ownProps, restProps, dataAttributes, utilityStyle } = useDefinition( CardDefinition, props, ); @@ -98,6 +98,7 @@ export const Card = forwardRef((props, ref) => { {...dataAttributes} {...restProps} onClick={isInteractive ? handleClick : undefined} + style={{ ...utilityStyle, ...ownProps.style }} > {href && ( ()({ target: {}, rel: {}, download: {}, + style: {}, }, + utilityProps: ['grow', 'shrink', 'basis'], }); /** diff --git a/packages/ui/src/components/Card/types.ts b/packages/ui/src/components/Card/types.ts index 5809384c16..83daf2de08 100644 --- a/packages/ui/src/components/Card/types.ts +++ b/packages/ui/src/components/Card/types.ts @@ -14,11 +14,16 @@ * limitations under the License. */ -import type { ReactNode } from 'react'; +import type { ReactNode, CSSProperties } from 'react'; import type { ButtonProps as RAButtonProps } from 'react-aria-components'; +import type { FlexItemProps } from '../../types'; /** @public */ -export type CardBaseProps = { children?: ReactNode; className?: string }; +export type CardBaseProps = { + children?: ReactNode; + className?: string; + style?: CSSProperties; +}; /** @public */ export type CardButtonVariant = { @@ -63,6 +68,7 @@ export type CardStaticVariant = { * @public */ export type CardProps = CardBaseProps & + FlexItemProps & Omit, 'onClick'> & (CardButtonVariant | CardLinkVariant | CardStaticVariant); @@ -81,6 +87,7 @@ export type CardOwnProps = Pick< | 'target' | 'rel' | 'download' + | 'style' >; /** @public */ diff --git a/packages/ui/src/components/Checkbox/Checkbox.module.css b/packages/ui/src/components/Checkbox/Checkbox.module.css index 54705d95e9..09fc386ff1 100644 --- a/packages/ui/src/components/Checkbox/Checkbox.module.css +++ b/packages/ui/src/components/Checkbox/Checkbox.module.css @@ -68,6 +68,19 @@ color: var(--bui-fg-primary); } + .bui-Checkbox[data-invalid] & { + box-shadow: inset 0 0 0 1px var(--bui-border-danger); + } + + .bui-Checkbox[data-invalid][data-selected] & { + background-color: var(--bui-border-danger); + box-shadow: none; + } + + .bui-Checkbox[data-invalid][data-indeterminate] & { + box-shadow: inset 0 0 0 1px var(--bui-border-danger); + } + @media (prefers-reduced-motion: reduce) { & { transition: none; diff --git a/packages/ui/src/components/Checkbox/Checkbox.stories.tsx b/packages/ui/src/components/Checkbox/Checkbox.stories.tsx index 94811d5cb6..1ef1e873f4 100644 --- a/packages/ui/src/components/Checkbox/Checkbox.stories.tsx +++ b/packages/ui/src/components/Checkbox/Checkbox.stories.tsx @@ -62,6 +62,12 @@ export const WithLongText = Default.extend({ ], }); +export const Invalid = Default.extend({ + args: { + isInvalid: true, + }, +}); + export const AllVariants = meta.story({ ...Default.input, render: () => ( @@ -76,6 +82,13 @@ export const AllVariants = meta.story({ Indeterminate & Disabled + Invalid + + Invalid & Checked + + + Invalid & Indeterminate + ), }); diff --git a/packages/ui/src/components/Combobox/Combobox.module.css b/packages/ui/src/components/Combobox/Combobox.module.css new file mode 100644 index 0000000000..3ec2748cec --- /dev/null +++ b/packages/ui/src/components/Combobox/Combobox.module.css @@ -0,0 +1,253 @@ +/* + * Copyright 2026 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. + */ + +@layer tokens, base, components, utilities; + +@layer components { + .bui-Combobox, + .bui-ComboboxPopover { + &[data-size='small'] { + --combobox-item-height: 2rem; + } + + &[data-size='medium'] { + --combobox-item-height: 2.5rem; + } + } + + .bui-ComboboxPopover { + min-width: var(--trigger-width); + + :global(.bui-PopoverContent) { + padding: 0; + } + } + + .bui-ComboboxInput { + box-sizing: border-box; + border-radius: var(--bui-radius-3); + border: none; + outline: none; + background-color: var(--bui-bg-neutral-1); + transition: box-shadow 0.2s ease-in-out; + + &[data-on-bg='neutral-1'] { + background-color: var(--bui-bg-neutral-2); + } + + &[data-on-bg='neutral-2'] { + background-color: var(--bui-bg-neutral-3); + } + + &[data-on-bg='neutral-3'] { + background-color: var(--bui-bg-neutral-4); + } + + .bui-Combobox[data-focus-within] & { + box-shadow: inset 0 0 0 1px var(--bui-ring); + } + + .bui-Combobox[data-invalid] & { + box-shadow: inset 0 0 0 1px var(--bui-border-danger); + } + + display: flex; + align-items: center; + gap: var(--bui-space-2); + width: 100%; + height: var(--combobox-item-height); + + .bui-Combobox[data-size='small'] & { + padding-inline: var(--bui-space-3) 0; + } + + .bui-Combobox[data-size='medium'] & { + padding-inline: var(--bui-space-4) 0; + } + + &[data-disabled] { + cursor: not-allowed; + } + } + + .bui-ComboboxInputIcon { + display: grid; + place-content: center; + flex-shrink: 0; + color: var(--bui-fg-secondary); + pointer-events: none; + + .bui-Combobox[data-size='small'] & svg { + width: 1rem; + height: 1rem; + } + + .bui-Combobox[data-size='medium'] & svg { + width: 1.25rem; + height: 1.25rem; + } + } + + .bui-ComboboxInputField { + flex: 1; + min-width: 0; + width: 100%; + border: none; + outline: none; + background-color: transparent; + padding: 0; + color: var(--bui-fg-primary); + font-size: var(--bui-font-size-3); + font-family: var(--bui-font-regular); + font-weight: var(--bui-font-weight-regular); + line-height: var(--combobox-item-height); + height: 100%; + text-overflow: ellipsis; + + &::placeholder { + color: var(--bui-fg-secondary); + } + + &[disabled] { + cursor: not-allowed; + color: var(--bui-fg-disabled); + } + } + + .bui-ComboboxInputChevron { + flex-shrink: 0; + flex-grow: 0; + display: grid; + place-content: center; + width: var(--combobox-item-height); + height: var(--combobox-item-height); + background-color: transparent; + border: none; + padding: 0; + margin: 0; + cursor: pointer; + color: var(--bui-fg-secondary); + outline: none; + transition: color 0.2s ease-in-out; + + &:hover { + color: var(--bui-fg-primary); + } + + & svg { + .bui-Combobox[data-size='small'] & { + width: 1rem; + height: 1rem; + } + + .bui-Combobox[data-size='medium'] & { + width: 1.25rem; + height: 1.25rem; + } + } + + &[data-disabled] { + cursor: not-allowed; + color: var(--bui-fg-disabled); + } + } + + .bui-ComboboxList { + overflow: auto; + min-height: 0; + padding-block: var(--bui-space-1); + padding-inline: var(--bui-space-1); + + &[data-focus-visible] { + outline: none; + } + } + + .bui-ComboboxItem { + box-sizing: border-box; + position: relative; + display: grid; + grid-template-areas: 'icon text'; + grid-template-columns: 1rem 1fr; + align-items: center; + min-height: var(--combobox-item-height); + padding-block: var(--bui-space-1); + padding-left: var(--bui-space-3); + padding-right: var(--bui-space-4); + color: var(--bui-fg-primary); + cursor: pointer; + user-select: none; + font-size: var(--bui-font-size-3); + gap: var(--bui-space-2); + outline: none; + border-radius: var(--bui-radius-2); + + &[data-focused] { + background-color: var(--bui-bg-neutral-2); + } + + &[data-disabled] { + cursor: not-allowed; + color: var(--bui-fg-disabled); + } + + &[data-selected] .bui-ComboboxItemIndicator { + opacity: 1; + } + } + + .bui-ComboboxItemIndicator { + grid-area: icon; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + transition: opacity 0.2s ease-in-out; + } + + .bui-ComboboxItemLabel { + flex: 1; + grid-area: text; + } + + .bui-ComboboxSection { + &:first-child .bui-ComboboxSectionHeader { + padding-top: 0; + } + } + + .bui-ComboboxSectionHeader { + height: 2rem; + display: flex; + align-items: center; + padding-top: var(--bui-space-3); + padding-left: var(--bui-space-3); + color: var(--bui-fg-primary); + font-size: var(--bui-font-size-1); + font-weight: bold; + letter-spacing: 0.05rem; + text-transform: uppercase; + } + + .bui-ComboboxNoResults { + padding-inline: var(--bui-space-3); + padding-block: var(--bui-space-2); + color: var(--bui-fg-secondary); + font-size: var(--bui-font-size-3); + font-family: var(--bui-font-regular); + font-weight: var(--bui-font-weight-regular); + } +} diff --git a/packages/ui/src/components/Combobox/Combobox.stories.tsx b/packages/ui/src/components/Combobox/Combobox.stories.tsx new file mode 100644 index 0000000000..6cd1aa93de --- /dev/null +++ b/packages/ui/src/components/Combobox/Combobox.stories.tsx @@ -0,0 +1,307 @@ +/* + * Copyright 2026 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 preview from '../../../../../.storybook/preview'; +import { Combobox } from './Combobox'; +import { Flex } from '../Flex'; +import { Box } from '../Box'; +import { Text } from '../Text'; +import { Form } from 'react-aria-components'; +import { RiCloudLine } from '@remixicon/react'; + +const meta = preview.meta({ + title: 'Backstage UI/Combobox', + component: Combobox, + args: { + style: { width: 300 }, + }, +}); + +const fontOptions = [ + { value: 'sans', label: 'Sans-serif' }, + { value: 'serif', label: 'Serif' }, + { value: 'mono', label: 'Monospace' }, + { value: 'cursive', label: 'Cursive' }, +]; + +const countries = [ + { value: 'us', label: 'United States' }, + { value: 'ca', label: 'Canada' }, + { value: 'mx', label: 'Mexico' }, + { value: 'uk', label: 'United Kingdom' }, + { value: 'fr', label: 'France' }, + { value: 'de', label: 'Germany' }, + { value: 'it', label: 'Italy' }, + { value: 'es', label: 'Spain' }, + { value: 'jp', label: 'Japan' }, + { value: 'cn', label: 'China' }, + { value: 'in', label: 'India' }, + { value: 'br', label: 'Brazil' }, + { value: 'au', label: 'Australia' }, +]; + +const sectionedOptions = [ + { + title: 'Serif Fonts', + options: [ + { value: 'times', label: 'Times New Roman' }, + { value: 'georgia', label: 'Georgia' }, + { value: 'garamond', label: 'Garamond' }, + ], + }, + { + title: 'Sans-Serif Fonts', + options: [ + { value: 'arial', label: 'Arial' }, + { value: 'helvetica', label: 'Helvetica' }, + { value: 'verdana', label: 'Verdana' }, + ], + }, + { + title: 'Monospace Fonts', + options: [ + { value: 'courier', label: 'Courier New' }, + { value: 'consolas', label: 'Consolas' }, + { value: 'fira', label: 'Fira Code' }, + ], + }, +]; + +export const Default = meta.story({ + args: { + label: 'Font Family', + options: fontOptions, + placeholder: 'Pick a font', + name: 'font', + }, +}); + +export const WithIcon = meta.story({ + args: { + ...Default.input.args, + }, + render: args => } />, +}); + +export const WithSections = meta.story({ + args: { + label: 'Font Family', + options: sectionedOptions, + placeholder: 'Pick a font', + name: 'font', + }, +}); + +export const AllowsCustomValue = meta.story({ + args: { + label: 'Country', + options: countries, + placeholder: 'Type any country', + allowsCustomValue: true, + name: 'country', + }, +}); + +export const Sizes = meta.story({ + args: { + ...Default.input.args, + }, + render: args => ( + + } /> + } /> + + ), +}); + +export const Required = meta.story({ + args: { + ...Default.input.args, + isRequired: true, + }, +}); + +export const Disabled = meta.story({ + args: { + ...Default.input.args, + isDisabled: true, + }, +}); + +export const WithLabelAndDescription = meta.story({ + args: { + ...Default.input.args, + description: 'Choose a font family for your document', + }, +}); + +export const WithDefaultValue = meta.story({ + args: { + ...Default.input.args, + defaultValue: 'serif', + }, +}); + +export const WithFullWidth = meta.story({ + args: { + ...Default.input.args, + style: { width: '100%' }, + }, +}); + +export const NoOptions = meta.story({ + args: { + ...Default.input.args, + options: undefined, + }, +}); + +export const DisabledOption = meta.story({ + args: { + ...Default.input.args, + disabledKeys: ['cursive', 'serif'], + }, +}); + +export const WithValue = meta.story({ + args: { + ...Default.input.args, + value: 'mono', + defaultValue: 'serif', + }, +}); + +export const WithError = meta.story({ + args: { + ...Default.input.args, + }, + render: args => ( +
+ + + ), +}); + +export const WithLongNames = meta.story({ + args: { + label: 'Document Template', + options: [ + { + value: 'annual-report-2024', + label: + 'Annual Financial Report and Strategic Planning Document for Fiscal Year 2024 with Comprehensive Analysis of Market Trends, Competitive Landscape, Financial Performance Metrics, Revenue Projections, Cost Optimization Strategies, Risk Assessment, and Long-term Growth Initiatives Across All Business Units and Geographical Regions', + }, + { + value: 'product-roadmap', + label: + 'Comprehensive Product Development Roadmap and Feature Implementation Timeline Including Detailed Technical Specifications, Resource Allocation Plans, Cross-functional Team Dependencies, Milestone Tracking, Quality Assurance Procedures, User Acceptance Testing Protocols, and Post-launch Support Strategy for All Product Lines and Service Offerings', + }, + { + value: 'user-guide', + label: + 'Detailed User Guide and Technical Documentation for Advanced System Features Covering Installation Procedures, Configuration Settings, Security Protocols, Troubleshooting Guidelines, Best Practices, Common Use Cases, Performance Optimization Tips, Integration Methods, API Documentation, and Frequently Asked Questions with Step-by-Step Solutions', + }, + ], + placeholder: 'Select a document template', + name: 'template', + style: { maxWidth: 400 }, + defaultValue: 'annual-report-2024', + }, +}); + +export const WithLongNamesAndPadding = meta.story({ + args: { + ...WithLongNames.input.args, + }, + decorators: [ + (Story, { args }) => ( +
+ +
+ ), + ], +}); + +export const AutoBg = meta.story({ + render: () => ( + +
+ Combobox automatically detects its parent bg context and increments the + neutral level by 1. No prop is needed — it's fully automatic. +
+ + Neutral 1 container + + + + + + + Neutral 2 container + + + + + + + + + Neutral 3 container + + + + + + +
+ ), +}); + +export const WithAccessibilityProps = meta.story({ + args: { + ...Default.input.args, + }, + render: args => ( + +
+

With aria-label

+ +
+
+

With aria-labelledby

+
+ Font Family Selection +
+ +
+
+ ), +}); diff --git a/packages/ui/src/components/Combobox/Combobox.tsx b/packages/ui/src/components/Combobox/Combobox.tsx new file mode 100644 index 0000000000..b59dffb320 --- /dev/null +++ b/packages/ui/src/components/Combobox/Combobox.tsx @@ -0,0 +1,92 @@ +/* + * Copyright 2026 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 { forwardRef, useEffect } from 'react'; +import { ComboBox as AriaComboBox } from 'react-aria-components'; +import { useFilter } from 'react-aria'; +import { ComboboxProps } from './types'; +import { useDefinition } from '../../hooks/useDefinition'; +import { ComboboxDefinition } from './definition'; +import { Popover } from '../Popover'; +import { FieldLabel } from '../FieldLabel'; +import { FieldError } from '../FieldError'; +import { ComboboxInput } from './ComboboxInput'; +import { ComboboxListBox } from './ComboboxListBox'; + +/** + * A text input combined with a dropdown list of options. The user can type to filter + * suggestions, navigate with the keyboard, and pick a value. With `allowsCustomValue` + * the typed text can be committed even if no option matches. + * + * @public + */ +export const Combobox = forwardRef( + (props, ref) => { + const { contains } = useFilter({ sensitivity: 'base' }); + const { ownProps, restProps, dataAttributes } = useDefinition( + ComboboxDefinition, + props, + ); + const { + classes, + label, + description, + options, + icon, + placeholder, + isRequired, + secondaryLabel, + } = ownProps; + + const ariaLabel = restProps['aria-label']; + const ariaLabelledBy = restProps['aria-labelledby']; + + useEffect(() => { + if (!label && !ariaLabel && !ariaLabelledBy) { + console.warn( + 'Combobox requires either a visible label, aria-label, or aria-labelledby for accessibility', + ); + } + }, [label, ariaLabel, ariaLabelledBy]); + + const secondaryLabelText = + secondaryLabel || (isRequired ? 'Required' : null); + + return ( + + + + + + + + + ); + }, +); + +Combobox.displayName = 'Combobox'; diff --git a/packages/ui/src/components/Combobox/ComboboxInput.tsx b/packages/ui/src/components/Combobox/ComboboxInput.tsx new file mode 100644 index 0000000000..ce7acfff71 --- /dev/null +++ b/packages/ui/src/components/Combobox/ComboboxInput.tsx @@ -0,0 +1,43 @@ +/* + * Copyright 2026 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 { Button, Group, Input } from 'react-aria-components'; +import { RiArrowDownSLine } from '@remixicon/react'; +import { useDefinition } from '../../hooks/useDefinition'; +import { ComboboxInputDefinition } from './definition'; +import type { ComboboxInputOwnProps } from './types'; + +export function ComboboxInput(props: ComboboxInputOwnProps) { + const { ownProps, dataAttributes } = useDefinition( + ComboboxInputDefinition, + props, + ); + const { classes, icon, placeholder } = ownProps; + + return ( + + {icon ? ( + + ) : null} + + + + ); +} diff --git a/packages/ui/src/components/Combobox/ComboboxListBox.tsx b/packages/ui/src/components/Combobox/ComboboxListBox.tsx new file mode 100644 index 0000000000..ae65bd8da3 --- /dev/null +++ b/packages/ui/src/components/Combobox/ComboboxListBox.tsx @@ -0,0 +1,90 @@ +/* + * Copyright 2026 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 { + ListBox, + ListBoxItem, + ListBoxSection, + Header, + Text, +} from 'react-aria-components'; +import { RiCheckLine } from '@remixicon/react'; +import { useDefinition } from '../../hooks/useDefinition'; +import { + ComboboxListBoxDefinition, + ComboboxListBoxItemDefinition, + ComboboxSectionDefinition, +} from './definition'; +import type { Option, OptionSection, ComboboxListBoxOwnProps } from './types'; + +const NoResults = () => { + const { ownProps } = useDefinition(ComboboxListBoxDefinition, {}); + const { classes } = ownProps; + + return
No results found.
; +}; + +function ComboboxItem({ option }: { option: Option }) { + const { ownProps } = useDefinition(ComboboxListBoxItemDefinition, {}); + const { classes } = ownProps; + + return ( + +
+
+ + {option.label} + +
+ ); +} + +function ComboboxSectionItems({ section }: { section: OptionSection }) { + const { ownProps } = useDefinition(ComboboxSectionDefinition, {}); + const { classes } = ownProps; + + return ( + +
{section.title}
+ {section.options.map(option => ( + + ))} +
+ ); +} + +export function ComboboxListBox(props: ComboboxListBoxOwnProps) { + const { ownProps } = useDefinition(ComboboxListBoxDefinition, props); + const { classes, options } = ownProps; + + return ( + }> + {options?.map(item => + 'options' in item ? ( + + ) : ( + + ), + )} + + ); +} diff --git a/packages/ui/src/components/Combobox/definition.ts b/packages/ui/src/components/Combobox/definition.ts new file mode 100644 index 0000000000..06143e7c05 --- /dev/null +++ b/packages/ui/src/components/Combobox/definition.ts @@ -0,0 +1,114 @@ +/* + * Copyright 2026 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 { defineComponent } from '../../hooks/useDefinition'; +import type { + ComboboxOwnProps, + ComboboxInputOwnProps, + ComboboxListBoxOwnProps, + ComboboxListBoxItemOwnProps, + ComboboxSectionOwnProps, +} from './types'; +import styles from './Combobox.module.css'; + +/** + * Component definition for Combobox + * @public + */ +export const ComboboxDefinition = defineComponent()({ + styles, + classNames: { + root: 'bui-Combobox', + popover: 'bui-ComboboxPopover', + }, + propDefs: { + icon: {}, + size: { dataAttribute: true, default: 'small' }, + options: {}, + placeholder: {}, + label: {}, + secondaryLabel: {}, + description: {}, + isRequired: {}, + className: {}, + }, +}); + +/** + * Component definition for ComboboxInput + * @public + */ +export const ComboboxInputDefinition = defineComponent()( + { + styles, + classNames: { + root: 'bui-ComboboxInput', + icon: 'bui-ComboboxInputIcon', + input: 'bui-ComboboxInputField', + chevron: 'bui-ComboboxInputChevron', + }, + bg: 'consumer', + propDefs: { + icon: {}, + placeholder: {}, + }, + }, +); + +/** + * Component definition for ComboboxListBox + * @public + */ +export const ComboboxListBoxDefinition = + defineComponent()({ + styles, + classNames: { + root: 'bui-ComboboxList', + noResults: 'bui-ComboboxNoResults', + }, + propDefs: { + options: {}, + }, + }); + +/** + * Component definition for ComboboxListBoxItem + * @public + */ +export const ComboboxListBoxItemDefinition = + defineComponent()({ + styles, + classNames: { + root: 'bui-ComboboxItem', + indicator: 'bui-ComboboxItemIndicator', + label: 'bui-ComboboxItemLabel', + }, + propDefs: {}, + }); + +/** + * Component definition for ComboboxSection + * @public + */ +export const ComboboxSectionDefinition = + defineComponent()({ + styles, + classNames: { + root: 'bui-ComboboxSection', + header: 'bui-ComboboxSectionHeader', + }, + propDefs: {}, + }); diff --git a/packages/ui/src/components/Combobox/index.ts b/packages/ui/src/components/Combobox/index.ts new file mode 100644 index 0000000000..9c9a52ff1a --- /dev/null +++ b/packages/ui/src/components/Combobox/index.ts @@ -0,0 +1,25 @@ +/* + * Copyright 2026 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 './Combobox'; +export * from './types'; +export { + ComboboxDefinition, + ComboboxInputDefinition, + ComboboxListBoxDefinition, + ComboboxListBoxItemDefinition, + ComboboxSectionDefinition, +} from './definition'; diff --git a/packages/ui/src/components/Combobox/types.ts b/packages/ui/src/components/Combobox/types.ts new file mode 100644 index 0000000000..6d2c0423e7 --- /dev/null +++ b/packages/ui/src/components/Combobox/types.ts @@ -0,0 +1,76 @@ +/* + * Copyright 2026 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 { ReactNode } from 'react'; +import type { ComboBoxProps as AriaComboBoxProps } from 'react-aria-components'; +import type { Breakpoint } from '../..'; +import type { FieldLabelProps } from '../FieldLabel/types'; +import type { Option, OptionSection } from '../Select/types'; + +export type { Option, OptionSection }; + +/** @public */ +export type ComboboxOwnProps = { + /** + * An icon to render before the input + */ + icon?: ReactNode; + + /** + * The size of the combobox field + * @defaultValue 'small' + */ + size?: 'small' | 'medium' | Partial>; + + /** + * The options of the combobox field. Pass flat options, option sections for + * grouped display, or a mix of both in the same array. + */ + options?: Array