74233 Commits

Author SHA1 Message Date
Ben Lambert c705d44e4b feat(cli-module-actions): improve CLI formatting, help output, and UX (#33517)
* fix(cli-module-actions): show schema flags in execute --help

When an action ID is provided with --help, fetch the action schema and
display action-specific flags. Falls back to generic help if auth fails.

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

* fix(cli-module-actions): show schema flags in execute --help and fix build errors (#33518)

* feat(cli-module-actions): improve CLI output formatting and UX

- Pretty grouped list output with colored headers and action titles
- Custom help rendering for execute --help with markdown descriptions
- Support complex schema types (object, array, union) as JSON flags
- Show server error details instead of generic status codes
- Accept multiple plugin IDs in sources add/remove

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

* fix(cli-module-auth): preserve instance metadata on re-login

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

* fix: address code review feedback

- Extract triplicated cli() config into showGenericHelp helper
- Strip ANSI escape sequences before rendering server markdown
- Configure marked-terminal extension once via lazy singleton
- Parallelize listGrouped HTTP requests with Promise.all
- Log actual error message in execute help catch block
- Fix marked version in declarations.d.ts comment
- Add tests for sourcesAdd/sourcesRemove batch operations
- Add test for execute JSON parse error path
- Add tests for login metadata preservation on re-auth

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

* fix: use RegExp constructor to satisfy no-control-regex lint rule

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

* fix: improve ANSI stripping, default info.usage, add renderMarkdown comment

- Extend stripAnsiEscapes to cover OSC, DCS, APC, PM sequences
- Default info.usage to avoid undefined in help output
- Document why marked.use() is called per invocation

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

* fix: use strip-ansi, fresh Marked instance, add allOf support

- Replace hand-rolled ANSI stripping with strip-ansi package
- Use fresh Marked instance per call instead of mutating global singleton
- Add allOf to complex type detection alongside anyOf/oneOf
- Add happy-path test for valid JSON complex flag parsing
- Bump changeset to minor for new user-facing capabilities

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

* refactor: collapse listGrouped into list on ActionsClient

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

* refactor: clean up cli-module-actions structure

- Extract shared pluginSourcesSchema into lib/pluginSources.ts
- Merge schemaToFlags and getComplexKeys into single return value
- Move CleyeFlag-to-FlagInfo conversion into format.ts
- Extract parseArgs and showActionHelp from execute command body

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

---------

Signed-off-by: benjdlambert <ben@blam.sh>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
2026-04-09 13:53:44 +02:00
Claire Peng ee0c95d971 Merge pull request #33820 from backstage/clairep/update_docs_openAPI
Clairep/update docs open api
2026-04-09 12:11:56 +01:00
Claire Peng 5185e919cf delete trailing whitespace
Signed-off-by: Claire Peng <clairep@spotify.com>
2026-04-09 11:42:10 +01:00
Roland Fuszenecker 9a60dcd9fc chore: deduplicate yarn.lock
Signed-off-by: Roland Fuszenecker <roland.fuszenecker@seon.io>
2026-04-09 12:07:32 +02:00
Claire Peng da17844798 add changeset for docs updates
Signed-off-by: Claire Peng <clairep@spotify.com>
2026-04-09 10:57:56 +01:00
Claire Peng f713b2459b add note about API Base URL in api-docs plugin Readme
Signed-off-by: Claire Peng <clairep@spotify.com>
2026-04-09 10:57:56 +01:00
Claire Peng d4979b5178 add note about API Base URL in descriptor-format docs page
Signed-off-by: Claire Peng <clairep@spotify.com>
2026-04-09 10:57:56 +01:00
Fredrik Adelöw 36be7c9bd5 Merge pull request #33818 from backstage/maratd/remove-humanize-entity-ref-org
fix(org): replace deprecated humanizeEntityRef with Catalog Presentation API
2026-04-09 11:39:37 +02:00
Johan Persson 17eb8e03e0 fix(ui): wire up aria-describedby for form field descriptions
Form field descriptions were visually rendered but not connected
to inputs via aria-describedby, making them invisible to screen
readers.

Added a descriptionSlot prop to FieldLabel that renders the
description as a React Aria <Text slot="description"> element,
letting React Aria automatically wire up aria-describedby on
the associated input.

Applied to TextField, PasswordField, SearchField, Select,
RadioGroup, and CheckboxGroup. Slider already handled this
manually and is unchanged.

Also added a missing WithDescription story for RadioGroup.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-09 11:05:11 +02:00
Marat Dyatko f1f59b13e1 fix(org): replace deprecated humanizeEntityRef with Catalog Presentation API
Replace `humanizeEntityRef(parseEntityRef(owner), { defaultKind: 'group' })`
with `entityPresentationSnapshot(ref, { defaultKind: 'group' }).primaryTitle`
in the OwnershipCard's `useGetEntities` hook. This was the last remaining
usage of the deprecated function in the codebase.

Signed-off-by: Marat Dyatko <maratd@spotify.com>
Made-with: Cursor
Signed-off-by: Marat Dyatko <maratd@spotify.com>
Made-with: Cursor
Signed-off-by: Marat Dyatko <maratd@spotify.com>
Made-with: Cursor
2026-04-09 10:45:22 +02:00
Fredrik Adelöw 7308885094 Fix MySQL existence check and add router/store tests
- MySQL UPDATE returns 0 affected rows when values are unchanged, so
  detect existence via SELECT within the transaction instead.
- Add integration tests for PUT /locations/:id in createRouter.test.ts.
- Add changeset for catalog-react catalogApiMock update.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-09 10:28:42 +02:00
Marat Dyatko 09e17c8a65 test(org): add queryParams coverage for OwnershipCard useGetEntities
The existing tests never exercised `getQueryParams` because the mock
catalog API always returned empty items. These new tests verify that the
generated query parameters include correctly humanized owner entity refs,
handle multiple owners, and group entities by kind and type.

Made-with: Cursor
Signed-off-by: Marat Dyatko <maratd@spotify.com>
Made-with: Cursor
2026-04-09 10:25:33 +02:00
Fredrik Adelöw 0dc2cf7e43 Merge pull request #33815 from suhr25/fix/scaffolder-after-zero-query-param
fix: correctly handle after=0 in task events endpoint
2026-04-09 09:45:29 +02:00
Johan Persson 2840476b04 feat(ui): resolve route-relative hrefs by default in useDefinition
Made href resolution always-on in useDefinition instead of requiring
each component to opt in via resolveHref: true. The hook now always
calls useInRouterContext/useHref and only applies the resolved value
when an href prop is actually provided, preventing href from leaking
into components that don't accept it.

Removed the resolveHref field from ComponentConfig, the
ResolveHrefConstraint type, and resolveHref: true from all 14
component definitions. Also removed a now-unnecessary type cast
in the Text component.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-09 09:38:34 +02:00
Fredrik Adelöw aba2f0a980 Merge pull request #33386 from mvanhorn/feat/catalog-graph-presentation-api
feat(catalog-graph): use Catalog Presentation API instead of humanizeEntityRef
2026-04-09 09:16:51 +02:00
Suhrid Marwah 1d95cd302d test(scaffolder): add test for after=0 query param handling
Signed-off-by: Suhrid Marwah <suhridmarwah07@gmail.com>
2026-04-09 10:54:11 +05:30
suhr25 4ec08648d7 Merge branch 'master' of https://github.com/backstage/backstage into fix/scaffolder-after-zero-query-param 2026-04-09 10:50:16 +05:30
Suhrid Marwah 8a42f77daa chore(changeset): add changeset for after=0 fix
Signed-off-by: Suhrid Marwah <suhridmarwah07@gmail.com>
2026-04-09 10:50:00 +05:30
Suhrid Marwah 6408e4aa8a fix(scaffolder): handle after=0 in task events polling endpoint
Signed-off-by: Suhrid Marwah <suhridmarwah07@gmail.com>
2026-04-09 10:27:15 +05:30
Fredrik Adelöw 48b3883497 Merge pull request #33814 from backstage/dependabot/npm_and_yarn/fast-xml-parser-4.5.6 2026-04-09 06:26:59 +02:00
dependabot[bot] 2fdf902bc6 chore(deps): bump fast-xml-parser from 4.5.4 to 4.5.6
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 4.5.4 to 4.5.6.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.5.4...v4.5.6)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-version: 4.5.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-09 02:30:02 +00:00
aramissennyeydd 10cb26a7bd use a set instead and clear the set
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
2026-04-08 21:06:47 -04:00
backstage-goalie[bot] 3848c82f64 Merge pull request #33813 from backstage/renovate/npm-nodemailer-vulnerability
chore(deps): update dependency nodemailer to v8.0.5 [security]
2026-04-08 23:54:11 +00:00
Patrik Oldsberg 814f61a526 Merge pull request #33767 from EoinTrial/docs/i18n-available-languages
docs: document availableLanguages and defaultLanguage for i18n in new frontend system
2026-04-09 01:30:41 +02:00
renovate[bot] 7f8cf514a2 chore(deps): update dependency nodemailer to v8.0.5 [security]
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-08 23:16:35 +00:00
Patrik Oldsberg 178f58687d Merge pull request #33802 from davidfestal/fix-bundle-cli-error-in-ci
fix(cli-module-build): ignore MF version warning for secondary entry points
2026-04-09 01:08:23 +02:00
Matt Van Horn 8a49e11936 refactor(catalog-graph): migrate to entityPresentationSnapshot helper
Replace direct entityPresentationApiRef usage with the new
entityPresentationSnapshot helper from #33576. This fixes the type
safety concern where CompoundEntityRef was passed to forEntity()
which only accepts Entity | string.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
2026-04-08 10:55:30 -07:00
Patrik Oldsberg 9a9a2fe92a Merge pull request #33807 from backstage/rugvip/fix-embedded-db-pid-file-timing
Fix embedded-postgres PID file written before initialization
2026-04-08 19:16:19 +02:00
Andre Wanlin 6c6fbe207a Update docs/features/techdocs/troubleshooting.md
Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com>
2026-04-08 11:56:08 -05:00
meleu 7da6368a72 Fix TechDocs CLI link
Updated TechDocs CLI link to point to the correct repository, as the old one is now archived.

Signed-off-by: meleu <meleu@users.noreply.github.com>
2026-04-08 13:04:04 -03:00
Patrik Oldsberg f1b493f6bd Fix embedded-postgres PID file written before initialization
The PID file was written to the database directory before
`pg.initialise()`, which prevented initialization from succeeding.
Moved the PID file write to just after initialization but before
starting the database.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-08 17:04:36 +02:00
David Festal f52a296a53 fix(cli-module-build): ignore MF version warning for secondary entry points
Signed-off-by: David Festal <dfestal@redhat.com>
2026-04-08 14:01:43 +02:00
Patrik Oldsberg 5b1ba4ee3e Merge pull request #33718 from UsainBloot/auth0-cache-profile
auth0: cache profile API responses during token refresh
2026-04-08 11:39:21 +02:00
Jonathan Roebuck f73876a472 feat(ui): export TableBodySkeleton as public API (#33731)
* feat(ui): export TableBodySkeleton as public API

Export the TableBodySkeleton component so it can be used independently
of the built-in Table component. Relax the column type constraint from
ColumnConfig<T> to { id: string } for compatibility with custom column
types.

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

* fix(ui): use direct index instead of parsing skeleton item ID

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

* Update .changeset/export-table-body-skeleton.md

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

* docs(ui): add TableBodySkeleton to table primitives documentation

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

---------

Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Johan Persson <johanopersson@gmail.com>
2026-04-08 11:21:17 +02:00
Patrik Oldsberg 7169cd543c exploration: Standard Schema utility for zod version decoupling
Adds a mock/exploration file showing what a central Standard-Schema-based
utility could look like for decoupling the exact zod version from the
public API surface of extension config schemas.

This is not wired into anything — just saving progress on the design
exploration for per-field validation, JSON Schema generation, and
schema merging across different sources (blueprint + override) that
may use different schema libraries or zod versions.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-08 11:18:58 +02:00
Aditya Kumar 79d88e534e Making suggested changes
Signed-off-by: Aditya Kumar <aditya.kumar60@infosys.com>
2026-04-08 09:15:21 +05:30
backstage-goalie[bot] 1e97694b15 Merge pull request #33795 from backstage/renovate/minimatch-10.x-lockfile
chore(deps): update dependency minimatch to v10.2.5
2026-04-08 02:34:34 +00:00
renovate[bot] 495e73b902 chore(deps): update dependency minimatch to v10.2.5
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-08 01:03:04 +00:00
dependabot[bot] a2cef3080a chore(deps): bump @hono/node-server from 1.19.10 to 1.19.13
Bumps [@hono/node-server](https://github.com/honojs/node-server) from 1.19.10 to 1.19.13.
- [Release notes](https://github.com/honojs/node-server/releases)
- [Commits](https://github.com/honojs/node-server/compare/v1.19.10...v1.19.13)

---
updated-dependencies:
- dependency-name: "@hono/node-server"
  dependency-version: 1.19.13
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-08 01:01:33 +00:00
backstage-goalie[bot] 23b65ec7dd Merge pull request #33791 from backstage/renovate/express-rate-limit-8.x-lockfile
chore(deps): update dependency express-rate-limit to v8.3.2
2026-04-08 00:56:24 +00:00
renovate[bot] 7162f2aa93 chore(deps): update dependency express-rate-limit to v8.3.2
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-08 00:12:13 +00:00
backstage-goalie[bot] 7895eed228 Merge pull request #33781 from backstage/renovate/esbuild-loader-4.x-lockfile
chore(deps): update dependency esbuild-loader to v4.4.3
2026-04-08 00:06:35 +00:00
Patrik Oldsberg 1e8899a65f Merge pull request #33705 from schultzp2020/remove-jsx-codemod-guide
docs: replace JSX codemod tutorial with link to codemod.com
2026-04-07 20:33:47 +02:00
Patrik Oldsberg ffdbf66edb Merge pull request #33711 from backstage/changeset-release/master
Version Packages (next)
2026-04-07 18:23:35 +02:00
github-actions[bot] 6c10d88c13 Version Packages (next) 2026-04-07 15:30:58 +00:00
Johan Persson b4a187502b feat(ui): add automatic active tab detection to Header (#33783)
* feat(ui): widen activeTabId type to accept null

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

* feat(ui): add automatic active tab detection to HeaderNav

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

* feat(ui): update Header stories to demonstrate auto-detection and explicit activeTabId

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

* refactor(ui): remove manual useActiveTabId from PluginHeaderAndHeader recipe

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

* docs(ui): update Header docs for activeTabId auto-detection

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

* chore(ui): add API report and changeset for activeTabId auto-detection

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

* fix(ui): resolve relative hrefs in HeaderNav tabs

Add resolveHref to HeaderNavItemDefinition so tab links with relative
hrefs are resolved against the router context before rendering.

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

* chore(ui): add breaking change changeset for HeaderNav resolveHref

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

---------

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-07 17:22:01 +02:00
Johan Persson fa232da324 refactor(catalog-react): migrate InspectEntityDialog from MUI to BUI
Replace Material UI components with Backstage UI (BUI) equivalents
across the InspectEntityDialog and all its tab pages (Overview,
Ancestry, Colocated, JSON, YAML).

- Dialog shell uses BUI Dialog, DialogHeader, DialogBody, Tabs
- Horizontal tab bar replaces vertical MUI tabs
- Card sections use BUI Card, CardHeader, CardBody
- Key-value pairs rendered as semantic dl/dt/dd elements
- Copy buttons use BUI ButtonIcon with remixicon icons
- Help links use BUI ButtonLink
- Alerts use BUI Alert
- Tags use BUI TagGroup/Tag
- Accessible live region for copy confirmation
- Proper heading hierarchy (h2 for tab pages, h3 for cards, h4 for sections)
- Added OverviewPage tests for identity rendering, link detection, and tags

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-07 17:20:34 +02:00
Fredrik Adelöw a102296f7f Fix CatalogClient test assertion to include entityRef in location objects
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-07 17:16:29 +02:00
Fredrik Adelöw 8be34b3e13 Simplify updateLocation: single UPDATE RETURNING + add tests
Use UPDATE...RETURNING for Postgres/SQLite and UPDATE+count-check+SELECT
(in a transaction) for MySQL. Removes the old read-before-write approach.
Also adds test coverage for updateLocation across all database engines.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-07 16:59:23 +02:00
Matt Van Horn 416ad45fdd feat(catalog-graph): use Catalog Presentation API instead of humanizeEntityRef
Replace humanizeEntityRef with entityPresentationApiRef in CatalogGraphCard
and CatalogGraphPage for consistent entity display via the Catalog
Presentation API. Contributes to #20955.

Signed-off-by: Matt Van Horn <matt@osc.dev>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
2026-04-07 07:40:43 -07:00