Increase the specificity of Header breadcrumb styles so that Link defaults do not override contextual typography when stylesheets are loaded in a different order.
Add a patch changeset for @backstage/ui.
Signed-off-by: Johan Persson <johanopersson@gmail.com>
DatabaseEventBusStore: 500ms → 2000ms for the performance threshold
when cleaning 100k rows — this is intentionally a perf test so a real
time assertion is correct, it just needs more headroom for CI.
DatabaseKeyStore: replace fixed 500ms sleep with waitForExpect polling
so the test adapts to however long the async deletion actually takes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Switch the dockerized MySQL container to mysql_native_password (single
challenge-response) instead of the default caching_sha2_password
(extra RSA key exchange round-trip on non-TLS connections). Also
disable binary logging since tests don't need replication. Both
reduce per-connection overhead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
The mysql2 driver defaults to a 10-second connect timeout, which is
too short when many test suites share a single MySQL container under
CI load. Increase the connect timeout to 30 seconds and add pool
acquire/create timeouts of 30 seconds to reduce flaky ETIMEDOUT
failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
PR #33936 removed duplicate dependency entries, but in two cases moved
deps from dependencies to devDependencies that are still re-exported in
the published API reports:
- @backstage/catalog-client: @backstage/plugin-catalog-common
(AnalyzeLocationRequest/AnalyzeLocationResponse types)
- @backstage/frontend-plugin-api: @backstage/config (Config type)
These need to be runtime dependencies so consumers can resolve the
types at build time.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Add full shift mapping (old --bui-bg-neutral-1..4 → new --bui-bg-neutral-2..5)
to the changeset, ESLint rule docs, and PR description so adopters
understand the complete renaming of the neutral background scale.
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
Replace --bui-surface-1..5 with --bui-bg-neutral-1..5 for both light
and dark themes. --bui-bg-neutral-1 replaces the deprecated --bui-bg-app,
and --bui-bg-neutral-2..5 extend the scale. The old bare --bui-bg-neutral-1..4
entries are removed from the deprecated section since their names are now
reused; the hover/pressed/disabled variants remain deprecated.
Updates colors.stories.tsx, the ESLint rule and tests, and all migration
documentation and the PR description accordingly.
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
Group migrations by family (Surfaces, Foreground, Accent, Positive,
Negative, Warning, Announcement) and correct the surface token mappings
to match the full --bui-surface-1 through --bui-surface-5 scale.
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
- Add patch changeset for @backstage/ui (new semantic color token families)
- Add patch changeset for @backstage/eslint-plugin (no-deprecated-bui-tokens rule)
- Remove redundant wrapper div in the Colors story and drop minHeight
that was preventing scroll in the Storybook canvas
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
The field was accidentally kept from master during the rebase
conflict resolution but doesn't belong in this PR's version of
the file.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
The Azure SDK monorepo upgrade (storage-blob 12.26→12.31, identity
4.5→4.9) adds "type": "module" to package.json, making jest.mock()
unable to intercept imports from production code.
- AzureBlobStorageUrlReader: accept createContainerClient as an
optional dependency, letting tests pass a mock directly instead
of trying to mock the @azure/storage-blob module
- AzureUrlReader: provide PAT credentials in all test cases so
DefaultAzureCredential is never instantiated — the Bearer auth
flow is already covered by the integration package's own tests
- DefaultAzureDevOpsCredentialsProvider: use expect.any() for
mock instance comparison instead of new DefaultAzureCredential()
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Adds the missing documentation page at the URL referenced in the rule
meta, consistent with all other rules in the plugin. Includes incorrect/
correct code examples and a migration table mapping each deprecated token
to its semantic replacement.
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
Redesigns the BUI color token system in `@backstage/ui`:
- Adds a gray scale (`--bui-gray-1` through `--bui-gray-11`)
- Adds new foreground tokens with explicit hex values (primary, secondary, disabled, positive, negative, warning, announcement)
- Introduces five new semantic color families — Accent, Announcement, Warning, Negative, Positive — each with bg-base, bg-subdued, border, fg-on-base, and fg-on-subdued variants, for both light and dark themes
- Moves all legacy tokens (`--bui-bg-solid-*`, `--bui-bg-neutral-*`, `--bui-bg-danger/warning/success/info`, `--bui-fg-solid`, `--bui-fg-danger/success/info`, `--bui-border-*`, `--bui-shadow`) into a clearly marked `/* Deprecated tokens */` section in both light and dark themes
- Updates the Spotify theme overrides to use the new accent tokens and mark legacy overrides as deprecated
- Rewrites the `Colors` Storybook story to display all token families as a live, theme-aware reference grid
- Adds a new `@backstage/no-deprecated-bui-tokens` ESLint rule to `@backstage/eslint-plugin` that warns when any deprecated BUI token is referenced in JS/TS string literals; the rule is included in the `recommended` config so it applies to all plugin authors automatically
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
Since protobufjs 7.5.9, the @protobufjs/inquire utility is no longer
called with dynamic module names (replaced by bundler-safe lookups in
protobufjs/protobuf.js#2254). However, webpack/rspack still statically
analyzes the inquire source and emits a "Critical dependency" warning
for its require(moduleName) pattern. This is a false positive — the
code path is dead in practice.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Don't auto-default initialRouteEntries from mountPath — for
parameterized paths this silently produces wrong params (literal
':name' values). Require callers to set both explicitly.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
The proxy-based sign-in page derived the session expiry from the JWT by
decoding its payload with `window.atob`, which only accepts the standard
base64 alphabet. JWTs are encoded using base64url (RFC 7515), so any
token whose payload contained '-' or '_' raised a decoding error and
broke sign-in. Translate the payload back to the standard alphabet and
restore its padding before decoding.
Signed-off-by: Asish Kumar <officialasishkumar@gmail.com>
The built-in rate limiter derived its key directly from `req.ip`, which
express-rate-limit 8.x rejects with an ERR_ERL_KEY_GEN_IPV6 validation
error. A raw IPv6 address used as a rate limiting key would let a client
bypass the limit by rotating through addresses in its allotted block, so
the library now requires its `ipKeyGenerator` helper to normalize the
address. Wrap the resolved client address in that helper so the limiter
starts cleanly and groups IPv6 clients by their address block.
Signed-off-by: Asish Kumar <officialasishkumar@gmail.com>
Layer the remaining concepts from the original PR on top of the
split-query foundation:
- totalItems parameter on REST API (GET and POST) and CatalogApi
- TotalItemsMode type replacing internal skipTotalItems boolean
- Sort field key lowercasing for search table comparison
- whereNotNull(search.value) on the list CTE to exclude truncated values
- Simplified ORDER BY (NULLS LAST removed since NULL values are
already excluded by whereNotNull)
- New tests for NULL sort field values and multi-valued sort field
totalItems accuracy
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
- Remove the path="*" fallback Route so mismatches between mountPath
and initialRouteEntries surface as test failures instead of silently
rendering without params
- Handle mountPath values that already end with /* to avoid double splat
- Extract repeated entity path string into a shared constant
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Address review feedback: mountedRoutes are for abstract route targets
the test subject links to, not for the subject itself. Add a dedicated
mountPath option that wraps the test element in a single Route with
the given path pattern, enabling useParams(). When mountPath is set
and initialRouteEntries is not, the initial entry defaults to mountPath.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>