21074 Commits

Author SHA1 Message Date
Fredrik Adelöw 0eb8d1a31f Merge pull request #33290 from backstage/freben/catalog-exists-query-optimization
catalog-backend: optimize entity filter queries with EXISTS
2026-03-29 12:48:38 +02:00
Patrik Oldsberg 9f3affb864 Merge pull request #33601 from thomvaill/github-provider-fix-validateLocationsExist-with-branch-filter
fix(github-provider): `validateLocationsExist: true` + `filters.branch` bug [contribfest]
2026-03-29 12:14:23 +02:00
Fredrik Adelöw 688481429c catalog-backend: optimize entity filter queries with EXISTS
Switch filter query builders from IN (subquery) to EXISTS (correlated
subquery) patterns. This enables PostgreSQL semi-join optimizations
(stops at first match) and replaces NOT IN with NOT EXISTS (faster,
no NULL-semantics pitfalls).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-03-28 22:45:48 +01:00
Fredrik Adelöw 8e9679b3eb Parallelize CLI report generation in repo-tools
Converts createBinRunner from spawnSync to async spawn, and processes
all CLI packages concurrently with a shared p-limit limiter bounded
by CPU count. Reduces wall-clock time from ~50s to ~12s.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-03-28 17:48:33 +01:00
Fredrik Adelöw 400aa2313a Add FetchMiddlewares.clarifyFailures and improve permission error handling
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-03-28 16:55:33 +01:00
Patrik Oldsberg e923ff1485 Remove unnecessary NFS page component exports
Page components without props don't need to be exported from the
package API surface. Import directly from the component file in
the alpha entry points instead.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-28 14:50:59 +01:00
Patrik Oldsberg 31c460da83 scaffolder: use table layout for actions page
Replace the accordion-based actions list with a Table component from
@backstage/ui, providing aligned columns for action name and description
with click-to-expand detail view.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-28 14:50:00 +01:00
Patrik Oldsberg 5d8112e8f1 scaffolder: migrate actions page to accordion layout
Replace the table-based actions page with an accordion layout using
@backstage/ui components. Each action is listed as an expandable
accordion, letting users browse the full list while expanding
individual actions to see their schema details inline. This avoids
the need to scroll between a table and a detail section.

The search field is kept for filtering actions by name or description.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-28 14:18:30 +01:00
Fredrik Adelöw 524d733762 Merge pull request #33651 from backstage/freben/remove-jest-when-dep
Remove unused jest-when dependency from scaffolder-backend-module-rails
2026-03-28 11:53:44 +01:00
Fredrik Adelöw 54f9639f3b Merge pull request #33650 from backstage/freben/simplify-create-route-ref-types
Simplify createRouteRef type signature
2026-03-28 11:20:45 +01:00
Fredrik Adelöw 2905c5931d Remove unused jest-when dev dependency from scaffolder-backend-module-rails
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-03-28 11:16:00 +01:00
Fredrik Adelöw 49397c16e0 Simplify createRouteRef type signature
Replace dual TParams/TParamKeys type parameters with a single TParamKey,
removing unnecessary complexity while preserving runtime behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-03-28 10:58:37 +01:00
Patrik Oldsberg 7d942709fa Merge pull request #31406 from fcamgz/search-modal-overflow-fix
Fixed SearchModal not cleaning up body overflow
2026-03-28 09:58:09 +01:00
Jon Koops 5cd814f541 refactor(backend-defaults): migrate internal Zod usage from v3 to v4
The auditor's severity log level mappings previously used a `zod/v3`
`z.record()` schema with manual fallbacks for defaults and relied on
casting into Zod error internals (`.received`, `.options`) that changed
between v3 and v4. This replaces it with a `z.object()` schema using
`.default()` so that Zod owns the default values and type inference,
and derives the valid values and received input without reaching into
undocumented error properties.

This does not migrate all `zod/v3` imports in the package, as the
remaining usages are tied to public API types (e.g. `AnyZodObject`
from `@backstage/backend-plugin-api`).

Signed-off-by: Jon Koops <jonkoops@gmail.com>
2026-03-27 17:48:23 +01:00
Marat Dyatko e5af44c846 Address PR review feedback from freben
- Consolidate changesets: one for catalog-react (deprecation), one combined
  for the remaining 5 plugins
- Add entity-presentation to microsite/sidebars.ts
- Update @deprecated tags to point to useEntityPresentation /
  entityPresentationApiRef only, not defaultEntityPresentation
- Use entityPresentationApiRef with .promise in async loaders
  (StepPrepareCreatePullRequest, TemplateFormPreviewer)
- Add optional entityPresentation?: EntityPresentationApi param to sync
  column factories and use .snapshot when available
  (columnFactories, EntityTable/columns, EntityOwnerPicker, CatalogTable)
- Rewrite entity-presentation.md to recommend .snapshot/.promise instead
  of defaultEntityPresentation
- Update TSDoc on entityPresentationApiRef, EntityPresentationApi,
  defaultEntityPresentation, useEntityPresentation, EntityDisplayName
- Re-export presentation API types from alpha entry point
- Update API reports
- Fix test mocks for entityPresentationApiRef

Made-with: Cursor
Signed-off-by: Marat Dyatko <maratd@spotify.com>
Made-with: Cursor
2026-03-27 14:04:04 +01:00
Johan Persson 04162167f5 fix(catalog-react): fix relation cards showing only one entity
Use `paginationOptions: { type: 'none' }` in EntityDataTable instead
of deriving page size from data length, which was 0 during the initial
loading render causing only one row to be displayed.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-03-27 12:36:03 +01:00
Johan Persson 3bc23a5587 feat(ui): support disabling pagination in useTable complete mode
Add `CompletePaginationOptions` type extending `PaginationOptions`
with a `type` field supporting `'page'` (default) and `'none'`.
When using `mode: 'complete'` with `type: 'none'`, `useTable` skips
data slicing and produces `pagination: { type: 'none' }` in
`tableProps` directly.

Also sync `pageSize` state when `paginationOptions.pageSize` changes
dynamically, fixing cases where the initial value became stale.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-03-27 12:36:03 +01:00
Fredrik Adelöw 654d993c1b Merge pull request #33612 from wtravO/AWSS3UrlReader-fix-for-region-url-matching
fix: treat any url ending with amazonaws.com(.cn) as Amazon Hosted
2026-03-27 11:41:39 +01:00
Fredrik Adelöw 150418a35f Merge pull request #33611 from backstage/dependabot/npm_and_yarn/nodemailer-8.0.4
build(deps): bump nodemailer from 7.0.13 to 8.0.4
2026-03-27 11:35:54 +01:00
Fredrik Adelöw 94c64ee33d Merge pull request #33596 from jonkoops/dom-asynciterable-types
chore: add `DOM.AsyncIterable` lib and use standard filesystem types
2026-03-27 11:31:37 +01:00
Travis O'Neal 6e2aaabdf3 fix: treat any url ending with amazonaws.com or amazonaws.com.cn as Amazon hosted
Signed-off-by: Travis O'Neal <wtravisoneal@gmail.com>
2026-03-26 22:17:51 -04:00
dependabot[bot] 19ef9fbf34 build(deps): bump nodemailer from 7.0.13 to 8.0.4
Bumps [nodemailer](https://github.com/nodemailer/nodemailer) from 7.0.13 to 8.0.4.
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodemailer/nodemailer/compare/v7.0.13...v8.0.4)

---
updated-dependencies:
- dependency-name: nodemailer
  dependency-version: 8.0.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-27 01:14:52 +00:00
ElaineDeMattosSilvaB 8474da5694 feat: add api report and changeset
Signed-off-by: ElaineDeMattosSilvaB <elaine.mattos@gmail.com>
2026-03-26 21:07:18 +01:00
thomvaill b11e3380af fix(github-provider): validateLocationsExist: true + filters.branch bug
Signed-off-by: thomvaill <thomvaill@bluebricks.dev>
2026-03-26 20:29:54 +01:00
Charles de Dreuille 66a75bd7d5 Merge pull request #33597 from backstage/bui-fix-relative-links
fix(ui): resolve relative hrefs to absolute paths before navigation
2026-03-26 17:24:44 +00:00
Johan Persson d840ba9053 fix(ui): resolve relative hrefs to absolute paths before navigation
BUI link components with relative hrefs (e.g. `../other`) would
navigate to the wrong URL because React Aria's navigate callback
receives the raw href string and cannot resolve it correctly from
where it is called in Backstage's routing setup.

This adds a `resolveHref` flag to the component definition system.
When enabled, `useDefinition` calls `useHref()` to turn relative
hrefs into absolute paths before they reach the React Aria layer.
A compile-time type guard ensures components with `href` in their
props cannot omit the flag.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-03-26 17:26:34 +01:00
Fredrik Adelöw 3f8060c460 Merge pull request #33536 from jonkoops/fix/zod-schema-first-generics
fix: use schema-first generic pattern for Zod type compatibility
2026-03-26 17:16:51 +01:00
Jon Koops fa550786b0 fix: use schema-first generic pattern for Zod type compatibility
Refactor `SignInResolverFactoryOptions` and `createSchemaFromZod` to use
`TSchema extends ZodType` instead of `ZodSchema<Output, Def, Input>`,
avoiding "excessively deep" TypeScript inference errors when multiple
Zod copies are resolved in a project.

Signed-off-by: Jon Koops <jonkoops@gmail.com>
2026-03-26 16:31:41 +01:00
Jon Koops a7a14b78c1 chore: add DOM.AsyncIterable lib and use standard filesystem types
Add `DOM.AsyncIterable` to the shared TypeScript configuration in
`@backstage/cli`, making standard async iteration methods available on
DOM APIs like `FileSystemDirectoryHandle`. This aligns behavior with
TypeScript 6.0, where this lib is included in `DOM` by default.

With the async iterable types now available, replace the custom
`IterableDirectoryHandle` and `WritableFileHandle` types in the scaffolder
plugin with the standard `FileSystemDirectoryHandle` and
`FileSystemFileHandle` DOM types. Add type guard functions for
`FileSystemHandle` since it is not a discriminated union.

Signed-off-by: Jon Koops <jonkoops@gmail.com>
2026-03-26 16:23:46 +01:00
Charles de Dreuille 73cdfb0e8e Merge pull request #33112 from AmbrishRamachandiran/range-slider-component
BUI - Add new range slider component
2026-03-26 14:37:00 +00:00
Johan Persson 87eb31c141 fix(org): prevent profile card content overflow on narrow screens
Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-03-26 14:49:13 +01:00
Johan Persson eba2f615b6 fix(catalog-react): prevent EntityInfoCard header overflow on narrow screens
Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-03-26 14:49:13 +01:00
Johan Persson 5081bcc4fa fix(ui): prevent Avatar from shrinking in flex layouts
Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-03-26 14:49:13 +01:00
Jon Koops df43b0e149 fix(eslint-plugin): fix TypeScript 6.0 type errors in no-mixed-plugin-imports
TypeScript 6.0 no longer applies bivariant checking to method-shorthand
functions that don't reference `this`. This causes the `fix` callbacks in
suggestion descriptors to fail type checking when they return `void`
instead of a valid `Fix | null` value.

- Return `null` from non-fixable suggestion `fix` handlers
- Add explicit `SuggestionReportDescriptor[]` type annotation to `suggest`
- Remove redundant `@param` JSDoc annotations now covered by the array type

Signed-off-by: Jon Koops <jonkoops@gmail.com>
2026-03-26 12:31:11 +01:00
Johan Persson 9ff7b4d56b docs: fix component name casing in changeset README examples
Component names in the "Affected components" examples should use
PascalCase (Button, Card, Table) to match actual component names.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-03-26 10:14:46 +01:00
Marat Dyatko 5f9a531412 Replace deprecated humanizeEntityRef with Catalog Presentation API
Migrate all humanizeEntityRef and humanizeEntity usages to the Catalog
Presentation API across catalog, catalog-react, org-react,
catalog-import, scaffolder, and techdocs plugins.

- Use useEntityPresentation hook in React component contexts
  (AncestryPage)
- Use defaultEntityPresentation for non-React contexts like sort
  comparators, filter functions, and data mappers
- Add @deprecated tags to humanizeEntityRef and humanizeEntity
- Improve TSDoc on entityPresentationApiRef, EntityPresentationApi,
  useEntityPresentation, EntityDisplayName, and
  defaultEntityPresentation with guidance on which to use when
- Add Entity Presentation docs page with usage examples and migration
  guide

Made-with: Cursor

Signed-off-by: Marat Dyatko <maratd@spotify.com>
2026-03-26 08:59:43 +01:00
Patrik Oldsberg d156cf48bb plugins: add title, icon, and NFS page variants to migrated plugins
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-25 17:05:23 +01:00
Patrik Oldsberg fa0593e6e5 plugin-catalog-import: add NFS page layout and plugin metadata
- Register title and icon on the new-frontend createFrontendPlugin export.
- Add NfsDefaultImportPage using @backstage/ui Header with shared grid body.
- Point the alpha PageBlueprint loader at the NFS variant.
- Depend on @backstage/ui and @remixicon/react.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-25 16:58:21 +01:00
Patrik Oldsberg 0e147e8e45 plugin-catalog-graph: nfs page variant and plugin title/icon
- Add title, icon, and NfsCatalogGraphPage to the new frontend plugin alpha entry
- Refactor catalog graph page with headerVariant for legacy vs Backstage UI header
- Export NfsCatalogGraphPage from the CatalogGraphPage module

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-25 16:58:21 +01:00
Stephanie Cao 309b7128c4 feat(scaffolder): create scaffolder mcp action to execute a template (#33124)
* create mcp action to execute a template

Signed-off-by: Stephanie <yangcao@redhat.com>

* include changeset

Signed-off-by: Stephanie <yangcao@redhat.com>

* address test errors and review comments from copilot

Signed-off-by: Stephanie <yangcao@redhat.com>

* address review comments

Signed-off-by: Stephanie <yangcao@redhat.com>

* add execute-template to mcp actions list

Signed-off-by: Stephanie <yangcao@redhat.com>

* fix: address review feedback for execute-template action

Signed-off-by: benjdlambert <ben@blam.sh>

---------

Signed-off-by: Stephanie <yangcao@redhat.com>
Signed-off-by: benjdlambert <ben@blam.sh>
Co-authored-by: benjdlambert <ben@blam.sh>
2026-03-25 16:30:49 +01:00
Jonathan Roebuck d0f055f949 feat(ui): add showPaginationLabel prop to TablePagination (#33552)
* feat(ui): add showPaginationLabel to type definitions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>

* feat(ui): wire showPaginationLabel through useTable and Table

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>

* feat(ui): conditionally render pagination label based on showPaginationLabel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>

* chore(ui): add changeset and update API reports for showPaginationLabel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>

* Update .changeset/show-pagination-label.md

Co-authored-by: Johan Persson <johanopersson@gmail.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>

* docs(ui): document showPaginationLabel prop in docs-ui

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>

* fix(ui): wrap component names in backticks in changeset

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>

* fix(ui): move pagination display options to inner useMemo dependency array

Move showPageSizeOptions, getLabel, and showPaginationLabel from the
outer useMemo dependency array to the inner pagination useMemo
dependency array so that changes to these options correctly trigger
a new pagination object reference.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>

* chore(ui): remove backticks from changeset

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* Revert "chore(ui): remove backticks from changeset"

This reverts commit 9b7f8bb6e83c28587219b7734676b1c062661a8a.

Signed-off-by: Johan Persson <johanopersson@gmail.com>

---------

Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
Signed-off-by: Johan Persson <johanopersson@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Johan Persson <johanopersson@gmail.com>
2026-03-25 09:21:55 +00:00
Fredrik Adelöw ddc5247f67 fix(frontend-plugin-api): fix FlattenedMessages type depth for TypeScript 6
Restructure the FlattenedMessages conditional type to check
`TMessages[TKey] extends string` directly instead of using an
intermediate `infer TValue` pattern, which caused excessive type
instantiation depth in TypeScript 6.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-03-24 22:30:56 +01:00
Ben Lambert 4559806b96 feat(actionsRegistry): Adding support for examples (#33551)
* feat(backend-plugin-api): add typed examples to actions registry

Signed-off-by: benjdlambert <ben@blam.sh>

* fix: address review feedback for actions registry examples

Signed-off-by: benjdlambert <ben@blam.sh>

* fix: remove empty examples from scaffolder action bridge

Signed-off-by: benjdlambert <ben@blam.sh>

* chore: add changeset for scaffolder-backend

Signed-off-by: benjdlambert <ben@blam.sh>

* fix: update router test to match removed examples field

Signed-off-by: benjdlambert <ben@blam.sh>

---------

Signed-off-by: benjdlambert <ben@blam.sh>
2026-03-24 18:16:23 +01:00
github-actions[bot] c1b510cabb Version Packages (next) 2026-03-24 14:54:00 +00:00
Patrik Oldsberg 77ab7d570e core-compat-api: hide page header for compat-wrapped legacy pages
Legacy plugins already render their own headers, so the additional
PageLayout header from the PageBlueprint results in duplicate headers.
Pass noHeader: true in both convertLegacyPageExtension and
collectLegacyRoutes to suppress the outer header.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-24 06:57:41 -07:00
Fredrik Adelöw 94a4037fcc Merge pull request #33481 from walsm232/fix/catalog-refresh-state-deadlock
fix(catalog): Fix catalog refresh_state deadlock when running multiple replicas
2026-03-24 14:21:18 +01:00
Fredrik Adelöw 7fc0daebd7 Merge pull request #33388 from Deepesh123455/fix/oauth-dom-nesting-warning
fix(core-components): resolve DOM nesting warning in OAuthRequestDialog
2026-03-24 14:20:08 +01:00
Johan Persson 3d67aebd35 fix(ui): add prefers-reduced-motion support to Tab indicators
Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-03-24 09:32:54 +01:00
Johan Persson 8659f3331c feat(ui): replace Header tabs with nav-based grouped navigation
Replace the RA Tabs/TabList/Tab rendering in the Header component
with a nav-based approach that supports grouped dropdown items via
BUI Menu. Active state is consumer-controlled via a new activeTabId
prop. The indicator system follows the TabsIndicators CSS custom
property pattern for animated active/hover/focus states.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-03-24 09:32:54 +01:00
Kurt King 961e274548 refactor: use MetricsService
Signed-off-by: Kurt King <kurtaking@gmail.com>
2026-03-23 23:37:58 -06:00