Commit Graph

27354 Commits

Author SHA1 Message Date
Charles de Dreuille 030fb311aa Merge pull request #33997 from backstage/charlesdedreuille/act-355-header-improvements
feat(ui): add description, tags, and metadata props to Header
2026-04-24 13:59:56 +01:00
Asish Kumar b15ef55be1 devtools: refresh scheduled tasks after trigger or cancel
Closes #32861

Triggering or cancelling a scheduled task from the DevTools Scheduled
Tasks page previously left the table showing the pre-action state, so
users had to refresh the browser (which also reset the plugin selector)
to see the new status.

Switch `useScheduledTasks` to `useAsyncRetry` so it exposes a `refresh`
function, and call it after each trigger/cancel action in
`ScheduledTasksContent`. The refresh happens in a `finally` block so the
table also updates when the action itself fails, reflecting whatever the
backend ended up recording.

Signed-off-by: Asish Kumar <officialasishkumar@gmail.com>
2026-04-24 02:47:49 +05:30
Marat Dyatko 6b171fa5f1 Merge pull request #34041 from dyatko/fix/self-package-imports
Fix circular self-imports and add no-self-package-imports lint rule
2026-04-23 20:28:26 +02:00
Patrik Oldsberg f635139ebc Limit @remixicon/react to versions below 4.9.0
The license changed in 4.9.0, so we need to cap the allowed version
range across all packages that depend on it.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-23 16:42:38 +02:00
Marat Dyatko ab1cdbb9db Fix circular self-imports and add no-self-package-imports lint rule
- Fixes the `Cannot access '_AppRootElementBlueprintesm' before
  initialization` crash in `@backstage/frontend-plugin-api` caused by a
  self-referential import in the packaged ESM.
- Cleans up similar self-imports in `@backstage/catalog-model`,
  `@backstage/core-plugin-api`, `@backstage/plugin-catalog-node`,
  `@backstage/plugin-kubernetes-common`, and
  `@backstage/plugin-kubernetes-node`. Value imports switch to relative
  paths; type-only imports use `import type` so they're erased at
  runtime.
- Adds a new `@backstage/no-self-package-imports` ESLint rule. It reads
  each package's `exports` map, traverses the relative import graph from
  every entry's source file, and only reports imports where the current
  file is in the same bundle as the target entry (same-entry). Files
  that aren't reachable from any entry (tests, scripts, orphans) are
  skipped. `import type`, `package.json` imports, and cross-entry
  self-imports are allowed by default; cross-entry can be opted into
  with `allowCrossEntry: false`.

Signed-off-by: Marat Dyatko <maratd@spotify.com>
Made-with: Cursor
2026-04-23 14:43:01 +02:00
Fredrik Adelöw e9b78e9698 Remove uuid dependency in favor of crypto.randomUUID()
The uuid package dropped its CommonJS entry point in v14, making it
incompatible with Backstage's CJS build output and Jest test runner.
Rather than working around the ESM-only issue, replace all usage with
the built-in crypto.randomUUID() which has been available in Node.js
since v16.7 and in all major browsers since March 2022.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-23 10:51:43 +02:00
Charles de Dreuille 5a7495d072 chore: merge master and resolve package.json conflict
Both @braintree/sanitize-url (this branch) and @internationalized/date
(master) were added to packages/ui dependencies; keeping both.

Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
2026-04-23 08:53:44 +01:00
Fredrik Adelöw f5354dc5ff Merge pull request #34019 from backstage/freben/swappable-notification-description
Make NotificationDescription a swappable component
2026-04-22 10:34:28 +02:00
Fredrik Adelöw 8521de1d46 Merge pull request #33122 from johnmcollier/filterstatustasks
feat(scaffolder): Allow filtering by status in scaffolderService.listTasks
2026-04-22 10:27:36 +02:00
Fredrik Adelöw 94c1cf55c7 Use a type-only import for NotificationDescriptionProps
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-04-21 18:14:54 +02:00
Fredrik Adelöw de9fc68cf1 Document the description prop on NotificationDescription
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-04-21 17:10:29 +02:00
github-actions[bot] 1cc86bee1c Version Packages (next) 2026-04-21 15:07:43 +00:00
Fredrik Adelöw 4f7e5219de Load the default NotificationDescription implementation lazily
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-04-21 16:44:48 +02:00
Fredrik Adelöw 03311e33da Make NotificationDescription a swappable component
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-04-21 16:35:29 +02:00
Fredrik Adelöw e5e7700c7b Merge pull request #34001 from backstage/freben/facets-perf
catalog-backend: fix facets endpoint performance regression
2026-04-21 09:59:56 +02:00
Charles de Dreuille 5de4a10b30 chore: update scaffolder API reports
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
2026-04-20 19:49:05 +01:00
Charles de Dreuille c48da5c93d Merge branch 'master' into charlesdedreuille/act-355-header-improvements 2026-04-20 18:07:12 +01:00
Fredrik Adelöw 0ecb700add Remove NOT IN unstitched guard from facets no-filter path
The NOT IN guard against null final_entity rows was preventing the
query planner from using parallel workers and (with a future covering
index) index-only scans. Without the covering index it caused a 2.6x
regression on the no-filter path (7s -> 18.4s).

The filtered path already excludes unstitched entities via the
whereNotNull('final_entities.final_entity') in the inner
entityIdSubquery, so no guard is needed there.

The no-filter path now matches 1.49.x behavior. A followup migration
adding a covering index can re-introduce the guard efficiently.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 17:31:00 +02:00
Patrik Oldsberg 6316dc66d3 catalog-backend: remove unused AddUnprocessedEntitiesResult type
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-20 16:40:38 +02:00
Fredrik Adelöw f32d334034 Exclude unstitched entities from facets via NOT IN null set
Instead of checking IS NOT NULL against ~520k rows (which adds a
2.6x regression on the no-filter path), exclude the tiny set of
entities where final_entity IS NULL (~3,700 rows). The anti-join
is nearly free and allows the guard to be applied unconditionally,
so facets results consistently exclude not-yet-stitched (or future
tombstoned) entities regardless of whether filters are present.

Also addresses review feedback:
- Add regression test for unstitched entity exclusion
- Extract setupFacetsCatalog helper to reduce test boilerplate
- Tighten assertions: use exact arrays instead of arrayContaining

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 16:14:03 +02:00
Fredrik Adelöw 88409600ba Revert to conditional final_entities constraint for facets
Benchmarking on a production-like database shows that always applying
the final_entities subquery (even without filters) causes a 2.6x
regression on the no-filter path (5.2s -> 13.5s) due to ~530k
memoized index lookups against final_entities. The FK cascade from
search -> final_entities already guarantees search rows only exist
for entities with a final_entities row, so the constraint is only
needed when filters route through final_entities.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 15:46:37 +02:00
Fredrik Adelöw d7c6ad8e14 Remove unnecessary whereNotNull guard from facets subquery
The whereNotNull('final_entities.final_entity') was copied from other
code paths that select the final_entity column, but the facets subquery
only needs entity_id. Removing it preserves exact v1.49 semantics
(search rows only exist for stitched entities anyway, due to the FK
cascade from search -> final_entities) and avoids an inconsistency
where the no-filter path did not exclude unstitched entities while the
with-filter path did.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 14:43:22 +02:00
Fredrik Adelöw 9ae08d07e2 Add thorough facets tests for predicate queries and compound filters
Adds standalone test coverage for the facets method in
DefaultEntitiesCatalog to ensure it works correctly with:
- Predicate query filtering (simple key match)
- Predicate query filtering using $in operator
- Compound allOf filters
- Compound anyOf filters
- Both filter and query combined

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 14:21:57 +02:00
Fredrik Adelöw cf195de72c catalog-backend: fix facets endpoint performance regression
Route the EXISTS-based filters through final_entities (one row per
entity) instead of correlating against the search table directly.
This avoids the pathological case where correlated subqueries scan
the much larger search table for every row in the outer facets query.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 14:02:02 +02:00
Charles de Dreuille c0817115e8 chore: update API reports to match master
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
2026-04-20 10:38:44 +01:00
Fredrik Adelöw 83ac69be86 Fix ListTaskPage test to match simplified OwnerEntityColumn
Update assertions to expect the entity presentation short ref (e.g.
'foo') instead of the old catalog-resolved display name (e.g.
'BackUser'), and remove now-unused entity fixtures and catalog API
mocking.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-18 22:50:30 +02:00
Fredrik Adelöw 8341f98940 Simplify OwnerEntityColumn to use EntityRefLink directly
Remove the catalog API lookup and manual title resolution. The
EntityRefLink already uses the entity presentation API to resolve
display names, so the component only needs the entity ref string.

This removes unused imports of useApi, useAsync, catalogApiRef,
parseEntityRef, and UserEntity.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-18 22:32:54 +02:00
Patrik Oldsberg 64b186f465 Merge pull request #33962 from backstage/rugvip/remove-unused-getgithubintegrationconfig
catalog-import: 🧹
2026-04-17 13:07:27 +02:00
Johan Persson e2d9831352 fix: clamp React Aria dependency ranges to patch-only updates
Changed version ranges for react-aria, react-aria-components, and
react-stately from `^` (minor) to `~` (patch) across all consuming
packages to prevent unintended minor version upgrades.

Also aligned app-visualizer's react-aria-components from 1.14 to 1.17.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-17 11:49:34 +02:00
Patrik Oldsberg d9264ed271 Merge pull request #33952 from backstage/rugvip/zod-v3-config-schema-docs
frontend-plugin-api: clarify that zod v3 does not support configSchema
2026-04-17 10:34:20 +02:00
Patrik Oldsberg 02b72c35b3 catalog-import: remove unused getGithubIntegrationConfig
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-17 00:14:28 +02:00
Patrik Oldsberg ceb4e04ba3 Merge pull request #33721 from aurnik/fix/home-widget-drag-resize
Fix home page widgets not being draggable/resizable after first save
2026-04-16 21:58:59 +02:00
Patrik Oldsberg a6bbb0ae2d Merge pull request #33930 from backstage/remove-portable-schema-deprecated-prop
frontend-plugin-api: remove deprecated PortableSchema .schema property
2026-04-16 21:51:39 +02:00
Patrik Oldsberg 264be8b5c1 Merge pull request #33649 from erikmiller-gusto/feat/slack-scoped-message-updates
feat(notifications-slack): add scope-based message update support
2026-04-16 21:51:23 +02:00
Patrik Oldsberg 8738203119 frontend-plugin-api: remove deprecated PortableSchema .schema property
Remove the deprecated property form of PortableSchema.schema, keeping
only the method form. The schema member is now a plain method that must
be called as schema() rather than accessed as a property.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-16 20:56:02 +02:00
Patrik Oldsberg 085133fde0 Bump zod dependency to v4 for packages using configSchema
These packages use `configSchema` with `zod/v4` imports and require the
full Zod v4 package for JSON Schema support. The dependency range is
narrowed from `^3.25.76 || ^4.0.0` to `^4.0.0`.

Also adds a `.patches` entry for the patch release.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-16 18:44:51 +02:00
Fredrik Adelöw 7b4ea63b38 Merge pull request #33945 from backstage/freben/add-missing-deps
chore: add missing transitive dependencies
2026-04-16 16:54:33 +02:00
Fredrik Adelöw db03264327 Revert "chore: unpin @rjsf/utils version ranges"
This reverts commit ad6c40e86a.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 14:18:25 +02:00
Fredrik Adelöw ad6c40e86a chore: unpin @rjsf/utils version ranges
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 14:17:17 +02:00
Johan Persson 8d1e093ae8 feat(techdocs): make sidebar positioning configurable via CSS custom properties (#33908)
* feat(techdocs): make sidebar positioning configurable via CSS custom properties

Replace hardcoded Backstage app sidebar widths (224px/72px) in the
TechDocs layout CSS with CSS custom properties that inherit through
the shadow DOM boundary, allowing apps with custom sidebar widths
to override the defaults.

- `--techdocs-sidebar-closed-offset-pinned` (default: 224px)
- `--techdocs-sidebar-closed-offset-collapsed` (default: 72px)
- `--techdocs-sidebar-open-translate` (default: 16rem)

Also extract all magic values into named constants.

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

* Add PR #33908 to patch release

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

---------

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-16 08:02:54 -04:00
Fredrik Adelöw 3846774beb chore: add missing transitive dependencies
Add dependencies that were only available transitively through other
packages but were being imported directly:

- csstype and copy-to-clipboard in @backstage/core-components
- @storybook/react-vite in @backstage/ui
- react-aria-components in @backstage/plugin-notifications
- @octokit/core in @backstage/plugin-scaffolder-backend-module-github
- @rjsf/utils in example-app-legacy

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 13:28:21 +02:00
Fredrik Adelöw 8e7f7249e7 chore: regenerate knip reports
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 12:14:47 +02:00
Fredrik Adelöw 0c5e41f984 chore: remove unused dependencies
Remove 30 dependencies across 18 packages that have no imports in
source code and are not peer dependencies of any other dependency.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 11:52:59 +02:00
Fredrik Adelöw f0c27227cf chore: remove duplicate dependencies/devDependencies entries
Several packages had the same dependency listed in both `dependencies`
and `devDependencies`. This removes the duplicate from whichever section
is incorrect based on actual usage in the source code.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 10:22:01 +02:00
Fredrik Adelöw 04dea64eb7 Merge pull request #33897 from backstage/freben/fix-irreversible-migration
fix(catalog-backend): fix irreversible database migration down functions
2026-04-15 17:44:09 +02:00
Patrik Oldsberg 5f1d32b415 Merge pull request #33892 from backstage/rugvip/remove-cached-entity-loader-options-export
techdocs-backend: 🧹
2026-04-15 16:24:53 +02:00
Patrik Oldsberg ba9717cf70 Merge pull request #33913 from drodil/config_schemas
fix: replace old config schemas for extensions and blueprints
2026-04-15 14:21:47 +02:00
Johan Persson d1be10cb89 fix(ui,app): update React Aria to v1.17.0 and migrate to monopackage imports
React Aria Components v1.17.0 consolidated individual packages
into monopackages, dropping `@react-types/table` as a transitive
dependency. This caused `TS2307` errors in new app installations
where `react-aria-components@1.17.0` was resolved.

Migrate all imports from individual `@react-aria/*` and
`@react-stately/*` packages to the `react-aria` and
`react-stately` monopackages in both `@backstage/ui` and
`@backstage/plugin-app`, and update minimum dependency versions
accordingly.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-15 12:21:23 +02:00
Hellgren Heikki cad156e797 fix: replace old config schemas for extensions and blueprints
to overcome a lot of warnings given during for example testing where
these extensions are used.

Signed-off-by: Hellgren Heikki <heikki.hellgren@op.fi>
2026-04-15 12:55:27 +03:00
github-actions[bot] 93e643d142 Version Packages 2026-04-14 14:57:31 +00:00